@@ -881,89 +881,104 @@ - (void)testOrQueries {
881
881
[self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter1]
882
882
matchesResult: @[ @" doc1" , @" doc2" , @" doc4" , @" doc5" ]];
883
883
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
-
892
884
// (a==1 && b==0) || (a==3 && b==2)
893
- FIRFilter *filter3 = [FIRFilter orFilterWithFilters: @[
885
+ FIRFilter *filter2 = [FIRFilter orFilterWithFilters: @[
894
886
[FIRFilter andFilterWithFilters: @[
895
887
[FIRFilter filterWhereField: @" a" isEqualTo: @1 ], [FIRFilter filterWhereField: @" b" isEqualTo: @0 ]
896
888
]],
897
889
[FIRFilter andFilterWithFilters: @[
898
890
[FIRFilter filterWhereField: @" a" isEqualTo: @3 ], [FIRFilter filterWhereField: @" b" isEqualTo: @2 ]
899
891
]]
900
892
]];
901
- [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter3 ]
893
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter2 ]
902
894
matchesResult: @[ @" doc1" , @" doc3" ]];
903
895
904
896
// a==1 && (b==0 || b==3).
905
- FIRFilter *filter4 = [FIRFilter andFilterWithFilters: @[
897
+ FIRFilter *filter3 = [FIRFilter andFilterWithFilters: @[
906
898
[FIRFilter filterWhereField: @" a" isEqualTo: @1 ], [FIRFilter orFilterWithFilters: @[
907
899
[FIRFilter filterWhereField: @" b" isEqualTo: @0 ], [FIRFilter filterWhereField: @" b" isEqualTo: @3 ]
908
900
]]
909
901
]];
910
- [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter4 ]
902
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter3 ]
911
903
matchesResult: @[ @" doc1" , @" doc4" ]];
912
904
913
905
// (a==2 || b==2) && (a==3 || b==3)
914
- FIRFilter *filter5 = [FIRFilter andFilterWithFilters: @[
906
+ FIRFilter *filter4 = [FIRFilter andFilterWithFilters: @[
915
907
[FIRFilter orFilterWithFilters: @[
916
908
[FIRFilter filterWhereField: @" a" isEqualTo: @2 ], [FIRFilter filterWhereField: @" b" isEqualTo: @2 ]
917
909
]],
918
910
[FIRFilter orFilterWithFilters: @[
919
911
[FIRFilter filterWhereField: @" a" isEqualTo: @3 ], [FIRFilter filterWhereField: @" b" isEqualTo: @3 ]
920
912
]]
921
913
]];
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" ]];
923
945
924
946
// Test with limits (implicit order by ASC): (a==1) || (b > 0) LIMIT 2
925
- FIRFilter *filter6 = [FIRFilter orFilterWithFilters: @[
947
+ FIRFilter *filter2 = [FIRFilter orFilterWithFilters: @[
926
948
[FIRFilter filterWhereField: @" a" isEqualTo: @1 ], [FIRFilter filterWhereField: @" b"
927
949
isGreaterThan: @0 ]
928
950
]];
929
- [self checkOnlineAndOfflineQuery: [[collRef queryWhereFilter: filter6 ] queryLimitedTo: 2 ]
951
+ [self checkOnlineAndOfflineQuery: [[collRef queryWhereFilter: filter2 ] queryLimitedTo: 2 ]
930
952
matchesResult: @[ @" doc1" , @" doc2" ]];
931
953
932
954
// Test with limits (explicit order by): (a==1) || (b > 0) LIMIT_TO_LAST 2
933
955
// Note: The public query API does not allow implicit ordering when limitToLast is used.
934
- FIRFilter *filter7 = [FIRFilter orFilterWithFilters: @[
956
+ FIRFilter *filter3 = [FIRFilter orFilterWithFilters: @[
935
957
[FIRFilter filterWhereField: @" a" isEqualTo: @1 ], [FIRFilter filterWhereField: @" b"
936
958
isGreaterThan: @0 ]
937
959
]];
938
- [self checkOnlineAndOfflineQuery: [[[collRef queryWhereFilter: filter7 ] queryLimitedToLast: 2 ]
960
+ [self checkOnlineAndOfflineQuery: [[[collRef queryWhereFilter: filter3 ] queryLimitedToLast: 2 ]
939
961
queryOrderedByField: @" b" ]
940
962
matchesResult: @[ @" doc3" , @" doc4" ]];
941
963
942
964
// 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: @[
944
966
[FIRFilter filterWhereField: @" a" isEqualTo: @2 ], [FIRFilter filterWhereField: @" b" isEqualTo: @1 ]
945
967
]];
946
- [self checkOnlineAndOfflineQuery: [[[collRef queryWhereFilter: filter8 ] queryLimitedTo: 1 ]
968
+ [self checkOnlineAndOfflineQuery: [[[collRef queryWhereFilter: filter4 ] queryLimitedTo: 1 ]
947
969
queryOrderedByField: @" a" ]
948
970
matchesResult: @[ @" doc5" ]];
949
971
950
972
// 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: @[
952
974
[FIRFilter filterWhereField: @" a" isEqualTo: @2 ], [FIRFilter filterWhereField: @" b" isEqualTo: @1 ]
953
975
]];
954
- [self checkOnlineAndOfflineQuery: [[[collRef queryWhereFilter: filter9 ] queryLimitedToLast: 1 ]
976
+ [self checkOnlineAndOfflineQuery: [[[collRef queryWhereFilter: filter5 ] queryLimitedToLast: 1 ]
955
977
queryOrderedByField: @" a" ]
956
978
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" ]];
964
979
}
965
980
966
- - (void )testOrQueriesWithInAndNotIn {
981
+ - (void )testOrQueriesWithIn {
967
982
FIRCollectionReference *collRef = [self collectionRefWithDocuments: @{
968
983
@" doc1" : @{@" a" : @1 , @" b" : @0 },
969
984
@" doc2" : @{@" b" : @1 },
@@ -974,19 +989,35 @@ - (void)testOrQueriesWithInAndNotIn {
974
989
}];
975
990
976
991
// a==2 || b in [2,3]
977
- FIRFilter *filter1 = [FIRFilter orFilterWithFilters: @[
992
+ FIRFilter *filter = [FIRFilter orFilterWithFilters: @[
978
993
[FIRFilter filterWhereField: @" a" isEqualTo: @2 ], [FIRFilter filterWhereField: @" b" in: @[ @2 , @3 ]]
979
994
]];
980
- [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter1 ]
995
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter ]
981
996
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
+ }];
982
1013
983
1014
// a==2 || b not-in [2,3]
984
1015
// Has implicit orderBy b.
985
- FIRFilter *filter2 = [FIRFilter orFilterWithFilters: @[
1016
+ FIRFilter *filter = [FIRFilter orFilterWithFilters: @[
986
1017
[FIRFilter filterWhereField: @" a" isEqualTo: @2 ], [FIRFilter filterWhereField: @" b"
987
1018
notIn: @[ @2 , @3 ]]
988
1019
]];
989
- [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter2 ]
1020
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter ]
990
1021
matchesResult: @[ @" doc1" , @" doc2" ]];
991
1022
}
992
1023
@@ -1018,6 +1049,10 @@ - (void)testOrQueriesWithArrayMembership {
1018
1049
}
1019
1050
1020
1051
- (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
+
1021
1056
FIRCollectionReference *collRef = [self collectionRefWithDocuments: @{
1022
1057
@" doc1" : @{@" a" : @1 , @" b" : @0 },
1023
1058
@" doc2" : @{@" b" : @1 },
@@ -1032,66 +1067,24 @@ - (void)testMultipleInOps {
1032
1067
[FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" b"
1033
1068
in: @[ @0 , @2 ]]
1034
1069
]];
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" ]];
1061
1072
1073
+ // Two IN operations on the same field with disjunction.
1062
1074
// 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: @[
1064
1076
[FIRFilter filterWhereField: @" a" in: @[ @0 , @3 ]], [FIRFilter filterWhereField: @" a"
1065
1077
in: @[ @0 , @2 ]]
1066
1078
]];
1067
- [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter5 ]
1079
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter2 ]
1068
1080
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" ]];
1092
1081
}
1093
1082
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
+
1095
1088
FIRCollectionReference *collRef = [self collectionRefWithDocuments: @{
1096
1089
@" doc1" : @{@" a" : @1 , @" b" : @[ @0 ]},
1097
1090
@" doc2" : @{@" b" : @[ @1 ]},
@@ -1108,30 +1101,15 @@ - (void)testUseInWithArrayContainsAny {
1108
1101
[self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter1]
1109
1102
matchesResult: @[ @" doc1" , @" doc3" , @" doc4" , @" doc6" ]];
1110
1103
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: @[
1118
1105
[FIRFilter andFilterWithFilters: @[
1119
1106
[FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" c"
1120
1107
isEqualTo: @10 ]
1121
1108
]],
1122
1109
[FIRFilter filterWhereField: @" b" arrayContainsAny: @[ @0 , @7 ]]
1123
1110
]];
1124
- [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter3 ]
1111
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter2 ]
1125
1112
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" ]];
1135
1113
}
1136
1114
1137
1115
- (void )testUseInWithArrayContains {
@@ -1176,6 +1154,11 @@ - (void)testUseInWithArrayContains {
1176
1154
}
1177
1155
1178
1156
- (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
+
1179
1162
FIRCollectionReference *collRef = [self collectionRefWithDocuments: @{
1180
1163
@" doc1" : @{@" a" : @1 , @" b" : @[ @0 ]},
1181
1164
@" doc2" : @{@" b" : @[ @1 ]},
0 commit comments