Skip to content

Commit b2383a9

Browse files
authored
Reorganize OR query test (#10902)
* Reorganize OR query test * Address comments * Change message
1 parent 76de51f commit b2383a9

File tree

2 files changed

+170
-213
lines changed

2 files changed

+170
-213
lines changed

Firestore/Example/Tests/Integration/API/FIRQueryTests.mm

Lines changed: 86 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -881,89 +881,104 @@ - (void)testOrQueries {
881881
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter1]
882882
matchesResult:@[ @"doc1", @"doc2", @"doc4", @"doc5" ]];
883883

884-
// with one inequality: a>2 || b==1.
885-
FIRFilter *filter2 = [FIRFilter orFilterWithFilters:@[
886-
[FIRFilter filterWhereField:@"a" isGreaterThan:@2], [FIRFilter filterWhereField:@"b"
887-
isEqualTo:@1]
888-
]];
889-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter2]
890-
matchesResult:@[ @"doc5", @"doc2", @"doc3" ]];
891-
892884
// (a==1 && b==0) || (a==3 && b==2)
893-
FIRFilter *filter3 = [FIRFilter orFilterWithFilters:@[
885+
FIRFilter *filter2 = [FIRFilter orFilterWithFilters:@[
894886
[FIRFilter andFilterWithFilters:@[
895887
[FIRFilter filterWhereField:@"a" isEqualTo:@1], [FIRFilter filterWhereField:@"b" isEqualTo:@0]
896888
]],
897889
[FIRFilter andFilterWithFilters:@[
898890
[FIRFilter filterWhereField:@"a" isEqualTo:@3], [FIRFilter filterWhereField:@"b" isEqualTo:@2]
899891
]]
900892
]];
901-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter3]
893+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter2]
902894
matchesResult:@[ @"doc1", @"doc3" ]];
903895

904896
// a==1 && (b==0 || b==3).
905-
FIRFilter *filter4 = [FIRFilter andFilterWithFilters:@[
897+
FIRFilter *filter3 = [FIRFilter andFilterWithFilters:@[
906898
[FIRFilter filterWhereField:@"a" isEqualTo:@1], [FIRFilter orFilterWithFilters:@[
907899
[FIRFilter filterWhereField:@"b" isEqualTo:@0], [FIRFilter filterWhereField:@"b" isEqualTo:@3]
908900
]]
909901
]];
910-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter4]
902+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter3]
911903
matchesResult:@[ @"doc1", @"doc4" ]];
912904

913905
// (a==2 || b==2) && (a==3 || b==3)
914-
FIRFilter *filter5 = [FIRFilter andFilterWithFilters:@[
906+
FIRFilter *filter4 = [FIRFilter andFilterWithFilters:@[
915907
[FIRFilter orFilterWithFilters:@[
916908
[FIRFilter filterWhereField:@"a" isEqualTo:@2], [FIRFilter filterWhereField:@"b" isEqualTo:@2]
917909
]],
918910
[FIRFilter orFilterWithFilters:@[
919911
[FIRFilter filterWhereField:@"a" isEqualTo:@3], [FIRFilter filterWhereField:@"b" isEqualTo:@3]
920912
]]
921913
]];
922-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter5] matchesResult:@[ @"doc3" ]];
914+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter4] matchesResult:@[ @"doc3" ]];
915+
916+
// Test with limits without orderBy (the __name__ ordering is the tie breaker).
917+
FIRFilter *filter5 = [FIRFilter orFilterWithFilters:@[
918+
[FIRFilter filterWhereField:@"a" isEqualTo:@2], [FIRFilter filterWhereField:@"b" isEqualTo:@1]
919+
]];
920+
[self checkOnlineAndOfflineQuery:[[collRef queryWhereFilter:filter5] queryLimitedTo:1]
921+
matchesResult:@[ @"doc2" ]];
922+
}
923+
924+
- (void)testOrQueriesWithCompositeIndexes {
925+
// TODO(orquery): Enable this test against production when possible.
926+
XCTSkipIf(![FSTIntegrationTestCase isRunningAgainstEmulator],
927+
"Skip this test if running against production because order-by-equality is not "
928+
"supported yet.");
929+
930+
FIRCollectionReference *collRef = [self collectionRefWithDocuments:@{
931+
@"doc1" : @{@"a" : @1, @"b" : @0},
932+
@"doc2" : @{@"a" : @2, @"b" : @1},
933+
@"doc3" : @{@"a" : @3, @"b" : @2},
934+
@"doc4" : @{@"a" : @1, @"b" : @3},
935+
@"doc5" : @{@"a" : @1, @"b" : @1}
936+
}];
937+
938+
// with one inequality: a>2 || b==1.
939+
FIRFilter *filter1 = [FIRFilter orFilterWithFilters:@[
940+
[FIRFilter filterWhereField:@"a" isGreaterThan:@2], [FIRFilter filterWhereField:@"b"
941+
isEqualTo:@1]
942+
]];
943+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter1]
944+
matchesResult:@[ @"doc5", @"doc2", @"doc3" ]];
923945

