fix operator issue with empty arrays (#2805)
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.
diff --git a/src/mango/src/mango_selector.erl b/src/mango/src/mango_selector.erl
index 3ea83c2..e884dc5 100644
--- a/src/mango/src/mango_selector.erl
+++ b/src/mango/src/mango_selector.erl
@@ -421,7 +421,7 @@
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.
@@ -506,7 +506,7 @@
Cmp(Value, Arg) > 0;
match({[{<<"$in">>, []}]}, _, _) ->
- true;
+ false;
match({[{<<"$in">>, Args}]}, Values, Cmp) when is_list(Values)->
Pred = fun(Arg) ->
lists:foldl(fun(Value,Match) ->
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 @@
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)