1 USING: accessors assocs classes.mixin classes.tuple
2 classes.tuple.parser compiler.units fry kernel sequences mongodb.driver
3 mongodb.msg mongodb.tuple.collection mongodb.tuple.index
4 mongodb.tuple.persistent mongodb.tuple.state strings ;
13 : define-persistent ( class collection options -- )
14 [ [ <mdb-tuple-collection> dupd link-collection ] when* ] dip
15 [ dup '[ _ mdb-persistent add-mixin-instance ] with-compilation-unit ] dip
16 ! [ dup annotate-writers ] dip
19 : ensure-table ( class -- )
22 [ [ tuple-index-list ] keep
23 '[ _ name>> swap [ name>> ] [ spec>> ] bi ensure-index ] each
26 : ensure-tables ( classes -- )
27 [ ensure-table ] each ;
29 : drop-table ( class -- )
31 [ [ tuple-index-list ] keep
32 '[ _ name>> swap name>> drop-index ] each ]
33 [ name>> drop-collection ] bi ;
35 : recreate-table ( class -- )
41 GENERIC: id-selector ( object -- selector )
43 M: string id-selector ( objid -- selector )
44 "_id" H{ } clone [ set-at ] keep ; inline
46 M: mdb-persistent id-selector ( mdb-persistent -- selector )
49 : (save-tuples) ( collection assoc -- )
52 <update> >upsert update ] assoc-each ; inline
55 : save-tuple ( tuple -- )
56 tuple>storable [ (save-tuples) ] assoc-each ;
58 : update-tuple ( tuple -- )
61 : insert-tuple ( tuple -- )
64 : delete-tuple ( tuple -- )
66 [ [ tuple-collection name>> ] keep
67 id-selector delete ] [ drop ] if ;
69 : tuple>query ( tuple -- query )
70 [ tuple-collection name>> ] keep
71 tuple>selector <query> ;
73 : select-tuple ( tuple/query -- tuple/f )
74 dup mdb-query-msg? [ ] [ tuple>query ] if
75 find-one [ assoc>tuple ] [ f ] if* ;
77 : select-tuples ( tuple/query -- cursor tuples/f )
78 dup mdb-query-msg? [ ] [ tuple>query ] if
79 find [ assoc>tuple ] map ;
81 : count-tuples ( tuple/query -- n )
82 dup mdb-query-msg? [ tuple>query ] unless
83 [ collection>> ] [ query>> ] bi count ;