|
25 | 25 | import static com.google.firebase.firestore.testutil.TestUtil.filter;
|
26 | 26 | import static com.google.firebase.firestore.testutil.TestUtil.key;
|
27 | 27 | import static com.google.firebase.firestore.testutil.TestUtil.map;
|
| 28 | +import static com.google.firebase.firestore.testutil.TestUtil.orFilters; |
28 | 29 | import static com.google.firebase.firestore.testutil.TestUtil.orderBy;
|
29 | 30 | import static com.google.firebase.firestore.testutil.TestUtil.path;
|
30 | 31 | import static com.google.firebase.firestore.testutil.TestUtil.query;
|
@@ -1007,90 +1008,149 @@ public void testPartialIndexAndFullIndex() throws Exception {
|
1007 | 1008 | indexManager.addFieldIndex(fieldIndex("coll", "c", Kind.ASCENDING, "d", Kind.ASCENDING));
|
1008 | 1009 |
|
1009 | 1010 | Query query1 = query("coll").filter(filter("a", "==", 1));
|
1010 |
| - validateIsFullIndex(query1); |
| 1011 | + validateIndexType(query1, IndexManager.IndexType.FULL); |
1011 | 1012 |
|
1012 | 1013 | Query query2 = query("coll").filter(filter("b", "==", 1));
|
1013 |
| - validateIsFullIndex(query2); |
| 1014 | + validateIndexType(query2, IndexManager.IndexType.FULL); |
1014 | 1015 |
|
1015 | 1016 | Query query3 = query("coll").filter(filter("a", "==", 1)).orderBy(orderBy("a"));
|
1016 |
| - validateIsFullIndex(query3); |
| 1017 | + validateIndexType(query3, IndexManager.IndexType.FULL); |
1017 | 1018 |
|
1018 | 1019 | Query query4 = query("coll").filter(filter("b", "==", 1)).orderBy(orderBy("b"));
|
1019 |
| - validateIsFullIndex(query4); |
| 1020 | + validateIndexType(query4, IndexManager.IndexType.FULL); |
1020 | 1021 |
|
1021 | 1022 | Query query5 = query("coll").filter(filter("a", "==", 1)).filter(filter("b", "==", 1));
|
1022 |
| - validateIsPartialIndex(query5); |
| 1023 | + validateIndexType(query5, IndexManager.IndexType.PARTIAL); |
1023 | 1024 |
|
1024 | 1025 | Query query6 = query("coll").filter(filter("a", "==", 1)).orderBy(orderBy("b"));
|
1025 |
| - validateIsPartialIndex(query6); |
| 1026 | + validateIndexType(query6, IndexManager.IndexType.PARTIAL); |
1026 | 1027 |
|
1027 | 1028 | Query query7 = query("coll").filter(filter("b", "==", 1)).orderBy(orderBy("a"));
|
1028 |
| - validateIsPartialIndex(query7); |
| 1029 | + validateIndexType(query7, IndexManager.IndexType.PARTIAL); |
1029 | 1030 |
|
1030 | 1031 | Query query8 = query("coll").filter(filter("c", "==", 1)).filter(filter("d", "==", 1));
|
1031 |
| - validateIsFullIndex(query8); |
| 1032 | + validateIndexType(query8, IndexManager.IndexType.FULL); |
1032 | 1033 |
|
1033 | 1034 | Query query9 =
|
1034 | 1035 | query("coll")
|
1035 | 1036 | .filter(filter("c", "==", 1))
|
1036 | 1037 | .filter(filter("d", "==", 1))
|
1037 | 1038 | .orderBy(orderBy("c"));
|
1038 |
| - validateIsFullIndex(query9); |
| 1039 | + validateIndexType(query9, IndexManager.IndexType.FULL); |
1039 | 1040 |
|
1040 | 1041 | Query query10 =
|
1041 | 1042 | query("coll")
|
1042 | 1043 | .filter(filter("c", "==", 1))
|
1043 | 1044 | .filter(filter("d", "==", 1))
|
1044 | 1045 | .orderBy(orderBy("d"));
|
1045 |
| - validateIsFullIndex(query10); |
| 1046 | + validateIndexType(query10, IndexManager.IndexType.FULL); |
1046 | 1047 |
|
1047 | 1048 | Query query11 =
|
1048 | 1049 | query("coll")
|
1049 | 1050 | .filter(filter("c", "==", 1))
|
1050 | 1051 | .filter(filter("d", "==", 1))
|
1051 | 1052 | .orderBy(orderBy("c"))
|
1052 | 1053 | .orderBy(orderBy("d"));
|
1053 |
| - validateIsFullIndex(query11); |
| 1054 | + validateIndexType(query11, IndexManager.IndexType.FULL); |
1054 | 1055 |
|
1055 | 1056 | Query query12 =
|
1056 | 1057 | query("coll")
|
1057 | 1058 | .filter(filter("c", "==", 1))
|
1058 | 1059 | .filter(filter("d", "==", 1))
|
1059 | 1060 | .orderBy(orderBy("d"))
|
1060 | 1061 | .orderBy(orderBy("c"));
|
1061 |
| - validateIsFullIndex(query12); |
| 1062 | + validateIndexType(query12, IndexManager.IndexType.FULL); |
1062 | 1063 |
|
1063 | 1064 | Query query13 =
|
1064 | 1065 | query("coll")
|
1065 | 1066 | .filter(filter("c", "==", 1))
|
1066 | 1067 | .filter(filter("d", "==", 1))
|
1067 | 1068 | .orderBy(orderBy("e"));
|
1068 |
| - validateIsPartialIndex(query13); |
| 1069 | + validateIndexType(query13, IndexManager.IndexType.PARTIAL); |
1069 | 1070 |
|
1070 | 1071 | Query query14 = query("coll").filter(filter("c", "==", 1)).filter(filter("d", "<=", 1));
|
1071 |
| - validateIsFullIndex(query14); |
| 1072 | + validateIndexType(query14, IndexManager.IndexType.FULL); |
1072 | 1073 |
|
1073 | 1074 | Query query15 =
|
1074 | 1075 | query("coll")
|
1075 | 1076 | .filter(filter("c", "==", 1))
|
1076 | 1077 | .filter(filter("d", ">", 1))
|
1077 | 1078 | .orderBy(orderBy("d"));
|
1078 |
| - validateIsFullIndex(query15); |
| 1079 | + validateIndexType(query15, IndexManager.IndexType.FULL); |
1079 | 1080 | }
|
1080 | 1081 |
|
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", "a", Kind.DESCENDING)); |
| 1086 | + indexManager.addFieldIndex(fieldIndex("coll", "b", Kind.ASCENDING)); |
| 1087 | + indexManager.addFieldIndex(fieldIndex("coll", "b", Kind.ASCENDING, "a", Kind.ASCENDING)); |
| 1088 | + |
| 1089 | + // OR query without orderBy without limit which has missing sub-target indexes. |
| 1090 | + Query query1 = query("coll").filter(orFilters(filter("a", "==", 1), filter("c", "==", 1))); |
| 1091 | + validateIndexType(query1, IndexManager.IndexType.NONE); |
| 1092 | + |
| 1093 | + // OR query with explicit orderBy without limit which has missing sub-target indexes. |
| 1094 | + Query query2 = |
| 1095 | + query("coll") |
| 1096 | + .filter(orFilters(filter("a", "==", 1), filter("c", "==", 1))) |
| 1097 | + .orderBy(orderBy("c")); |
| 1098 | + validateIndexType(query2, IndexManager.IndexType.NONE); |
| 1099 | + |
| 1100 | + // OR query with implicit orderBy without limit which has missing sub-target indexes. |
| 1101 | + Query query3 = query("coll").filter(orFilters(filter("a", "==", 1), filter("c", ">", 1))); |
| 1102 | + validateIndexType(query3, IndexManager.IndexType.NONE); |
| 1103 | + |
| 1104 | + // OR query with explicit orderBy with limit which has missing sub-target indexes. |
| 1105 | + Query query4 = |
| 1106 | + query("coll") |
| 1107 | + .filter(orFilters(filter("a", "==", 1), filter("c", "==", 1))) |
| 1108 | + .orderBy(orderBy("c")) |
| 1109 | + .limitToFirst(2); |
| 1110 | + validateIndexType(query4, IndexManager.IndexType.NONE); |
1084 | 1111 |
|
1085 |
| - private void validateIsFullIndex(Query query) { |
1086 |
| - validateIndex(query, true); |
| 1112 | + // OR query with implicit orderBy with limit which has missing sub-target indexes. |
| 1113 | + Query query5 = |
| 1114 | + query("coll").filter(orFilters(filter("a", "==", 1), filter("c", ">", 1))).limitToLast(2); |
| 1115 | + validateIndexType(query5, IndexManager.IndexType.NONE); |
| 1116 | + |
| 1117 | + // OR query without orderBy without limit which has all sub-target indexes. |
| 1118 | + Query query6 = query("coll").filter(orFilters(filter("a", "==", 1), filter("b", "==", 1))); |
| 1119 | + validateIndexType(query6, IndexManager.IndexType.FULL); |
| 1120 | + |
| 1121 | + // OR query with explicit orderBy without limit which has all sub-target indexes. |
| 1122 | + Query query7 = |
| 1123 | + query("coll") |
| 1124 | + .filter(orFilters(filter("a", "==", 1), filter("b", "==", 1))) |
| 1125 | + .orderBy(orderBy("a")); |
| 1126 | + validateIndexType(query7, IndexManager.IndexType.FULL); |
| 1127 | + |
| 1128 | + // OR query with implicit orderBy without limit which has all sub-target indexes. |
| 1129 | + Query query8 = query("coll").filter(orFilters(filter("a", ">", 1), filter("b", "==", 1))); |
| 1130 | + validateIndexType(query8, IndexManager.IndexType.FULL); |
| 1131 | + |
| 1132 | + // OR query without orderBy with limit which has all sub-target indexes. |
| 1133 | + Query query9 = |
| 1134 | + query("coll").filter(orFilters(filter("a", "==", 1), filter("b", "==", 1))).limitToFirst(2); |
| 1135 | + validateIndexType(query9, IndexManager.IndexType.PARTIAL); |
| 1136 | + |
| 1137 | + // OR query with explicit orderBy with limit which has all sub-target indexes. |
| 1138 | + Query query10 = |
| 1139 | + query("coll") |
| 1140 | + .filter(orFilters(filter("a", "==", 1), filter("b", "==", 1))) |
| 1141 | + .orderBy(orderBy("a")) |
| 1142 | + .limitToFirst(2); |
| 1143 | + validateIndexType(query10, IndexManager.IndexType.PARTIAL); |
| 1144 | + |
| 1145 | + // OR query with implicit orderBy with limit which has all sub-target indexes. |
| 1146 | + Query query11 = |
| 1147 | + query("coll").filter(orFilters(filter("a", ">", 1), filter("b", "==", 1))).limitToLast(2); |
| 1148 | + validateIndexType(query11, IndexManager.IndexType.PARTIAL); |
1087 | 1149 | }
|
1088 | 1150 |
|
1089 |
| - private void validateIndex(Query query, boolean validateFullIndex) { |
| 1151 | + private void validateIndexType(Query query, IndexManager.IndexType expected) { |
1090 | 1152 | IndexManager.IndexType indexType = indexManager.getIndexType(query.toTarget());
|
1091 |
| - assertEquals( |
1092 |
| - indexType, |
1093 |
| - validateFullIndex ? IndexManager.IndexType.FULL : IndexManager.IndexType.PARTIAL); |
| 1153 | + assertEquals(indexType, expected); |
1094 | 1154 | }
|
1095 | 1155 |
|
1096 | 1156 | private void verifySequenceNumber(
|
|
0 commit comments