77from 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+
1016class 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