factor/extra/mongodb/tuple/tuple.factor

83 lines
2.2 KiB
Factor
Raw Normal View History

USING: accessors assocs classes.mixin classes.tuple
classes.tuple.parser compiler.units fry kernel sequences mongodb.driver
mongodb.msg mongodb.tuple.collection mongodb.tuple.index
mongodb.tuple.persistent mongodb.tuple.state strings ;
2009-04-04 05:10:13 -04:00
IN: mongodb.tuple
SYNTAX: MDBTUPLE:
parse-tuple-definition
mdb-check-slots
define-tuple-class ;
: define-persistent ( class collection options -- )
[ [ <mdb-tuple-collection> dupd link-collection ] when* ] dip
[ dup '[ _ mdb-persistent add-mixin-instance ] with-compilation-unit ] dip
! [ dup annotate-writers ] dip
set-slot-map ;
2009-04-04 05:10:13 -04:00
: ensure-table ( class -- )
tuple-collection
[ create-collection ]
[ [ tuple-index-list ] keep
2009-05-01 10:13:51 -04:00
'[ _ name>> swap [ name>> ] [ spec>> ] bi <index-spec> ensure-index ] each
2009-04-04 05:10:13 -04:00
] bi ;
: ensure-tables ( classes -- )
[ ensure-table ] each ;
: drop-table ( class -- )
tuple-collection
[ [ tuple-index-list ] keep
'[ _ name>> swap name>> drop-index ] each ]
2009-04-04 05:10:13 -04:00
[ name>> drop-collection ] bi ;
: recreate-table ( class -- )
[ drop-table ]
[ ensure-table ] bi ;
<PRIVATE
GENERIC: id-selector ( object -- selector )
M: string id-selector ( objid -- selector )
2009-04-04 05:10:13 -04:00
"_id" H{ } clone [ set-at ] keep ; inline
2009-04-04 05:10:13 -04:00
M: mdb-persistent id-selector ( mdb-persistent -- selector )
_id>> id-selector ;
2009-04-04 05:10:13 -04:00
: (save-tuples) ( collection assoc -- )
swap '[ [ _ ] 2dip
[ id-selector ] dip
<update> >upsert update ] assoc-each ; inline
2009-04-04 05:10:13 -04:00
PRIVATE>
: save-tuple ( tuple -- )
tuple>storable [ (save-tuples) ] assoc-each ;
2009-04-04 05:10:13 -04:00
: update-tuple ( tuple -- )
save-tuple ;
: insert-tuple ( tuple -- )
save-tuple ;
: delete-tuple ( tuple -- )
dup persistent?
[ [ tuple-collection name>> ] keep
id-selector delete ] [ drop ] if ;
: tuple>query ( tuple -- query )
[ tuple-collection name>> ] keep
tuple>selector <query> ;
: select-tuple ( tuple/query -- tuple/f )
2009-05-01 10:22:48 -04:00
dup mdb-query-msg? [ tuple>query ] unless
2009-04-04 05:10:13 -04:00
find-one [ assoc>tuple ] [ f ] if* ;
: select-tuples ( tuple/query -- cursor tuples/f )
2009-05-01 10:22:48 -04:00
dup mdb-query-msg? [ tuple>query ] unless
2009-04-04 05:10:13 -04:00
find [ assoc>tuple ] map ;
: count-tuples ( tuple/query -- n )
2009-05-01 10:22:48 -04:00
dup mdb-query-msg? [ tuple>query ] unless count ;