924946
// Test with limits (implicit order by ASC): (a==1) || (b > 0) LIMIT 2
925-
FIRFilter *filter6 = [FIRFilter orFilterWithFilters:@[
947+
FIRFilter *filter2 = [FIRFilter orFilterWithFilters:@[
926948
[FIRFilter filterWhereField:@"a" isEqualTo:@1], [FIRFilter filterWhereField:@"b"
927949
isGreaterThan:@0]
928950
]];
929-
[self checkOnlineAndOfflineQuery:[[collRef queryWhereFilter:filter6] queryLimitedTo:2]
951+
[self checkOnlineAndOfflineQuery:[[collRef queryWhereFilter:filter2] queryLimitedTo:2]
930952
matchesResult:@[ @"doc1", @"doc2" ]];
931953

932954
// Test with limits (explicit order by): (a==1) || (b > 0) LIMIT_TO_LAST 2
933955
// Note: The public query API does not allow implicit ordering when limitToLast is used.
934-
FIRFilter *filter7 = [FIRFilter orFilterWithFilters:@[
956+
FIRFilter *filter3 = [FIRFilter orFilterWithFilters:@[
935957
[FIRFilter filterWhereField:@"a" isEqualTo:@1], [FIRFilter filterWhereField:@"b"
936958
isGreaterThan:@0]
937959
]];
938-
[self checkOnlineAndOfflineQuery:[[[collRef queryWhereFilter:filter7] queryLimitedToLast:2]
960+
[self checkOnlineAndOfflineQuery:[[[collRef queryWhereFilter:filter3] queryLimitedToLast:2]
939961
queryOrderedByField:@"b"]
940962
matchesResult:@[ @"doc3", @"doc4" ]];
941963

942964
// Test with limits (explicit order by ASC): (a==2) || (b == 1) ORDER BY a LIMIT 1
943-
FIRFilter *filter8 = [FIRFilter orFilterWithFilters:@[
965+
FIRFilter *filter4 = [FIRFilter orFilterWithFilters:@[
944966
[FIRFilter filterWhereField:@"a" isEqualTo:@2], [FIRFilter filterWhereField:@"b" isEqualTo:@1]
945967
]];
946-
[self checkOnlineAndOfflineQuery:[[[collRef queryWhereFilter:filter8] queryLimitedTo:1]
968+
[self checkOnlineAndOfflineQuery:[[[collRef queryWhereFilter:filter4] queryLimitedTo:1]
947969
queryOrderedByField:@"a"]
948970
matchesResult:@[ @"doc5" ]];
949971

950972
// Test with limits (explicit order by DESC): (a==2) || (b == 1) ORDER BY a LIMIT_TO_LAST 1
951-
FIRFilter *filter9 = [FIRFilter orFilterWithFilters:@[
973+
FIRFilter *filter5 = [FIRFilter orFilterWithFilters:@[
952974
[FIRFilter filterWhereField:@"a" isEqualTo:@2], [FIRFilter filterWhereField:@"b" isEqualTo:@1]
953975
]];
954-
[self checkOnlineAndOfflineQuery:[[[collRef queryWhereFilter:filter9] queryLimitedToLast:1]
976+
[self checkOnlineAndOfflineQuery:[[[collRef queryWhereFilter:filter5] queryLimitedToLast:1]
955977
queryOrderedByField:@"a"]
956978
matchesResult:@[ @"doc2" ]];
957-
958-
// Test with limits without orderBy (the __name__ ordering is the tie breaker).
959-
FIRFilter *filter10 = [FIRFilter orFilterWithFilters:@[
960-
[FIRFilter filterWhereField:@"a" isEqualTo:@2], [FIRFilter filterWhereField:@"b" isEqualTo:@1]
961-
]];
962-
[self checkOnlineAndOfflineQuery:[[collRef queryWhereFilter:filter10] queryLimitedTo:1]
963-
matchesResult:@[ @"doc2" ]];
964979
}
965980

966-
- (void)testOrQueriesWithInAndNotIn {
981+
- (void)testOrQueriesWithIn {
967982
FIRCollectionReference *collRef = [self collectionRefWithDocuments:@{
968983
@"doc1" : @{@"a" : @1, @"b" : @0},
969984
@"doc2" : @{@"b" : @1},
@@ -974,19 +989,35 @@ - (void)testOrQueriesWithInAndNotIn {
974989
}];
975990

976991
// a==2 || b in [2,3]
977-
FIRFilter *filter1 = [FIRFilter orFilterWithFilters:@[
992+
FIRFilter *filter = [FIRFilter orFilterWithFilters:@[
978993
[FIRFilter filterWhereField:@"a" isEqualTo:@2], [FIRFilter filterWhereField:@"b" in:@[ @2, @3 ]]
979994
]];
980-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter1]
995+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter]
981996
matchesResult:@[ @"doc3", @"doc4", @"doc6" ]];
997+
}
998+
999+
- (void)testOrQueriesWithNotIn {
1000+
// TODO(orquery): Enable this test against production when possible.
1001+
XCTSkipIf(![FSTIntegrationTestCase isRunningAgainstEmulator],
1002+
"Skip this test if running against production because it results in a 'missing index' "
1003+
"error. The Firestore Emulator, however, does serve these queries");
1004+
1005+
FIRCollectionReference *collRef = [self collectionRefWithDocuments:@{
1006+
@"doc1" : @{@"a" : @1, @"b" : @0},
1007+
@"doc2" : @{@"b" : @1},
1008+
@"doc3" : @{@"a" : @3, @"b" : @2},
1009+
@"doc4" : @{@"a" : @1, @"b" : @3},
1010+
@"doc5" : @{@"a" : @1},
1011+
@"doc6" : @{@"a" : @2}
1012+
}];
9821013

9831014
// a==2 || b not-in [2,3]
9841015
// Has implicit orderBy b.
985-
FIRFilter *filter2 = [FIRFilter orFilterWithFilters:@[
1016+
FIRFilter *filter = [FIRFilter orFilterWithFilters:@[
9861017
[FIRFilter filterWhereField:@"a" isEqualTo:@2], [FIRFilter filterWhereField:@"b"
9871018
notIn:@[ @2, @3 ]]
9881019
]];
989-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter2]
1020+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter]
9901021
matchesResult:@[ @"doc1", @"doc2" ]];
9911022
}
9921023

@@ -1018,6 +1049,10 @@ - (void)testOrQueriesWithArrayMembership {
10181049
}
10191050

10201051
- (void)testMultipleInOps {
1052+
// TODO(orquery): Enable this test against production when possible.
1053+
XCTSkipIf(![FSTIntegrationTestCase isRunningAgainstEmulator],
1054+
"Skip this test if running against production because it's not yet supported.");
1055+
10211056
FIRCollectionReference *collRef = [self collectionRefWithDocuments:@{
10221057
@"doc1" : @{@"a" : @1, @"b" : @0},
10231058
@"doc2" : @{@"b" : @1},
@@ -1032,66 +1067,24 @@ - (void)testMultipleInOps {
10321067
[FIRFilter filterWhereField:@"a" in:@[ @2, @3 ]], [FIRFilter filterWhereField:@"b"
10331068
in:@[ @0, @2 ]]
10341069
]];
1035-
[self checkOnlineAndOfflineQuery:[[collRef queryWhereFilter:filter1] queryOrderedByField:@"a"]
1036-
matchesResult:@[ @"doc1", @"doc6", @"doc3" ]];
1037-
1038-
// Two IN operations on different fields with conjunction.
1039-
FIRFilter *filter2 = [FIRFilter andFilterWithFilters:@[
1040-
[FIRFilter filterWhereField:@"a" in:@[ @2, @3 ]], [FIRFilter filterWhereField:@"b"
1041-
in:@[ @0, @2 ]]
1042-
]];
1043-
[self checkOnlineAndOfflineQuery:[[collRef queryWhereFilter:filter2] queryOrderedByField:@"a"]
1044-
matchesResult:@[ @"doc3" ]];
1045-
1046-
// Two IN operations on the same field.
1047-
// a IN [1,2,3] && a IN [0,1,4] should result in "a==1".
1048-
FIRFilter *filter3 = [FIRFilter andFilterWithFilters:@[
1049-
[FIRFilter filterWhereField:@"a" in:@[ @1, @2, @3 ]],
1050-
[FIRFilter filterWhereField:@"a" in:@[ @0, @1, @4 ]]
1051-
]];
1052-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter3]
1053-
matchesResult:@[ @"doc1", @"doc4", @"doc5" ]];
1054-
1055-
// a IN [2,3] && a IN [0,1,4] is never true and so the result should be an empty set.
1056-
FIRFilter *filter4 = [FIRFilter andFilterWithFilters:@[
1057-
[FIRFilter filterWhereField:@"a" in:@[ @2, @3 ]], [FIRFilter filterWhereField:@"a"
1058-
in:@[ @0, @1, @4 ]]
1059-
]];
1060-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter4] matchesResult:@[]];
1070+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter1]
1071+
matchesResult:@[ @"doc1", @"doc3", @"doc6" ]];
10611072

1073+
// Two IN operations on the same field with disjunction.
10621074
// a IN [0,3] || a IN [0,2] should union them (similar to: a IN [0,2,3]).
1063-
FIRFilter *filter5 = [FIRFilter orFilterWithFilters:@[
1075+
FIRFilter *filter2 = [FIRFilter orFilterWithFilters:@[
10641076
[FIRFilter filterWhereField:@"a" in:@[ @0, @3 ]], [FIRFilter filterWhereField:@"a"
10651077
in:@[ @0, @2 ]]
10661078
]];
1067-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter5]
1079+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter2]
10681080
matchesResult:@[ @"doc3", @"doc6" ]];
1069-
1070-
// Nested composite filter on the same field.
1071-
FIRFilter *filter6 = [FIRFilter andFilterWithFilters:@[
1072-
[FIRFilter filterWhereField:@"a" in:@[ @1, @3 ]], [FIRFilter orFilterWithFilters:@[
1073-
[FIRFilter filterWhereField:@"a" in:@[ @0, @2 ]], [FIRFilter andFilterWithFilters:@[
1074-
[FIRFilter filterWhereField:@"b" isGreaterThanOrEqualTo:@1],
1075-
[FIRFilter filterWhereField:@"a" in:@[ @1, @3 ]]
1076-
]]
1077-
]]
1078-
]];
1079-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter6]
1080-
matchesResult:@[ @"doc3", @"doc4" ]];
1081-
1082-
// Nested composite filter on different fields.
1083-
FIRFilter *filter7 = [FIRFilter andFilterWithFilters:@[
1084-
[FIRFilter filterWhereField:@"b" in:@[ @0, @3 ]], [FIRFilter orFilterWithFilters:@[
1085-
[FIRFilter filterWhereField:@"b" in:@[ @1 ]], [FIRFilter andFilterWithFilters:@[
1086-
[FIRFilter filterWhereField:@"b" in:@[ @2, @3 ]], [FIRFilter filterWhereField:@"a"
1087-
in:@[ @1, @3 ]]
1088-
]]
1089-
]]
1090-
]];
1091-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter7] matchesResult:@[ @"doc4" ]];
10921081
}
10931082

1094-
- (void)testUseInWithArrayContainsAny {
1083+
- (void)testUsingInWithArrayContainsAny {
1084+
// TODO(orquery): Enable this test against production when possible.
1085+
XCTSkipIf(![FSTIntegrationTestCase isRunningAgainstEmulator],
1086+
"Skip this test if running against production because it's not yet supported.");
1087+
10951088
FIRCollectionReference *collRef = [self collectionRefWithDocuments:@{
10961089
@"doc1" : @{@"a" : @1, @"b" : @[ @0 ]},
10971090
@"doc2" : @{@"b" : @[ @1 ]},
@@ -1108,30 +1101,15 @@ - (void)testUseInWithArrayContainsAny {
11081101
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter1]
11091102
matchesResult:@[ @"doc1", @"doc3", @"doc4", @"doc6" ]];
11101103

1111-
FIRFilter *filter2 = [FIRFilter andFilterWithFilters:@[
1112-
[FIRFilter filterWhereField:@"a" in:@[ @2, @3 ]], [FIRFilter filterWhereField:@"b"
1113-
arrayContainsAny:@[ @0, @7 ]]
1114-
]];
1115-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter2] matchesResult:@[ @"doc3" ]];
1116-
1117-
FIRFilter *filter3 = [FIRFilter orFilterWithFilters:@[
1104+
FIRFilter *filter2 = [FIRFilter orFilterWithFilters:@[
11181105
[FIRFilter andFilterWithFilters:@[
11191106
[FIRFilter filterWhereField:@"a" in:@[ @2, @3 ]], [FIRFilter filterWhereField:@"c"
11201107
isEqualTo:@10]
11211108
]],
11221109
[FIRFilter filterWhereField:@"b" arrayContainsAny:@[ @0, @7 ]]
11231110
]];
1124-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter3]
1111+
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter2]
11251112
matchesResult:@[ @"doc1", @"doc3", @"doc4" ]];
1126-
1127-
FIRFilter *filter4 = [FIRFilter andFilterWithFilters:@[
1128-
[FIRFilter filterWhereField:@"a" in:@[ @2, @3 ]], [FIRFilter orFilterWithFilters:@[
1129-
[FIRFilter filterWhereField:@"b" arrayContainsAny:@[ @0, @7 ]],
1130-
[FIRFilter filterWhereField:@"c" isEqualTo:@20]
1131-
]]
1132-
]];
1133-
[self checkOnlineAndOfflineQuery:[collRef queryWhereFilter:filter4]
1134-
matchesResult:@[ @"doc3", @"doc6" ]];
11351113
}
11361114

11371115
- (void)testUseInWithArrayContains {
@@ -1176,6 +1154,11 @@ - (void)testUseInWithArrayContains {
11761154
}
11771155

11781156
- (void)testOrderByEquality {
1157+
// TODO(orquery): Enable this test against production when possible.
1158+
XCTSkipIf(![FSTIntegrationTestCase isRunningAgainstEmulator],
1159+
"Skip this test if running against production because order-by-equality is not "
1160+
"supported yet.");
1161+
11791162
FIRCollectionReference *collRef = [self collectionRefWithDocuments:@{
11801163
@"doc1" : @{@"a" : @1, @"b" : @[ @0 ]},
11811164
@"doc2" : @{@"b" : @[ @1 ]},

0 commit comments

Comments
 (0)