@@ -63,6 +63,7 @@ import {
63
63
filter ,
64
64
key ,
65
65
orderBy ,
66
+ orFilter ,
66
67
query ,
67
68
setMutation ,
68
69
version
@@ -534,20 +535,63 @@ describe('LocalStore w/ IndexedDB Persistence (Non generic)', () => {
534
535
test . assertQueryReturned ( 'coll/a' , 'coll/e' , 'coll/f' ) ;
535
536
} ) ;
536
537
538
+ it ( 'can auto-create indexes works with or query' , async ( ) => {
539
+ const query_ = query (
540
+ 'coll' ,
541
+ orFilter ( filter ( 'a' , '==' , 3 ) , filter ( 'b' , '==' , true ) )
542
+ ) ;
543
+ const targetId = await test . allocateQuery ( query_ ) ;
544
+ test . configureIndexAutoCreation ( {
545
+ isEnabled : true ,
546
+ indexAutoCreationMinCollectionSize : 0 ,
547
+ relativeIndexReadCostPerDocument : 2
548
+ } ) ;
549
+
550
+ await test . applyRemoteEvents (
551
+ docAddedRemoteEvent ( doc ( 'coll/a' , 10 , { b : true } ) , [ targetId ] ) ,
552
+ docAddedRemoteEvent ( doc ( 'coll/b' , 10 , { b : false } ) , [ targetId ] ) ,
553
+ docAddedRemoteEvent ( doc ( 'coll/c' , 10 , { a : 5 , b : false } ) , [ targetId ] ) ,
554
+ docAddedRemoteEvent ( doc ( 'coll/d' , 10 , { a : true } ) , [ targetId ] ) ,
555
+ docAddedRemoteEvent ( doc ( 'coll/e' , 10 , { a : 3 , b : true } ) , [ targetId ] )
556
+ ) ;
557
+
558
+ // First time query runs without indexes.
559
+ // Based on current heuristic, collection document counts (5) >
560
+ // 2 * resultSize (2).
561
+ // Full matched index should be created.
562
+ await test . executeQuery ( query_ ) ;
563
+ test . assertRemoteDocumentsRead ( 0 , 2 ) ;
564
+ test . assertQueryReturned ( 'coll/a' , 'coll/e' ) ;
565
+
566
+ await test . backfillIndexes ( ) ;
567
+
568
+ await test . applyRemoteEvent (
569
+ docAddedRemoteEvent ( doc ( 'coll/f' , 20 , { a : 3 , b : false } ) , [ targetId ] )
570
+ ) ;
571
+
572
+ await test . executeQuery ( query_ ) ;
573
+ test . assertRemoteDocumentsRead ( 2 , 1 ) ;
574
+ test . assertQueryReturned ( 'coll/a' , 'coll/e' , 'coll/f' ) ;
575
+ } ) ;
576
+
537
577
it ( 'does not auto-create indexes for small collections' , async ( ) => {
538
- const query_ = query ( 'coll' , filter ( 'count' , '>=' , 3 ) ) ;
578
+ const query_ = query (
579
+ 'coll' ,
580
+ filter ( 'foo' , '==' , 9 ) ,
581
+ filter ( 'count' , '>=' , 3 )
582
+ ) ;
539
583
const targetId = await test . allocateQuery ( query_ ) ;
540
584
test . configureIndexAutoCreation ( {
541
585
isEnabled : true ,
542
586
relativeIndexReadCostPerDocument : 2
543
587
} ) ;
544
588
545
589
await test . applyRemoteEvents (
546
- docAddedRemoteEvent ( doc ( 'coll/a' , 10 , { count : 5 } ) , [ targetId ] ) ,
547
- docAddedRemoteEvent ( doc ( 'coll/b' , 10 , { count : 1 } ) , [ targetId ] ) ,
548
- docAddedRemoteEvent ( doc ( 'coll/c' , 10 , { count : 0 } ) , [ targetId ] ) ,
549
- docAddedRemoteEvent ( doc ( 'coll/d' , 10 , { count : 1 } ) , [ targetId ] ) ,
550
- docAddedRemoteEvent ( doc ( 'coll/e' , 10 , { count : 3 } ) , [ targetId ] )
590
+ docAddedRemoteEvent ( doc ( 'coll/a' , 10 , { foo : 9 , count : 5 } ) , [ targetId ] ) ,
591
+ docAddedRemoteEvent ( doc ( 'coll/b' , 10 , { foo : 8 , count : 6 } ) , [ targetId ] ) ,
592
+ docAddedRemoteEvent ( doc ( 'coll/c' , 10 , { foo : 9 , count : 0 } ) , [ targetId ] ) ,
593
+ docAddedRemoteEvent ( doc ( 'coll/d' , 10 , { count : 4 } ) , [ targetId ] ) ,
594
+ docAddedRemoteEvent ( doc ( 'coll/e' , 10 , { foo : 9 , count : 3 } ) , [ targetId ] )
551
595
) ;
552
596
553
597
// SDK will not create indexes since collection size is too small.
@@ -558,7 +602,7 @@ describe('LocalStore w/ IndexedDB Persistence (Non generic)', () => {
558
602
await test . backfillIndexes ( ) ;
559
603
560
604
await test . applyRemoteEvent (
561
- docAddedRemoteEvent ( doc ( 'coll/f' , 20 , { count : 4 } ) , [ targetId ] )
605
+ docAddedRemoteEvent ( doc ( 'coll/f' , 20 , { foo : 9 , count : 4 } ) , [ targetId ] )
562
606
) ;
563
607
564
608
await test . executeQuery ( query_ ) ;
@@ -602,7 +646,11 @@ describe('LocalStore w/ IndexedDB Persistence (Non generic)', () => {
602
646
} ) ;
603
647
604
648
it ( 'index auto creation works when backfiller runs halfway' , async ( ) => {
605
- const query_ = query ( 'coll' , filter ( 'matches' , '==' , 'foo' ) ) ;
649
+ const query_ = query (
650
+ 'coll' ,
651
+ filter ( 'matches' , '==' , 'foo' ) ,
652
+ filter ( 'count' , '>' , 10 )
653
+ ) ;
606
654
const targetId = await test . allocateQuery ( query_ ) ;
607
655
test . configureIndexAutoCreation ( {
608
656
isEnabled : true ,
@@ -611,11 +659,19 @@ describe('LocalStore w/ IndexedDB Persistence (Non generic)', () => {
611
659
} ) ;
612
660
613
661
await test . applyRemoteEvents (
614
- docAddedRemoteEvent ( doc ( 'coll/a' , 10 , { matches : 'foo' } ) , [ targetId ] ) ,
615
- docAddedRemoteEvent ( doc ( 'coll/b' , 10 , { matches : '' } ) , [ targetId ] ) ,
616
- docAddedRemoteEvent ( doc ( 'coll/c' , 10 , { matches : 'bar' } ) , [ targetId ] ) ,
617
- docAddedRemoteEvent ( doc ( 'coll/d' , 10 , { matches : 7 } ) , [ targetId ] ) ,
618
- docAddedRemoteEvent ( doc ( 'coll/e' , 10 , { matches : 'foo' } ) , [ targetId ] )
662
+ docAddedRemoteEvent ( doc ( 'coll/a' , 10 , { matches : 'foo' , count : 11 } ) , [
663
+ targetId
664
+ ] ) ,
665
+ docAddedRemoteEvent ( doc ( 'coll/b' , 10 , { matches : 'foo' , count : 9 } ) , [
666
+ targetId
667
+ ] ) ,
668
+ docAddedRemoteEvent ( doc ( 'coll/c' , 10 , { matches : 'foo' } ) , [ targetId ] ) ,
669
+ docAddedRemoteEvent ( doc ( 'coll/d' , 10 , { matches : 7 , count : 11 } ) , [
670
+ targetId
671
+ ] ) ,
672
+ docAddedRemoteEvent ( doc ( 'coll/e' , 10 , { matches : 'foo' , count : 21 } ) , [
673
+ targetId
674
+ ] )
619
675
) ;
620
676
621
677
// First time query runs without indexes.
@@ -629,7 +685,9 @@ describe('LocalStore w/ IndexedDB Persistence (Non generic)', () => {
629
685
await test . backfillIndexes ( { maxDocumentsToProcess : 2 } ) ;
630
686
631
687
await test . applyRemoteEvent (
632
- docAddedRemoteEvent ( doc ( 'coll/f' , 20 , { matches : 'foo' } ) , [ targetId ] )
688
+ docAddedRemoteEvent ( doc ( 'coll/f' , 20 , { matches : 'foo' , count : 15 } ) , [
689
+ targetId
690
+ ] )
633
691
) ;
634
692
635
693
await test . executeQuery ( query_ ) ;
@@ -718,9 +776,14 @@ describe('LocalStore w/ IndexedDB Persistence (Non generic)', () => {
718
776
719
777
await test . executeQuery ( query2 ) ;
720
778
test . assertRemoteDocumentsRead ( 0 , 2 ) ;
779
+ test . assertQueryReturned ( 'foo/a' , 'foo/e' ) ;
780
+
721
781
await test . backfillIndexes ( ) ;
782
+
783
+ // Run the query in second time, test index won't be created
722
784
await test . executeQuery ( query2 ) ;
723
785
test . assertRemoteDocumentsRead ( 0 , 2 ) ;
786
+ test . assertQueryReturned ( 'foo/a' , 'foo/e' ) ;
724
787
} ) ;
725
788
726
789
it ( 'index auto creation works with mutation' , async ( ) => {
@@ -786,7 +849,6 @@ describe('LocalStore w/ IndexedDB Persistence (Non generic)', () => {
786
849
test . assertRemoteDocumentsRead ( 0 , 2 ) ;
787
850
test . assertQueryReturned ( 'coll/a' , 'coll/e' ) ;
788
851
789
- test . configureIndexAutoCreation ( { isEnabled : false } ) ;
790
852
await test . backfillIndexes ( ) ;
791
853
await test . executeQuery ( query_ ) ;
792
854
test . assertRemoteDocumentsRead ( 2 , 0 ) ;
@@ -796,6 +858,13 @@ describe('LocalStore w/ IndexedDB Persistence (Non generic)', () => {
796
858
await test . executeQuery ( query_ ) ;
797
859
test . assertRemoteDocumentsRead ( 0 , 2 ) ;
798
860
test . assertQueryReturned ( 'coll/a' , 'coll/e' ) ;
861
+
862
+ // Field index is created again.
863
+ await test . backfillIndexes ( ) ;
864
+
865
+ await test . executeQuery ( query_ ) ;
866
+ test . assertRemoteDocumentsRead ( 2 , 0 ) ;
867
+ test . assertQueryReturned ( 'coll/a' , 'coll/e' ) ;
799
868
} ) ;
800
869
801
870
it ( 'delete all indexes works with manual added indexes' , async ( ) => {
0 commit comments