@@ -33,6 +33,50 @@ def _test_conversion_various_types(self, conversion_test):
3333 with self .subTest (_type = _type , val = val ):
3434 conversion_test (val )
3535
36+ def _test_conversion_getfield (self , logical_op ):
37+ expr = {logical_op : [{"$getField" : {"input" : "$item" , "field" : "age" }}, 10 ]}
38+ self .assertConversionEqual (
39+ expr , {"item.age" : 10 } if logical_op == "eq" else {"item.age" : {logical_op : 10 }}
40+ )
41+
42+ def _test_conversion_nested_getfield (self , logical_op ):
43+ expr = {
44+ logical_op : [
45+ {
46+ "$getField" : {
47+ "input" : {"$getField" : {"input" : "$item" , "field" : "shelf_life" }},
48+ "field" : "age" ,
49+ }
50+ },
51+ 10 ,
52+ ]
53+ }
54+ self .assertConversionEqual (
55+ expr ,
56+ {"item.shel_life.age" : 10 }
57+ if logical_op == "eq"
58+ else {"item.shelf_life.age" : {logical_op : 10 }},
59+ )
60+
61+ def _test_conversion_dual_getfield_ineligible (self , logical_op ):
62+ expr = {
63+ logical_op : [
64+ {
65+ "$getField" : {
66+ "input" : "$root" ,
67+ "field" : "age" ,
68+ }
69+ },
70+ {
71+ "$getField" : {
72+ "input" : "$value" ,
73+ "field" : "age" ,
74+ }
75+ },
76+ ]
77+ }
78+ self .assertNotOptimizable (expr )
79+
3680
3781class ExpressionTests (ConversionTestCase ):
3882 def test_non_dict (self ):
@@ -65,22 +109,13 @@ def test_conversion_various_array_types(self):
65109 self ._test_conversion_various_types (self ._test_conversion_valid_array_type )
66110
67111 def test_conversion_getfield (self ):
68- expr = {"$eq" : [{"$getField" : {"input" : "$item" , "field" : "age" }}, 10 ]}
69- self .assertConversionEqual (expr , {"item.age" : 10 })
112+ self ._test_conversion_getfield ("$eq" )
70113
71114 def test_conversion_nested_getfield (self ):
72- expr = {
73- "$eq" : [
74- {
75- "$getField" : {
76- "input" : {"$getField" : {"input" : "$item" , "field" : "shelf_life" }},
77- "field" : "age" ,
78- }
79- },
80- 10 ,
81- ]
82- }
83- self .assertConversionEqual (expr , {"item.shel_life.age" : 10 })
115+ self ._test_conversion_nested_getfield ("$eq" )
116+
117+ def test_conversion_dual_getfield_ineligible (self ):
118+ self ._test_conversion_dual_getfield_ineligible ("$eq" )
84119
85120
86121class InTests (ConversionTestCase ):
@@ -104,23 +139,10 @@ def test_conversion_various_types(self):
104139 self ._test_conversion_valid_type (val )
105140
106141 def test_conversion_getfield (self ):
107- expr = {"$in" : [{"$getField" : {"input" : "$item" , "field" : "age" }}, [10 ]]}
108- expected = {"item.age" : {"$in" : [10 ]}}
109- self .assertConversionEqual (expr , expected )
142+ self ._test_conversion_getfield ("$in" )
110143
111144 def test_conversion_nested_getfield (self ):
112- expr = {
113- "$in" : [
114- {
115- "$getField" : {
116- "input" : {"$getField" : {"input" : "$item" , "field" : "shelf_life" }},
117- "field" : "age" ,
118- }
119- },
120- 10 ,
121- ]
122- }
123- self .assertConversionEqual (expr , {"item.shelf_life.age" : {"$in" : [10 ]}})
145+ self ._test_conversion_nested_getfield ("$in" )
124146
125147 def test_conversion_dual_getfield_ineligible (self ):
126148 expr = {
@@ -235,6 +257,15 @@ def _test_conversion_valid_type(self, _type):
235257 def test_conversion_various_types (self ):
236258 self ._test_conversion_various_types (self ._test_conversion_valid_type )
237259
260+ def test_conversion_getfield (self ):
261+ self ._test_conversion_getfield ("$gt" )
262+
263+ def test_conversion_nested_getfield (self ):
264+ self ._test_conversion_nested_getfield ("$gt" )
265+
266+ def test_conversion_dual_getfield_ineligible (self ):
267+ self ._test_conversion_dual_getfield_ineligible ("$gt" )
268+
238269
239270class GteTests (ConversionTestCase ):
240271 def test_conversion (self ):
@@ -258,6 +289,15 @@ def _test_conversion_valid_type(self, _type):
258289 def test_conversion_various_types (self ):
259290 self ._test_conversion_various_types (self ._test_conversion_valid_type )
260291
292+ def test_conversion_getfield (self ):
293+ self ._test_conversion_getfield ("$gte" )
294+
295+ def test_conversion_nested_getfield (self ):
296+ self ._test_conversion_nested_getfield ("$gte" )
297+
298+ def test_conversion_dual_getfield_ineligible (self ):
299+ self ._test_conversion_dual_getfield_ineligible ("$gte" )
300+
261301
262302class LtTests (ConversionTestCase ):
263303 def test_conversion (self ):
@@ -275,6 +315,15 @@ def _test_conversion_valid_type(self, _type):
275315 def test_conversion_various_types (self ):
276316 self ._test_conversion_various_types (self ._test_conversion_valid_type )
277317
318+ def test_conversion_getfield (self ):
319+ self ._test_conversion_getfield ("$lt" )
320+
321+ def test_conversion_nested_getfield (self ):
322+ self ._test_conversion_nested_getfield ("$lt" )
323+
324+ def test_conversion_dual_getfield_ineligible (self ):
325+ self ._test_conversion_dual_getfield_ineligible ("$lt" )
326+
278327
279328class LteTests (ConversionTestCase ):
280329 def test_conversion (self ):
@@ -291,3 +340,12 @@ def _test_conversion_valid_type(self, _type):
291340
292341 def test_conversion_various_types (self ):
293342 self ._test_conversion_various_types (self ._test_conversion_valid_type )
343+
344+ def test_conversion_getfield (self ):
345+ self ._test_conversion_getfield ("$lte" )
346+
347+ def test_conversion_nested_getfield (self ):
348+ self ._test_conversion_nested_getfield ("$lte" )
349+
350+ def test_conversion_dual_getfield_ineligible (self ):
351+ self ._test_conversion_dual_getfield_ineligible ("$lte" )
0 commit comments