Repository: couchdb-mango Updated Branches: refs/heads/master 06cf106dc -> 0dd2000f6
Fix $nin operator This fixes $nin when the field is an array. BugzID:44528 Project: http://git-wip-us.apache.org/repos/asf/couchdb-mango/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-mango/commit/0dd2000f Tree: http://git-wip-us.apache.org/repos/asf/couchdb-mango/tree/0dd2000f Diff: http://git-wip-us.apache.org/repos/asf/couchdb-mango/diff/0dd2000f Branch: refs/heads/master Commit: 0dd2000f666e49204b0429a81f660de237aaeccf Parents: 06cf106 Author: Tony Sun <tony....@cloudant.com> Authored: Wed Oct 7 13:07:58 2015 -0700 Committer: Tony Sun <tony....@cloudant.com> Committed: Wed Oct 7 13:07:58 2015 -0700 ---------------------------------------------------------------------- src/mango_selector.erl | 2 ++ test/03-operator-test.py | 11 +++++++++++ 2 files changed, 13 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/0dd2000f/src/mango_selector.erl ---------------------------------------------------------------------- diff --git a/src/mango_selector.erl b/src/mango_selector.erl index 21c55ae..c6004cd 100644 --- a/src/mango_selector.erl +++ b/src/mango_selector.erl @@ -471,6 +471,8 @@ match({[{<<"$in">>, Args}]}, Value, Cmp) -> Pred = fun(Arg) -> Cmp(Value, Arg) == 0 end, lists:any(Pred, Args); +match({[{<<"$nin">>, Args}]}, Values, Cmp) when is_list(Values)-> + not match({[{<<"$in">>, Args}]}, Values, Cmp); match({[{<<"$nin">>, Args}]}, Value, Cmp) -> Pred = fun(Arg) -> Cmp(Value, Arg) /= 0 end, lists:all(Pred, Args); http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/0dd2000f/test/03-operator-test.py ---------------------------------------------------------------------- diff --git a/test/03-operator-test.py b/test/03-operator-test.py index d8a7c29..50d5bd2 100644 --- a/test/03-operator-test.py +++ b/test/03-operator-test.py @@ -72,6 +72,17 @@ class OperatorTests(mango.UserDocsTests): assert docs[0]["user_id"] == 2 assert docs[1]["user_id"] == 12 + def test_nin_operator_array(self): + docs = self.db.find({ + "manager": True, + "favorites": {"$nin": ["Erlang", "Python"]} + }) + assert len(docs) == 4 + for doc in docs: + if isinstance(doc["favorites"], list): + assert "Erlang" not in doc["favorites"] + assert "Python" not in doc["favorites"] + def test_regex(self): docs = self.db.find({ "age": {"$gt": 40},