collection?
count
insert
- find))
+ find
+ $eq
+ $exists
+ $not))
;;; Collection Definition
(apply insert (cons newcol (cdr documents)))
(values rescol (cons docid docids)))))))
-(define (find col filter)
+(define (find col . filter)
"Query the collection and return the documents that match with filter"
(let ((table (get-table col)))
(vhash-fold
#t)
(else
(and
- (equal? (vhash-assoc (caar filter) document) (car filter))
+ ((car filter) document)
(match-document? document (cdr filter))))))
+;;; Queries
+
+(define ($eq field value)
+ (lambda (document)
+ (let ((stored (vhash-assoc field document)))
+ (and stored
+ (equal? (cdr stored) value)))))
+
+
+(define ($exists field)
+ (lambda (document)
+ (and (vhash-assoc field document)
+ #t)))
+
+
+(define ($not expr)
+ (lambda (document)
+ (not (expr document))))
+
+
;;; Tools
(define (vhash->alist vhash)
(test-assert (collection? col))
; Insert
-(set! col (insert col '((a . 1) (b . 2)) '((a . 10) (b . 20)) '((a . 1) (b . "hello world"))))
+(set! col (insert col
+ '((a . 1) (b . 2))
+ '((a . 10) (b . 20))
+ '((a . 1) (c . "hello world"))))
(test-eqv 3 (count col))
; Search
-(test-eqv 2 (length (find col '((a . 1)))))
-(test-eqv 1 (length (find col '((a . 1) (b . 2)))))
-(test-eqv 0 (length (find col '((a . "test")))))
+(test-eqv 3 (length (find col)))
+(test-eqv 2 (length (find col ($eq 'a 1))))
+(test-eqv 1 (length (find col ($eq 'a 1) ($eq 'b 2))))
+(test-eqv 0 (length (find col ($eq 'a "test"))))
+
+(test-eqv 2 (length (find col ($exists 'b))))
+(test-eqv 2 (length (find col ($not ($exists 'c)))))
(test-end "bongodb")