@@ -277,4 +277,94 @@ public void orQueryWithArrayMembershipUsingIndexes() throws Exception {
277
277
expectOptimizedCollectionScan (() -> runQuery (query2 , SnapshotVersion .NONE ));
278
278
assertEquals (docSet (query2 .comparator (), doc1 , doc4 , doc6 ), result2 );
279
279
}
280
+
281
+ @ Test
282
+ public void queryWithMultipleInsOnTheSameField () throws Exception {
283
+ MutableDocument doc1 = doc ("coll/1" , 1 , map ("a" , 1 , "b" , 0 ));
284
+ MutableDocument doc2 = doc ("coll/2" , 1 , map ("b" , 1 ));
285
+ MutableDocument doc3 = doc ("coll/3" , 1 , map ("a" , 3 , "b" , 2 ));
286
+ MutableDocument doc4 = doc ("coll/4" , 1 , map ("a" , 1 , "b" , 3 ));
287
+ MutableDocument doc5 = doc ("coll/5" , 1 , map ("a" , 1 ));
288
+ MutableDocument doc6 = doc ("coll/6" , 1 , map ("a" , 2 ));
289
+ addDocument (doc1 , doc2 , doc3 , doc4 , doc5 , doc6 );
290
+ indexManager .addFieldIndex (fieldIndex ("coll" , "a" , Kind .ASCENDING ));
291
+ indexManager .addFieldIndex (fieldIndex ("coll" , "a" , Kind .DESCENDING ));
292
+ indexManager .addFieldIndex (fieldIndex ("coll" , "b" , Kind .ASCENDING ));
293
+ indexManager .addFieldIndex (fieldIndex ("coll" , "b" , Kind .DESCENDING ));
294
+ indexManager .updateIndexEntries (docMap (doc1 , doc2 , doc3 , doc4 , doc5 , doc6 ));
295
+ indexManager .updateCollectionGroup ("coll" , IndexOffset .fromDocument (doc6 ));
296
+
297
+ // a IN [1,2,3] && a IN [0,1,4] should result in "a==1".
298
+ Query query1 =
299
+ query ("coll" )
300
+ .filter (
301
+ andFilters (
302
+ filter ("a" , "in" , Arrays .asList (1 , 2 , 3 )),
303
+ filter ("a" , "in" , Arrays .asList (0 , 1 , 4 ))));
304
+ DocumentSet result1 =
305
+ expectOptimizedCollectionScan (() -> runQuery (query1 , SnapshotVersion .NONE ));
306
+ assertEquals (docSet (query1 .comparator (), doc1 , doc4 , doc5 ), result1 );
307
+
308
+ // a IN [2,3] && a IN [0,1,4] is never true and so the result should be an empty set.
309
+ Query query2 =
310
+ query ("coll" )
311
+ .filter (
312
+ andFilters (
313
+ filter ("a" , "in" , Arrays .asList (2 , 3 )),
314
+ filter ("a" , "in" , Arrays .asList (0 , 1 , 4 ))));
315
+
316
+ DocumentSet result2 =
317
+ expectOptimizedCollectionScan (() -> runQuery (query2 , SnapshotVersion .NONE ));
318
+ assertEquals (docSet (query2 .comparator ()), result2 );
319
+
320
+ // a IN [0,3] || a IN [0,2] should union them (similar to: a IN [0,2,3]).
321
+ Query query3 =
322
+ query ("coll" )
323
+ .filter (
324
+ orFilters (
325
+ filter ("a" , "in" , Arrays .asList (0 , 3 )),
326
+ filter ("a" , "in" , Arrays .asList (0 , 2 ))));
327
+
328
+ DocumentSet result3 =
329
+ expectOptimizedCollectionScan (() -> runQuery (query3 , SnapshotVersion .NONE ));
330
+ assertEquals (docSet (query2 .comparator (), doc3 , doc6 ), result3 );
331
+ }
332
+
333
+ @ Test
334
+ public void queryWithMultipleInsOnDifferentFields () throws Exception {
335
+ MutableDocument doc1 = doc ("coll/1" , 1 , map ("a" , 1 , "b" , 0 ));
336
+ MutableDocument doc2 = doc ("coll/2" , 1 , map ("b" , 1 ));
337
+ MutableDocument doc3 = doc ("coll/3" , 1 , map ("a" , 3 , "b" , 2 ));
338
+ MutableDocument doc4 = doc ("coll/4" , 1 , map ("a" , 1 , "b" , 3 ));
339
+ MutableDocument doc5 = doc ("coll/5" , 1 , map ("a" , 1 ));
340
+ MutableDocument doc6 = doc ("coll/6" , 1 , map ("a" , 2 ));
341
+ addDocument (doc1 , doc2 , doc3 , doc4 , doc5 , doc6 );
342
+ indexManager .addFieldIndex (fieldIndex ("coll" , "a" , Kind .ASCENDING ));
343
+ indexManager .addFieldIndex (fieldIndex ("coll" , "a" , Kind .DESCENDING ));
344
+ indexManager .addFieldIndex (fieldIndex ("coll" , "b" , Kind .ASCENDING ));
345
+ indexManager .addFieldIndex (fieldIndex ("coll" , "b" , Kind .DESCENDING ));
346
+ indexManager .updateIndexEntries (docMap (doc1 , doc2 , doc3 , doc4 , doc5 , doc6 ));
347
+ indexManager .updateCollectionGroup ("coll" , IndexOffset .fromDocument (doc6 ));
348
+
349
+ Query query1 =
350
+ query ("coll" )
351
+ .filter (
352
+ orFilters (
353
+ filter ("a" , "in" , Arrays .asList (2 , 3 )),
354
+ filter ("b" , "in" , Arrays .asList (0 , 2 ))));
355
+ DocumentSet result1 =
356
+ expectOptimizedCollectionScan (() -> runQuery (query1 , SnapshotVersion .NONE ));
357
+ assertEquals (docSet (query1 .comparator (), doc1 , doc3 , doc6 ), result1 );
358
+
359
+ Query query2 =
360
+ query ("coll" )
361
+ .filter (
362
+ andFilters (
363
+ filter ("a" , "in" , Arrays .asList (2 , 3 )),
364
+ filter ("b" , "in" , Arrays .asList (0 , 2 ))));
365
+
366
+ DocumentSet result2 =
367
+ expectOptimizedCollectionScan (() -> runQuery (query2 , SnapshotVersion .NONE ));
368
+ assertEquals (docSet (query2 .comparator (), doc3 ), result2 );
369
+ }
280
370
}
0 commit comments