Skip to content

Commit c2bc7a2

Browse files
committed
Add tests for index type of or queries.
1 parent 3e0d402 commit c2bc7a2

File tree

3 files changed

+96
-24
lines changed

3 files changed

+96
-24
lines changed

firebase-firestore/src/test/java/com/google/firebase/firestore/local/QueryEngineTestCase.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,5 +516,11 @@ public void canPerformOrQueriesUsingFullCollectionScan() throws Exception {
516516
DocumentSet result9 =
517517
expectFullCollectionScan(() -> runQuery(query9, MISSING_LAST_LIMBO_FREE_SNAPSHOT));
518518
assertEquals(docSet(query9.comparator(), doc2), result9);
519+
520+
// Test with limits without orderBy (the __name__ ordering is the tie breaker).
521+
Query query10 =
522+
query("coll").filter(orFilters(filter("a", "==", 2), filter("b", "==", 1))).limitToFirst(1);
523+
DocumentSet result10 = expectFullCollectionScan(() -> runQuery(query10, SnapshotVersion.NONE));
524+
assertEquals(docSet(query10.comparator(), doc2), result10);
519525
}
520526
}

firebase-firestore/src/test/java/com/google/firebase/firestore/local/SQLiteIndexManagerTest.java

Lines changed: 83 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static com.google.firebase.firestore.testutil.TestUtil.filter;
2626
import static com.google.firebase.firestore.testutil.TestUtil.key;
2727
import static com.google.firebase.firestore.testutil.TestUtil.map;
28+
import static com.google.firebase.firestore.testutil.TestUtil.orFilters;
2829
import static com.google.firebase.firestore.testutil.TestUtil.orderBy;
2930
import static com.google.firebase.firestore.testutil.TestUtil.path;
3031
import static com.google.firebase.firestore.testutil.TestUtil.query;
@@ -1007,90 +1008,148 @@ public void testPartialIndexAndFullIndex() throws Exception {
10071008
indexManager.addFieldIndex(fieldIndex("coll", "c", Kind.ASCENDING, "d", Kind.ASCENDING));
10081009

10091010
Query query1 = query("coll").filter(filter("a", "==", 1));
1010-
validateIsFullIndex(query1);
1011+
validateIndexType(query1, IndexManager.IndexType.FULL);
10111012

10121013
Query query2 = query("coll").filter(filter("b", "==", 1));
1013-
validateIsFullIndex(query2);
1014+
validateIndexType(query2, IndexManager.IndexType.FULL);
10141015

10151016
Query query3 = query("coll").filter(filter("a", "==", 1)).orderBy(orderBy("a"));
1016-
validateIsFullIndex(query3);
1017+
validateIndexType(query3, IndexManager.IndexType.FULL);
10171018

10181019
Query query4 = query("coll").filter(filter("b", "==", 1)).orderBy(orderBy("b"));
1019-
validateIsFullIndex(query4);
1020+
validateIndexType(query4, IndexManager.IndexType.FULL);
10201021

10211022
Query query5 = query("coll").filter(filter("a", "==", 1)).filter(filter("b", "==", 1));
1022-
validateIsPartialIndex(query5);
1023+
validateIndexType(query5, IndexManager.IndexType.PARTIAL);
10231024

10241025
Query query6 = query("coll").filter(filter("a", "==", 1)).orderBy(orderBy("b"));
1025-
validateIsPartialIndex(query6);
1026+
validateIndexType(query6, IndexManager.IndexType.PARTIAL);
10261027

10271028
Query query7 = query("coll").filter(filter("b", "==", 1)).orderBy(orderBy("a"));
1028-
validateIsPartialIndex(query7);
1029+
validateIndexType(query7, IndexManager.IndexType.PARTIAL);
10291030

10301031
Query query8 = query("coll").filter(filter("c", "==", 1)).filter(filter("d", "==", 1));
1031-
validateIsFullIndex(query8);
1032+
validateIndexType(query8, IndexManager.IndexType.FULL);
10321033

10331034
Query query9 =
10341035
query("coll")
10351036
.filter(filter("c", "==", 1))
10361037
.filter(filter("d", "==", 1))
10371038
.orderBy(orderBy("c"));
1038-
validateIsFullIndex(query9);
1039+
validateIndexType(query9, IndexManager.IndexType.FULL);
10391040

10401041
Query query10 =
10411042
query("coll")
10421043
.filter(filter("c", "==", 1))
10431044
.filter(filter("d", "==", 1))
10441045
.orderBy(orderBy("d"));
1045-
validateIsFullIndex(query10);
1046+
validateIndexType(query10, IndexManager.IndexType.FULL);
10461047

10471048
Query query11 =
10481049
query("coll")
10491050
.filter(filter("c", "==", 1))
10501051
.filter(filter("d", "==", 1))
10511052
.orderBy(orderBy("c"))
10521053
.orderBy(orderBy("d"));
1053-
validateIsFullIndex(query11);
1054+
validateIndexType(query11, IndexManager.IndexType.FULL);
10541055

10551056
Query query12 =
10561057
query("coll")
10571058
.filter(filter("c", "==", 1))
10581059
.filter(filter("d", "==", 1))
10591060
.orderBy(orderBy("d"))
10601061
.orderBy(orderBy("c"));
1061-
validateIsFullIndex(query12);
1062+
validateIndexType(query12, IndexManager.IndexType.FULL);
10621063

10631064
Query query13 =
10641065
query("coll")
10651066
.filter(filter("c", "==", 1))
10661067
.filter(filter("d", "==", 1))
10671068
.orderBy(orderBy("e"));
1068-
validateIsPartialIndex(query13);
1069+
validateIndexType(query13, IndexManager.IndexType.PARTIAL);
10691070

10701071
Query query14 = query("coll").filter(filter("c", "==", 1)).filter(filter("d", "<=", 1));
1071-
validateIsFullIndex(query14);
1072+
validateIndexType(query14, IndexManager.IndexType.FULL);
10721073

10731074
Query query15 =
10741075
query("coll")
10751076
.filter(filter("c", "==", 1))
10761077
.filter(filter("d", ">", 1))
10771078
.orderBy(orderBy("d"));
1078-
validateIsFullIndex(query15);
1079+
validateIndexType(query15, IndexManager.IndexType.FULL);
10791080
}
10801081

