@@ -243,14 +243,24 @@ def test_empty_list(self):
243243 self .assertEqual (obj .field , [])
244244 self .assertEqual (obj .empty_array , [])
245245
246+ def test_exact (self ):
247+ with self .assertNumQueries (1 ) as ctx :
248+ self .assertSequenceEqual (
249+ NullableIntegerArrayModel .objects .filter (field__exact = [1 ]), self .objs [:1 ]
250+ )
251+ self .assertAggregateQuery (
252+ ctx .captured_queries [0 ]["sql" ],
253+ "model_fields__nullableintegerarraymodel" ,
254+ [{"$match" : {"field" : [1 ]}}],
255+ )
256+
246257 def test_exact_expr (self ):
247258 with self .assertNumQueries (1 ) as ctx :
248259 self .assertSequenceEqual (
249260 NullableIntegerArrayModel .objects .filter (field__exact = [Value (3 ) / 3 ]), self .objs [:1 ]
250261 )
251- query = ctx .captured_queries [0 ]["sql" ]
252262 self .assertAggregateQuery (
253- query ,
263+ ctx . captured_queries [ 0 ][ "sql" ] ,
254264 "model_fields__nullableintegerarraymodel" ,
255265 [
256266 {
@@ -263,16 +273,6 @@ def test_exact_expr(self):
263273 ],
264274 )
265275
266- def test_exact_path (self ):
267- with self .assertNumQueries (1 ) as ctx :
268- self .assertSequenceEqual (
269- NullableIntegerArrayModel .objects .filter (field__exact = [1 ]), self .objs [:1 ]
270- )
271- query = ctx .captured_queries [0 ]["sql" ]
272- self .assertAggregateQuery (
273- query , "model_fields__nullableintegerarraymodel" , [{"$match" : {"field" : [1 ]}}]
274- )
275-
276276 def test_exact_null_only_array (self ):
277277 obj = NullableIntegerArrayModel .objects .create (field = [None ], field_nested = [None , None ])
278278 self .assertSequenceEqual (
@@ -295,9 +295,8 @@ def test_exact_null_only_nested_array(self):
295295 ),
296296 [obj1 ],
297297 )
298- query = ctx .captured_queries [0 ]["sql" ]
299298 self .assertAggregateQuery (
300- query ,
299+ ctx . captured_queries [ 0 ][ "sql" ] ,
301300 "model_fields__nullableintegerarraymodel" ,
302301 [{"$match" : {"field_nested" : [[None , None ]]}}],
303302 )
@@ -308,9 +307,8 @@ def test_exact_null_only_nested_array(self):
308307 ),
309308 [obj2 ],
310309 )
311- query = ctx .captured_queries [0 ]["sql" ]
312310 self .assertAggregateQuery (
313- query ,
311+ ctx . captured_queries [ 0 ][ "sql" ] ,
314312 "model_fields__nullableintegerarraymodel" ,
315313 [{"$match" : {"field_nested" : [[None , None ], [None , None ]]}}],
316314 )
@@ -321,9 +319,10 @@ def test_exact_with_expression(self):
321319 NullableIntegerArrayModel .objects .filter (field__exact = [Value (1 )]),
322320 self .objs [:1 ],
323321 )
324- query = ctx .captured_queries [0 ]["sql" ]
325322 self .assertAggregateQuery (
326- query , "model_fields__nullableintegerarraymodel" , [{"$match" : {"field" : [1 ]}}]
323+ ctx .captured_queries [0 ]["sql" ],
324+ "model_fields__nullableintegerarraymodel" ,
325+ [{"$match" : {"field" : [1 ]}}],
327326 )
328327
329328 def test_exact_charfield (self ):
@@ -341,22 +340,31 @@ def test_isnull(self):
341340 self .assertSequenceEqual (
342341 NullableIntegerArrayModel .objects .filter (field__isnull = True ), self .objs [- 1 :]
343342 )
344- query = ctx .captured_queries [0 ]["sql" ]
345343 self .assertAggregateQuery (
346- query ,
344+ ctx . captured_queries [ 0 ][ "sql" ] ,
347345 "model_fields__nullableintegerarraymodel" ,
348346 [{"$match" : {"$or" : [{"field" : {"$exists" : False }}, {"field" : None }]}}],
349347 )
350348
349+ def test_gt (self ):
350+ with self .assertNumQueries (1 ) as ctx :
351+ self .assertSequenceEqual (
352+ NullableIntegerArrayModel .objects .filter (field__gt = Array (0 )), self .objs [:4 ]
353+ )
354+ self .assertAggregateQuery (
355+ ctx .captured_queries [0 ]["sql" ],
356+ "model_fields__nullableintegerarraymodel" ,
357+ [{"$match" : {"field" : {"$gt" : [0 ]}}}],
358+ )
359+
351360 def test_gt_expr (self ):
352361 with self .assertNumQueries (1 ) as ctx :
353362 self .assertSequenceEqual (
354363 NullableIntegerArrayModel .objects .filter (field__gt = Array (Value (0 ) * 3 )),
355364 self .objs [:4 ],
356365 )
357- query = ctx .captured_queries [0 ]["sql" ]
358366 self .assertAggregateQuery (
359- query ,
367+ ctx . captured_queries [ 0 ][ "sql" ] ,
360368 "model_fields__nullableintegerarraymodel" ,
361369 [
362370 {
@@ -369,14 +377,24 @@ def test_gt_expr(self):
369377 ],
370378 )
371379
372- def test_gt_path (self ):
380+ def test_lt (self ):
373381 with self .assertNumQueries (1 ) as ctx :
374382 self .assertSequenceEqual (
375- NullableIntegerArrayModel .objects .filter (field__gt = Array ( 0 )) , self .objs [:4 ]
383+ NullableIntegerArrayModel .objects .filter (field__lt = [ 2 ]) , self .objs [:1 ]
376384 )
377- query = ctx .captured_queries [0 ]["sql" ]
378385 self .assertAggregateQuery (
379- query , "model_fields__nullableintegerarraymodel" , [{"$match" : {"field" : {"$gt" : [0 ]}}}]
386+ ctx .captured_queries [0 ]["sql" ],
387+ "model_fields__nullableintegerarraymodel" ,
388+ [
389+ {
390+ "$match" : {
391+ "$and" : [
392+ {"field" : {"$lt" : [2 ]}},
393+ {"$and" : [{"field" : {"$exists" : True }}, {"field" : {"$ne" : None }}]},
394+ ]
395+ }
396+ }
397+ ],
380398 )
381399
382400 def test_lt_expr (self ):
@@ -385,9 +403,8 @@ def test_lt_expr(self):
385403 NullableIntegerArrayModel .objects .filter (field__lt = Array (Value (1 ) + 1 )),
386404 self .objs [:1 ],
387405 )
388- query = ctx .captured_queries [0 ]["sql" ]
389406 self .assertAggregateQuery (
390- query ,
407+ ctx . captured_queries [ 0 ][ "sql" ] ,
391408 "model_fields__nullableintegerarraymodel" ,
392409 [
393410 {
@@ -410,25 +427,16 @@ def test_lt_expr(self):
410427 ],
411428 )
412429
413- def test_lt_path (self ):
430+ def test_in (self ):
414431 with self .assertNumQueries (1 ) as ctx :
415432 self .assertSequenceEqual (
416- NullableIntegerArrayModel .objects .filter (field__lt = [2 ]), self .objs [:1 ]
433+ NullableIntegerArrayModel .objects .filter (field__in = [[1 ], [2 ]]),
434+ self .objs [:2 ],
417435 )
418- query = ctx .captured_queries [0 ]["sql" ]
419436 self .assertAggregateQuery (
420- query ,
437+ ctx . captured_queries [ 0 ][ "sql" ] ,
421438 "model_fields__nullableintegerarraymodel" ,
422- [
423- {
424- "$match" : {
425- "$and" : [
426- {"field" : {"$lt" : [2 ]}},
427- {"$and" : [{"field" : {"$exists" : True }}, {"field" : {"$ne" : None }}]},
428- ]
429- }
430- }
431- ],
439+ [{"$match" : {"field" : {"$in" : ([1 ], [2 ])}}}],
432440 )
433441
434442 def test_in_expr (self ):
@@ -439,9 +447,8 @@ def test_in_expr(self):
439447 ),
440448 self .objs [:2 ],
441449 )
442- query = ctx .captured_queries [0 ]["sql" ]
443450 self .assertAggregateQuery (
444- query ,
451+ ctx . captured_queries [ 0 ][ "sql" ] ,
445452 "model_fields__nullableintegerarraymodel" ,
446453 [
447454 {
@@ -460,19 +467,6 @@ def test_in_expr(self):
460467 ],
461468 )
462469
463- def test_in_path (self ):
464- with self .assertNumQueries (1 ) as ctx :
465- self .assertSequenceEqual (
466- NullableIntegerArrayModel .objects .filter (field__in = [[1 ], [2 ]]),
467- self .objs [:2 ],
468- )
469- query = ctx .captured_queries [0 ]["sql" ]
470- self .assertAggregateQuery (
471- query ,
472- "model_fields__nullableintegerarraymodel" ,
473- [{"$match" : {"field" : {"$in" : ([1 ], [2 ])}}}],
474- )
475-
476470 def test_in_subquery (self ):
477471 IntegerArrayModel .objects .create (field = [2 , 3 ])
478472 self .assertSequenceEqual (
@@ -514,15 +508,26 @@ def test_contained_by_including_F_object(self):
514508 self .objs [:3 ],
515509 )
516510
511+ def test_contains (self ):
512+ with self .assertNumQueries (1 ) as ctx :
513+ self .assertSequenceEqual (
514+ NullableIntegerArrayModel .objects .filter (field__contains = [2 ]),
515+ self .objs [1 :3 ],
516+ )
517+ self .assertAggregateQuery (
518+ ctx .captured_queries [0 ]["sql" ],
519+ "model_fields__nullableintegerarraymodel" ,
520+ [{"$match" : {"field" : {"$all" : [2 ]}}}],
521+ )
522+
517523 def test_contains_expr (self ):
518524 with self .assertNumQueries (1 ) as ctx :
519525 self .assertSequenceEqual (
520526 NullableIntegerArrayModel .objects .filter (field__contains = [Value (1 ) + 1 ]),
521527 self .objs [1 :3 ],
522528 )
523- query = ctx .captured_queries [0 ]["sql" ]
524529 self .assertAggregateQuery (
525- query ,
530+ ctx . captured_queries [ 0 ][ "sql" ] ,
526531 "model_fields__nullableintegerarraymodel" ,
527532 [
528533 {
@@ -544,17 +549,6 @@ def test_contains_expr(self):
544549 ],
545550 )
546551
547- def test_contains_path (self ):
548- with self .assertNumQueries (1 ) as ctx :
549- self .assertSequenceEqual (
550- NullableIntegerArrayModel .objects .filter (field__contains = [2 ]),
551- self .objs [1 :3 ],
552- )
553- query = ctx .captured_queries [0 ]["sql" ]
554- self .assertAggregateQuery (
555- query , "model_fields__nullableintegerarraymodel" , [{"$match" : {"field" : {"$all" : [2 ]}}}]
556- )
557-
558552 def test_contains_subquery (self ):
559553 IntegerArrayModel .objects .create (field = [2 , 3 ])
560554 inner_qs = IntegerArrayModel .objects .values_list ("field" , flat = True )
@@ -596,9 +590,8 @@ def test_icontains(self):
596590 self .assertSequenceEqual (
597591 CharArrayModel .objects .filter (field__icontains = "foo" ), [instance ]
598592 )
599- query = ctx .captured_queries [0 ]["sql" ]
600593 self .assertAggregateQuery (
601- query ,
594+ ctx . captured_queries [ 0 ][ "sql" ] ,
602595 "model_fields__chararraymodel" ,
603596 [{"$match" : {"field" : {"$regex" : "foo" , "$options" : "i" }}}],
604597 )
@@ -661,15 +654,26 @@ def test_index_used_on_nested_data(self):
661654 NestedIntegerArrayModel .objects .filter (field__0 = [1 , 2 ]), [instance ]
662655 )
663656
657+ def test_overlap (self ):
658+ with self .assertNumQueries (1 ) as ctx :
659+ self .assertSequenceEqual (
660+ NullableIntegerArrayModel .objects .filter (field__overlap = [1 , 2 ]),
661+ self .objs [0 :3 ],
662+ )
663+ self .assertAggregateQuery (
664+ ctx .captured_queries [0 ]["sql" ],
665+ "model_fields__nullableintegerarraymodel" ,
666+ [{"$match" : {"field" : {"$in" : [1 , 2 ]}}}],
667+ )
668+
664669 def test_overlap_expr (self ):
665670 with self .assertNumQueries (1 ) as ctx :
666671 self .assertSequenceEqual (
667672 NullableIntegerArrayModel .objects .filter (field__overlap = [1 , Value (1 ) + 1 ]),
668673 self .objs [0 :3 ],
669674 )
670- query = ctx .captured_queries [0 ]["sql" ]
671675 self .assertAggregateQuery (
672- query ,
676+ ctx . captured_queries [ 0 ][ "sql" ] ,
673677 "model_fields__nullableintegerarraymodel" ,
674678 [
675679 {
@@ -695,19 +699,6 @@ def test_overlap_expr(self):
695699 ],
696700 )
697701
698- def test_overlap_path (self ):
699- with self .assertNumQueries (1 ) as ctx :
700- self .assertSequenceEqual (
701- NullableIntegerArrayModel .objects .filter (field__overlap = [1 , 2 ]),
702- self .objs [0 :3 ],
703- )
704- query = ctx .captured_queries [0 ]["sql" ]
705- self .assertAggregateQuery (
706- query ,
707- "model_fields__nullableintegerarraymodel" ,
708- [{"$match" : {"field" : {"$in" : [1 , 2 ]}}}],
709- )
710-
711702 def test_index_annotation (self ):
712703 qs = NullableIntegerArrayModel .objects .annotate (second = models .F ("field__1" ))
713704 self .assertCountEqual (
0 commit comments