Skip to content

Commit db17c7a

Browse files
committed
add explicit : true check
1 parent b8c99ca commit db17c7a

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

django_mongodb_backend/query_conversion/expression_converters.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,12 @@ def convert(cls, args):
7676
field_expr, value = args
7777
# Check if first argument is a simple field reference.
7878
if (field_name := cls.convert_path_name(field_expr)) and cls.is_simple_value(value):
79-
query = {"$and": [{"$exists": True}]} if value is None else None
80-
core_check = None
8179
if cls.operator == "$eq":
82-
core_check = {field_name: value}
80+
query = {field_name: value}
81+
else:
82+
query = {field_name: {cls.operator: value}}
8383
if value is None:
84-
core_check = {field_name: {cls.operator: None}}
85-
query = query["$and"].append(core_check) if query else core_check
84+
query = {"$and": [{field_name: {"$exists": True}}, query]}
8685
return query
8786
return None
8887

@@ -141,7 +140,11 @@ def convert(cls, in_args):
141140
and all(cls.is_simple_value(v) for v in values)
142141
):
143142
core_check = {field_name: {"$in": values}}
144-
return {"$and": [{"$exists": True}, core_check]} if None in values else core_check
143+
return (
144+
{"$and": [{field_name: {"$exists": True}}, core_check]}
145+
if None in values
146+
else core_check
147+
)
145148
return None
146149

147150

tests/expression_converter_/test_op_expressions.py

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
from django_mongodb_backend.query_conversion.expression_converters import convert_expression
88

99

10+
def _wrap_condition_if_null(_type, condition):
11+
if _type is None:
12+
return {"$and": [{"$exists": True}, condition]}
13+
return condition
14+
15+
1016
class ConversionTestCase(SimpleTestCase):
1117
CONVERTIBLE_TYPES = {
1218
"int": 42,
@@ -97,10 +103,14 @@ def test_no_conversion_dict_value(self):
97103
self.assertNotOptimizable({"$eq": ["$status", {"$gt": 5}]})
98104

99105
def _test_conversion_valid_type(self, _type):
100-
self.assertConversionEqual({"$eq": ["$age", _type]}, {"age": _type})
106+
self.assertConversionEqual(
107+
{"$eq": ["$age", _type]}, _wrap_condition_if_null(_type, {"age": _type})
108+
)
101109

102110
def _test_conversion_valid_array_type(self, _type):
103-
self.assertConversionEqual({"$eq": ["$age", _type]}, {"age": _type})
111+
self.assertConversionEqual(
112+
{"$eq": ["$age", _type]}, _wrap_condition_if_null(_type, {"age": _type})
113+
)
104114

105115
def test_conversion_various_types(self):
106116
self._test_conversion_various_types(self._test_conversion_valid_type)
@@ -131,7 +141,9 @@ def test_no_conversion_dict_value(self):
131141
self.assertNotOptimizable({"$in": ["$status", [{"bad": "val"}]]})
132142

133143
def _test_conversion_valid_type(self, _type):
134-
self.assertConversionEqual({"$in": ["$age", [_type]]}, {"age": {"$in": [_type]}})
144+
self.assertConversionEqual(
145+
{"$in": ["$age", [_type]]}, _wrap_condition_if_null(_type, {"age": {"$in": [_type]}})
146+
)
135147

136148
def test_conversion_various_types(self):
137149
for _type, val in self.CONVERTIBLE_TYPES.items():
@@ -252,7 +264,9 @@ def test_no_conversion_dict_value(self):
252264
self.assertNotOptimizable({"$gt": ["$price", {}]})
253265

254266
def _test_conversion_valid_type(self, _type):
255-
self.assertConversionEqual({"$gt": ["$price", _type]}, {"price": {"$gt": _type}})
267+
self.assertConversionEqual(
268+
{"$gt": ["$price", _type]}, _wrap_condition_if_null(_type, {"price": {"$gt": _type}})
269+
)
256270

257271
def test_conversion_various_types(self):
258272
self._test_conversion_various_types(self._test_conversion_valid_type)
@@ -284,7 +298,7 @@ def test_no_conversion_dict_value(self):
284298
def _test_conversion_valid_type(self, _type):
285299
expr = {"$gte": ["$price", _type]}
286300
expected = {"price": {"$gte": _type}}
287-
self.assertConversionEqual(expr, expected)
301+
self.assertConversionEqual(expr, _wrap_condition_if_null(_type, expected))
288302

289303
def test_conversion_various_types(self):
290304
self._test_conversion_various_types(self._test_conversion_valid_type)
@@ -310,7 +324,9 @@ def test_no_conversion_dict_value(self):
310324
self.assertNotOptimizable({"$lt": ["$price", {}]})
311325

312326
def _test_conversion_valid_type(self, _type):
313-
self.assertConversionEqual({"$lt": ["$price", _type]}, {"price": {"$lt": _type}})
327+
self.assertConversionEqual(
328+
{"$lt": ["$price", _type]}, _wrap_condition_if_null(_type, {"price": {"$lt": _type}})
329+
)
314330

315331
def test_conversion_various_types(self):
316332
self._test_conversion_various_types(self._test_conversion_valid_type)
@@ -336,7 +352,9 @@ def test_no_conversion_dict_value(self):
336352
self.assertNotOptimizable({"$lte": ["$price", {}]})
337353

338354
def _test_conversion_valid_type(self, _type):
339-
self.assertConversionEqual({"$lte": ["$price", _type]}, {"price": {"$lte": _type}})
355+
self.assertConversionEqual(
356+
{"$lte": ["$price", _type]}, _wrap_condition_if_null(_type, {"price": {"$lte": _type}})
357+
)
340358

341359
def test_conversion_various_types(self):
342360
self._test_conversion_various_types(self._test_conversion_valid_type)

0 commit comments

Comments
 (0)