@@ -1020,4 +1020,184 @@ - (void)testOrQueriesWithArrayMembership {
10201020 matchesResult: @[ @" doc1" , @" doc4" , @" doc6" ]];
10211021}
10221022
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+
10231203@end
0 commit comments