22
22
23
23
#include " firebase/app.h"
24
24
#include " firebase/firestore.h"
25
+ #include " firebase/firestore/filter.h"
25
26
#include " firebase/log.h"
26
27
#include " firebase_core/firebase_core_plugin_c_api.h"
27
28
#include " messages.g.h"
@@ -1151,6 +1152,81 @@ std::vector<std::vector<EncodableValue>> ConvertToConditions(
1151
1152
return conditions;
1152
1153
}
1153
1154
1155
+ using firebase::firestore::Filter;
1156
+
1157
+ firebase::firestore::Filter filterFromJson (const EncodableMap& map) {
1158
+ if (map.find (EncodableValue (" fieldPath" )) != map.end ()) {
1159
+ // Deserialize a FilterQuery
1160
+ std::string op = std::get<std::string>(map.at (EncodableValue (" op" )));
1161
+ const FieldPath& fieldPath = std::any_cast<FieldPath>(
1162
+ std::get<CustomEncodableValue>(map.at (EncodableValue (" fieldPath" ))));
1163
+
1164
+ auto value = map.at (EncodableValue (" value" ));
1165
+
1166
+ // All the operators from Firebase
1167
+ if (op == " ==" ) {
1168
+ return Filter::EqualTo (fieldPath,
1169
+ CloudFirestorePlugin::ConvertToFieldValue (value));
1170
+ } else if (op == " !=" ) {
1171
+ return Filter::NotEqualTo (
1172
+ fieldPath, CloudFirestorePlugin::ConvertToFieldValue (value));
1173
+ } else if (op == " <" ) {
1174
+ return Filter::LessThan (fieldPath,
1175
+ CloudFirestorePlugin::ConvertToFieldValue (value));
1176
+ } else if (op == " <=" ) {
1177
+ return Filter::LessThanOrEqualTo (
1178
+ fieldPath, CloudFirestorePlugin::ConvertToFieldValue (value));
1179
+ } else if (op == " >" ) {
1180
+ return Filter::GreaterThan (
1181
+ fieldPath, CloudFirestorePlugin::ConvertToFieldValue (value));
1182
+ } else if (op == " >=" ) {
1183
+ return Filter::GreaterThanOrEqualTo (
1184
+ fieldPath, CloudFirestorePlugin::ConvertToFieldValue (value));
1185
+ } else if (op == " array-contains" ) {
1186
+ return Filter::ArrayContains (
1187
+ fieldPath, CloudFirestorePlugin::ConvertToFieldValue (value));
1188
+ } else if (op == " array-contains-any" ) {
1189
+ // Here you should make sure 'value' is the correct type, e.g., a vector
1190
+ return Filter::ArrayContainsAny (
1191
+ fieldPath,
1192
+ ConvertToFieldValueList (std::get<flutter::EncodableList>(value)));
1193
+ } else if (op == " in" ) {
1194
+ return Filter::In (
1195
+ fieldPath,
1196
+ ConvertToFieldValueList (std::get<flutter::EncodableList>(value)));
1197
+ } else if (op == " not-in" ) {
1198
+ return Filter::NotIn (
1199
+ fieldPath,
1200
+ ConvertToFieldValueList (std::get<flutter::EncodableList>(value)));
1201
+ } else {
1202
+ throw std::runtime_error (" Invalid operator" );
1203
+ }
1204
+ }
1205
+
1206
+ // Deserialize a FilterOperator
1207
+ std::string op = std::get<std::string>(map.at (EncodableValue (" op" )));
1208
+ // Assuming the queries are a list of maps
1209
+
1210
+ std::vector<EncodableMap> queries;
1211
+ for (const auto & query :
1212
+ std::get<flutter::EncodableList>(map.at (EncodableValue (" queries" )))) {
1213
+ queries.push_back (std::get<EncodableMap>(query));
1214
+ }
1215
+
1216
+ std::vector<Filter> parsedFilters;
1217
+ for (const auto & query : queries) {
1218
+ parsedFilters.push_back (filterFromJson (query));
1219
+ }
1220
+
1221
+ if (op == " OR" ) {
1222
+ return Filter::Or (parsedFilters);
1223
+ } else if (op == " AND" ) {
1224
+ return Filter::And (parsedFilters);
1225
+ }
1226
+
1227
+ throw std::runtime_error (" Invalid operator" );
1228
+ }
1229
+
1154
1230
firebase::firestore::Query ParseQuery (firebase::firestore::Firestore* firestore,
1155
1231
const std::string& path,
1156
1232
bool isCollectionGroup,
@@ -1164,10 +1240,10 @@ firebase::firestore::Query ParseQuery(firebase::firestore::Firestore* firestore,
1164
1240
query = firestore->Collection (path);
1165
1241
}
1166
1242
1167
- // Assume filterFromJson function converts filters to appropriate Firestore
1168
- // filter
1169
- // TODO: not available in the SDK
1170
- // auto filter = filterFromJson(*parameters.filters());
1243
+ if (parameters. filters ()) {
1244
+ Filter filter = filterFromJson (*parameters. filters ());
1245
+ query = query. Where (filter);
1246
+ }
1171
1247
1172
1248
std::vector<std::vector<EncodableValue>> conditions =
1173
1249
ConvertToConditions (*parameters.where ());
0 commit comments