1081-
private void validateIsPartialIndex(Query query) {
1082-
validateIndex(query, false);
1083-
}
1082+
@Test
1083+
public void testIndexTypeForOrQueries() throws Exception {
1084+
indexManager.addFieldIndex(fieldIndex("coll", "a", Kind.ASCENDING));
1085+
indexManager.addFieldIndex(fieldIndex("coll", "b", Kind.ASCENDING));
1086+
indexManager.addFieldIndex(fieldIndex("coll", "b", Kind.ASCENDING, "a", Kind.ASCENDING));
1087+
1088+
// OR query without orderBy without limit which has missing sub-target indexes.
1089+
Query query1 = query("coll").filter(orFilters(filter("a", "==", 1), filter("c", "==", 1)));
1090+
validateIndexType(query1, IndexManager.IndexType.NONE);
1091+
1092+
// OR query with explicit orderBy without limit which has missing sub-target indexes.
1093+
Query query2 =
1094+
query("coll")
1095+
.filter(orFilters(filter("a", "==", 1), filter("c", "==", 1)))
1096+
.orderBy(orderBy("c"));
1097+
validateIndexType(query2, IndexManager.IndexType.NONE);
1098+
1099+
// OR query with implicit orderBy without limit which has missing sub-target indexes.
1100+
Query query3 = query("coll").filter(orFilters(filter("a", "==", 1), filter("c", ">", 1)));
1101+
validateIndexType(query3, IndexManager.IndexType.NONE);
1102+
1103+
// OR query with explicit orderBy with limit which has missing sub-target indexes.
1104+
Query query4 =
1105+
query("coll")
1106+
.filter(orFilters(filter("a", "==", 1), filter("c", "==", 1)))
1107+
.orderBy(orderBy("c"))
1108+
.limitToFirst(2);
1109+
validateIndexType(query4, IndexManager.IndexType.NONE);
10841110

1085-
private void validateIsFullIndex(Query query) {
1086-
validateIndex(query, true);
1111+
// OR query with implicit orderBy with limit which has missing sub-target indexes.
1112+
Query query5 =
1113+
query("coll").filter(orFilters(filter("a", "==", 1), filter("c", ">", 1))).limitToFirst(2);
1114+
validateIndexType(query5, IndexManager.IndexType.NONE);
1115+
1116+
// OR query without orderBy without limit which has all sub-target indexes.
1117+
Query query6 = query("coll").filter(orFilters(filter("a", "==", 1), filter("b", "==", 1)));
1118+
validateIndexType(query6, IndexManager.IndexType.FULL);
1119+
1120+
// OR query with explicit orderBy without limit which has all sub-target indexes.
1121+
Query query7 =
1122+
query("coll")
1123+
.filter(orFilters(filter("a", "==", 1), filter("b", "==", 1)))
1124+
.orderBy(orderBy("a"));
1125+
validateIndexType(query7, IndexManager.IndexType.FULL);
1126+
1127+
// OR query with implicit orderBy without limit which has all sub-target indexes.
1128+
Query query8 = query("coll").filter(orFilters(filter("a", ">", 1), filter("b", "==", 1)));
1129+
validateIndexType(query8, IndexManager.IndexType.FULL);
1130+
1131+
// OR query without orderBy with limit which has all sub-target indexes.
1132+
Query query9 =
1133+
query("coll").filter(orFilters(filter("a", "==", 1), filter("b", "==", 1))).limitToFirst(2);
1134+
validateIndexType(query9, IndexManager.IndexType.PARTIAL);
1135+
1136+
// OR query with explicit orderBy with limit which has all sub-target indexes.
1137+
Query query10 =
1138+
query("coll")
1139+
.filter(orFilters(filter("a", "==", 1), filter("b", "==", 1)))
1140+
.orderBy(orderBy("a"))
1141+
.limitToFirst(2);
1142+
validateIndexType(query10, IndexManager.IndexType.PARTIAL);
1143+
1144+
// OR query with implicit orderBy with limit which has all sub-target indexes.
1145+
Query query11 =
1146+
query("coll").filter(orFilters(filter("a", ">", 1), filter("b", "==", 1))).limitToFirst(2);
1147+
validateIndexType(query11, IndexManager.IndexType.PARTIAL);
10871148
}
10881149

1089-
private void validateIndex(Query query, boolean validateFullIndex) {
1150+
private void validateIndexType(Query query, IndexManager.IndexType expected) {
10901151
IndexManager.IndexType indexType = indexManager.getIndexType(query.toTarget());
1091-
assertEquals(
1092-
indexType,
1093-
validateFullIndex ? IndexManager.IndexType.FULL : IndexManager.IndexType.PARTIAL);
1152+
assertEquals(indexType, expected);
10941153
}
10951154

10961155
private void verifySequenceNumber(

firebase-firestore/src/test/java/com/google/firebase/firestore/local/SQLiteQueryEngineTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,5 +203,12 @@ public void canPerformOrQueriesUsingIndexes() throws Exception {
203203
DocumentSet result9 =
204204
expectOptimizedCollectionScan(() -> runQuery(query9, SnapshotVersion.NONE));
205205
assertEquals(docSet(query9.comparator(), doc2), result9);
206+
207+
// Test with limits without orderBy (the __name__ ordering is the tie breaker).
208+
Query query10 =
209+
query("coll").filter(orFilters(filter("a", "==", 2), filter("b", "==", 1))).limitToFirst(1);
210+
DocumentSet result10 =
211+
expectOptimizedCollectionScan(() -> runQuery(query10, SnapshotVersion.NONE));
212+
assertEquals(docSet(query10.comparator(), doc2), result10);
206213
}
207214
}

0 commit comments

Comments
 (0)