@@ -1020,4 +1020,184 @@ - (void)testOrQueriesWithArrayMembership {
1020
1020
matchesResult: @[ @" doc1" , @" doc4" , @" doc6" ]];
1021
1021
}
1022
1022
1023
+ - (void )testMultipleInOps {
1024
+ FIRCollectionReference *collRef = [self collectionRefWithDocuments: @{
1025
+ @" doc1" : @{@" a" : @1 , @" b" : @0 },
1026
+ @" doc2" : @{@" b" : @1 },
1027
+ @" doc3" : @{@" a" : @3 , @" b" : @2 },
1028
+ @" doc4" : @{@" a" : @1 , @" b" : @3 },
1029
+ @" doc5" : @{@" a" : @1 },
1030
+ @" doc6" : @{@" a" : @2 }
1031
+ }];
1032
+
1033
+ // Two IN operations on different fields with disjunction.
1034
+ FIRFilter *filter1 = [FIRFilter orFilterWithFilters: @[
1035
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" b"
1036
+ in: @[ @0 , @2 ]]
1037
+ ]];
1038
+ [self checkOnlineAndOfflineQuery: [[collRef queryWhereFilter: filter1] queryOrderedByField: @" a" ]
1039
+ matchesResult: @[ @" doc1" , @" doc6" , @" doc3" ]];
1040
+
1041
+ // Two IN operations on different fields with conjunction.
1042
+ FIRFilter *filter2 = [FIRFilter andFilterWithFilters: @[
1043
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" b"
1044
+ in: @[ @0 , @2 ]]
1045
+ ]];
1046
+ [self checkOnlineAndOfflineQuery: [[collRef queryWhereFilter: filter2] queryOrderedByField: @" a" ]
1047
+ matchesResult: @[ @" doc3" ]];
1048
+
1049
+ // Two IN operations on the same field.
1050
+ // a IN [1,2,3] && a IN [0,1,4] should result in "a==1".
1051
+ FIRFilter *filter3 = [FIRFilter andFilterWithFilters: @[
1052
+ [FIRFilter filterWhereField: @" a" in: @[ @1 , @2 , @3 ]],
1053
+ [FIRFilter filterWhereField: @" a" in: @[ @0 , @1 , @4 ]]
1054
+ ]];
1055
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter3]
1056
+ matchesResult: @[ @" doc1" , @" doc4" , @" doc5" ]];
1057
+
1058
+ // a IN [2,3] && a IN [0,1,4] is never true and so the result should be an empty set.
1059
+ FIRFilter *filter4 = [FIRFilter andFilterWithFilters: @[
1060
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" a"
1061
+ in: @[ @0 , @1 , @4 ]]
1062
+ ]];
1063
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter4] matchesResult: @[]];
1064
+
1065
+ // a IN [0,3] || a IN [0,2] should union them (similar to: a IN [0,2,3]).
1066
+ FIRFilter *filter5 = [FIRFilter orFilterWithFilters: @[
1067
+ [FIRFilter filterWhereField: @" a" in: @[ @0 , @3 ]], [FIRFilter filterWhereField: @" a"
1068
+ in: @[ @0 , @2 ]]
1069
+ ]];
1070
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter5]
1071
+ matchesResult: @[ @" doc3" , @" doc6" ]];
1072
+
1073
+ // Nested composite filter on the same field.
1074
+ FIRFilter *filter6 = [FIRFilter andFilterWithFilters: @[
1075
+ [FIRFilter filterWhereField: @" a" in: @[ @1 , @3 ]], [FIRFilter orFilterWithFilters: @[
1076
+ [FIRFilter filterWhereField: @" a" in: @[ @0 , @2 ]], [FIRFilter andFilterWithFilters: @[
1077
+ [FIRFilter filterWhereField: @" b" isGreaterThanOrEqualTo: @1 ],
1078
+ [FIRFilter filterWhereField: @" a" in: @[ @1 , @3 ]]
1079
+ ]]
1080
+ ]]
1081
+ ]];
1082
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter6]
1083
+ matchesResult: @[ @" doc3" , @" doc4" ]];
1084
+
1085
+ // Nested composite filter on different fields.
1086
+ FIRFilter *filter7 = [FIRFilter andFilterWithFilters: @[
1087
+ [FIRFilter filterWhereField: @" b" in: @[ @0 , @3 ]], [FIRFilter orFilterWithFilters: @[
1088
+ [FIRFilter filterWhereField: @" b" in: @[ @1 ]], [FIRFilter andFilterWithFilters: @[
1089
+ [FIRFilter filterWhereField: @" b" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" a"
1090
+ in: @[ @1 , @3 ]]
1091
+ ]]
1092
+ ]]
1093
+ ]];
1094
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter7] matchesResult: @[ @" doc4" ]];
1095
+ }
1096
+
1097
+ - (void )testUseInWithArrayContainsAny {
1098
+ FIRCollectionReference *collRef = [self collectionRefWithDocuments: @{
1099
+ @" doc1" : @{@" a" : @1 , @" b" : @[ @0 ]},
1100
+ @" doc2" : @{@" b" : @[ @1 ]},
1101
+ @" doc3" : @{@" a" : @3 , @" b" : @[ @2 , @7 ], @" c" : @10 },
1102
+ @" doc4" : @{@" a" : @1 , @" b" : @[ @3 , @7 ]},
1103
+ @" doc5" : @{@" a" : @1 },
1104
+ @" doc6" : @{@" a" : @2 , @" c" : @20 }
1105
+ }];
1106
+
1107
+ FIRFilter *filter1 = [FIRFilter orFilterWithFilters: @[
1108
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" b"
1109
+ arrayContainsAny: @[ @0 , @7 ]]
1110
+ ]];
1111
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter1]
1112
+ matchesResult: @[ @" doc1" , @" doc3" , @" doc4" , @" doc6" ]];
1113
+
1114
+ FIRFilter *filter2 = [FIRFilter andFilterWithFilters: @[
1115
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" b"
1116
+ arrayContainsAny: @[ @0 , @7 ]]
1117
+ ]];
1118
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter2] matchesResult: @[ @" doc3" ]];
1119
+
1120
+ FIRFilter *filter3 = [FIRFilter orFilterWithFilters: @[
1121
+ [FIRFilter andFilterWithFilters: @[
1122
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" c"
1123
+ isEqualTo: @10 ]
1124
+ ]],
1125
+ [FIRFilter filterWhereField: @" b" arrayContainsAny: @[ @0 , @7 ]]
1126
+ ]];
1127
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter3]
1128
+ matchesResult: @[ @" doc1" , @" doc3" , @" doc4" ]];
1129
+
1130
+ FIRFilter *filter4 = [FIRFilter andFilterWithFilters: @[
1131
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter orFilterWithFilters: @[
1132
+ [FIRFilter filterWhereField: @" b" arrayContainsAny: @[ @0 , @7 ]],
1133
+ [FIRFilter filterWhereField: @" c" isEqualTo: @20 ]
1134
+ ]]
1135
+ ]];
1136
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter4]
1137
+ matchesResult: @[ @" doc3" , @" doc6" ]];
1138
+ }
1139
+
1140
+ - (void )testUseInWithArrayContains {
1141
+ FIRCollectionReference *collRef = [self collectionRefWithDocuments: @{
1142
+ @" doc1" : @{@" a" : @1 , @" b" : @[ @0 ]},
1143
+ @" doc2" : @{@" b" : @[ @1 ]},
1144
+ @" doc3" : @{@" a" : @3 , @" b" : @[ @2 , @7 ]},
1145
+ @" doc4" : @{@" a" : @1 , @" b" : @[ @3 , @7 ]},
1146
+ @" doc5" : @{@" a" : @1 },
1147
+ @" doc6" : @{@" a" : @2 }
1148
+ }];
1149
+
1150
+ FIRFilter *filter1 = [FIRFilter orFilterWithFilters: @[
1151
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" b"
1152
+ arrayContainsAny: @[ @3 ]]
1153
+ ]];
1154
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter1]
1155
+ matchesResult: @[ @" doc3" , @" doc4" , @" doc6" ]];
1156
+
1157
+ FIRFilter *filter2 = [FIRFilter andFilterWithFilters: @[
1158
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter filterWhereField: @" b"
1159
+ arrayContains: @7 ]
1160
+ ]];
1161
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter2] matchesResult: @[ @" doc3" ]];
1162
+
1163
+ FIRFilter *filter3 = [FIRFilter orFilterWithFilters: @[
1164
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter andFilterWithFilters: @[
1165
+ [FIRFilter filterWhereField: @" b" arrayContains: @3 ], [FIRFilter filterWhereField: @" a"
1166
+ isEqualTo: @1 ]
1167
+ ]]
1168
+ ]];
1169
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter3]
1170
+ matchesResult: @[ @" doc3" , @" doc4" , @" doc6" ]];
1171
+
1172
+ FIRFilter *filter4 = [FIRFilter andFilterWithFilters: @[
1173
+ [FIRFilter filterWhereField: @" a" in: @[ @2 , @3 ]], [FIRFilter orFilterWithFilters: @[
1174
+ [FIRFilter filterWhereField: @" b" arrayContains: @7 ], [FIRFilter filterWhereField: @" a"
1175
+ isEqualTo: @1 ]
1176
+ ]]
1177
+ ]];
1178
+ [self checkOnlineAndOfflineQuery: [collRef queryWhereFilter: filter4] matchesResult: @[ @" doc3" ]];
1179
+ }
1180
+
1181
+ - (void )testOrderByEquality {
1182
+ FIRCollectionReference *collRef = [self collectionRefWithDocuments: @{
1183
+ @" doc1" : @{@" a" : @1 , @" b" : @[ @0 ]},
1184
+ @" doc2" : @{@" b" : @[ @1 ]},
1185
+ @" doc3" : @{@" a" : @3 , @" b" : @[ @2 , @7 ], @" c" : @10 },
1186
+ @" doc4" : @{@" a" : @1 , @" b" : @[ @3 , @7 ]},
1187
+ @" doc5" : @{@" a" : @1 },
1188
+ @" doc6" : @{@" a" : @2 , @" c" : @20 }
1189
+ }];
1190
+
1191
+ [self checkOnlineAndOfflineQuery: [[collRef queryWhereFilter: [FIRFilter filterWhereField: @" a"
1192
+ isEqualTo: @1 ]]
1193
+ queryOrderedByField: @" a" ]
1194
+ matchesResult: @[ @" doc1" , @" doc4" , @" doc5" ]];
1195
+
1196
+ [self checkOnlineAndOfflineQuery: [[collRef
1197
+ queryWhereFilter: [FIRFilter filterWhereField: @" a"
1198
+ in: @[ @2 , @3 ]]]
1199
+ queryOrderedByField: @" a" ]
1200
+ matchesResult: @[ @" doc6" , @" doc3" ]];
1201
+ }
1202
+
1023
1203
@end
0 commit comments