From 07eed7138a1b4aecb9d8ae0926ba22dc82ebe94e Mon Sep 17 00:00:00 2001 From: Javier Sancho Date: Tue, 15 Mar 2016 01:10:40 +0100 Subject: [PATCH] Advanced queries support --- src/bongodb.scm | 29 ++++++++++++++++++++++++++--- tests/sample.scm | 15 +++++++++++---- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/bongodb.scm b/src/bongodb.scm index e4df14b..6fc16fe 100644 --- a/src/bongodb.scm +++ b/src/bongodb.scm @@ -24,7 +24,10 @@ collection? count insert - find)) + find + $eq + $exists + $not)) ;;; Collection Definition @@ -75,7 +78,7 @@ (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 @@ -93,10 +96,30 @@ #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) diff --git a/tests/sample.scm b/tests/sample.scm index 899c6e0..5054ffe 100644 --- a/tests/sample.scm +++ b/tests/sample.scm @@ -25,12 +25,19 @@ (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") -- 2.39.2