You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by to...@apache.org on 2020/04/21 20:40:07 UTC

[couchdb] 01/01: fix operator issue with empty arrays

This is an automated email from the ASF dual-hosted git repository.

tonysun83 pushed a commit to branch fix-operator-empty-array
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 7dcbdd8f398a02dccfc95dacfc23c3e617bff2e0
Author: Tony Sun <to...@gmail.com>
AuthorDate: Tue Apr 21 13:36:10 2020 -0700

    fix operator issue with empty arrays
    
    Previously, in https://github.com/apache/couchdb/pull/1783, the logic
    was wrong in relation to how certain operators interacted with empty
    arrays. We modify this logic to make it such that:
    
    {"foo":"bar", "bar":{"$in":[]}}
    and
    {"foo":"bar", "bar":{"$all":[]}}
    
    should return 0 results.
---
 src/mango/src/mango_selector.erl          |  4 ++--
 src/mango/test/21-empty-selector-tests.py | 24 +++++++++++++++++++++++-
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/src/mango/src/mango_selector.erl b/src/mango/src/mango_selector.erl
index 3ea83c2..fac64b4 100644
--- a/src/mango/src/mango_selector.erl
+++ b/src/mango/src/mango_selector.erl
@@ -406,7 +406,7 @@ negate({[{Field, Cond}]}) ->
 % We need to treat an empty array as always true. This will be applied
 % for $or, $in, $all, $nin as well.
 match({[{<<"$and">>, []}]}, _, _) ->
-    true;
+    false;
 match({[{<<"$and">>, Args}]}, Value, Cmp) ->
     Pred = fun(SubSel) -> match(SubSel, Value, Cmp) end,
     lists:all(Pred, Args);
@@ -421,7 +421,7 @@ match({[{<<"$not">>, Arg}]}, Value, Cmp) ->
     not match(Arg, Value, Cmp);
 
 match({[{<<"$all">>, []}]}, _, _) ->
-    true;
+    false;
 % All of the values in Args must exist in Values or
 % Values == hd(Args) if Args is a single element list
 % that contains a list.
diff --git a/src/mango/test/21-empty-selector-tests.py b/src/mango/test/21-empty-selector-tests.py
index beb222c..31ad8e6 100644
--- a/src/mango/test/21-empty-selector-tests.py
+++ b/src/mango/test/21-empty-selector-tests.py
@@ -35,14 +35,36 @@ def make_empty_selector_suite(klass):
             docs = self.db.find({"age": 22, "$or": []})
             assert len(docs) == 1
 
+        def test_empty_array_in_with_age(self):
+            resp = self.db.find({"age": 22, "company": {"$in": []}}, explain=True)
+            self.assertEqual(resp["index"]["type"], klass.INDEX_TYPE)
+            docs = self.db.find({"age": 22, "company": {"$in": []}})
+            assert len(docs) == 0
+
         def test_empty_array_and_with_age(self):
             resp = self.db.find(
-                {"age": 22, "$and": [{"b": {"$all": []}}]}, explain=True
+                {"age": 22, "$and": []}, explain=True
             )
             self.assertEqual(resp["index"]["type"], klass.INDEX_TYPE)
             docs = self.db.find({"age": 22, "$and": []})
             assert len(docs) == 1
 
+        def test_empty_array_all_age(self):
+            resp = self.db.find(
+                {"age": 22, "company": {"$all": []}}, explain=True
+            )
+            self.assertEqual(resp["index"]["type"], klass.INDEX_TYPE)
+            docs = self.db.find({"age": 22, "company": {"$all": []}})
+            assert len(docs) == 0
+
+        def test_empty_array_nested_all_with_age(self):
+            resp = self.db.find(
+                {"age": 22, "$and": [{"company": {"$all": []}}]}, explain=True
+            )
+            self.assertEqual(resp["index"]["type"], klass.INDEX_TYPE)
+            docs = self.db.find( {"age": 22, "$and": [{"company": {"$all": []}}]})
+            assert len(docs) == 0
+
         def test_empty_arrays_complex(self):
             resp = self.db.find({"$or": [], "a": {"$in": []}}, explain=True)
             self.assertEqual(resp["index"]["type"], klass.INDEX_TYPE)