|
28 | 28 | #include "Firestore/core/src/firebase/firestore/core/filter.h"
|
29 | 29 | #include "Firestore/core/src/firebase/firestore/model/field_value.h"
|
30 | 30 |
|
31 |
| -namespace util = firebase::firestore::util; |
32 |
| -using firebase::firestore::api::Firestore; |
33 |
| -using firebase::firestore::api::ListenerRegistration; |
34 |
| -using firebase::firestore::api::SnapshotMetadata; |
35 |
| -using firebase::firestore::api::Source; |
36 |
| -using firebase::firestore::api::ThrowInvalidArgument; |
37 |
| -using firebase::firestore::core::AsyncEventListener; |
38 |
| -using firebase::firestore::core::Direction; |
39 |
| -using firebase::firestore::core::EventListener; |
40 |
| -using firebase::firestore::core::FieldFilter; |
41 |
| -using firebase::firestore::core::Filter; |
42 |
| -using firebase::firestore::core::ListenOptions; |
43 |
| -using firebase::firestore::core::QueryListener; |
44 |
| -using firebase::firestore::core::ViewSnapshot; |
45 |
| -using firebase::firestore::model::DocumentKey; |
46 |
| -using firebase::firestore::model::FieldPath; |
47 |
| -using firebase::firestore::model::FieldValue; |
48 |
| -using firebase::firestore::model::ResourcePath; |
49 |
| -using firebase::firestore::util::Status; |
50 |
| -using firebase::firestore::util::StatusOr; |
51 |
| - |
52 | 31 | NS_ASSUME_NONNULL_BEGIN
|
53 | 32 |
|
54 | 33 | namespace firebase {
|
55 | 34 | namespace firestore {
|
56 | 35 | namespace api {
|
57 | 36 |
|
| 37 | +namespace util = firebase::firestore::util; |
| 38 | +using core::AsyncEventListener; |
| 39 | +using core::Direction; |
| 40 | +using core::EventListener; |
| 41 | +using core::FieldFilter; |
| 42 | +using core::Filter; |
| 43 | +using core::ListenOptions; |
| 44 | +using core::QueryListener; |
| 45 | +using core::ViewSnapshot; |
| 46 | +using model::DocumentKey; |
| 47 | +using model::FieldPath; |
| 48 | +using model::FieldValue; |
| 49 | +using model::ResourcePath; |
| 50 | +using util::Status; |
| 51 | +using util::StatusOr; |
| 52 | + |
| 53 | +using Operator = Filter::Operator; |
| 54 | + |
58 | 55 | Query::Query(FSTQuery* query, std::shared_ptr<Firestore> firestore)
|
59 | 56 | : firestore_{std::move(firestore)}, query_{query} {
|
60 | 57 | }
|
@@ -228,10 +225,7 @@ QuerySnapshot result(firestore_, query_, std::move(snapshot),
|
228 | 225 |
|
229 | 226 | std::shared_ptr<FieldFilter> filter =
|
230 | 227 | FieldFilter::Create(field_path, op, field_value);
|
231 |
| - |
232 |
| - if (filter->type() == Filter::Type::kRelationFilter) { |
233 |
| - ValidateNewFieldFilter(static_cast<const FieldFilter&>(*filter)); |
234 |
| - } |
| 228 | + ValidateNewFilter(*filter); |
235 | 229 |
|
236 | 230 | return Wrap([query_ queryByAddingFilter:filter]);
|
237 | 231 | }
|
@@ -273,27 +267,32 @@ QuerySnapshot result(firestore_, query_, std::move(snapshot),
|
273 | 267 | return Wrap([query() queryByAddingEndAt:bound]);
|
274 | 268 | }
|
275 | 269 |
|
276 |
| -void Query::ValidateNewFieldFilter(const FieldFilter& filter) const { |
277 |
| - if (filter.IsInequality()) { |
278 |
| - const FieldPath* existing_field = [query_ inequalityFilterField]; |
279 |
| - if (existing_field && *existing_field != filter.field()) { |
280 |
| - ThrowInvalidArgument( |
281 |
| - "Invalid Query. All where filters with an inequality (lessThan, " |
282 |
| - "lessThanOrEqual, greaterThan, or greaterThanOrEqual) must be on the " |
283 |
| - "same field. But you have inequality filters on '%s' and '%s'", |
284 |
| - existing_field->CanonicalString(), filter.field().CanonicalString()); |
285 |
| - } |
| 270 | +void Query::ValidateNewFilter(const Filter& filter) const { |
| 271 | + if (filter->type() == Filter::Type::kRelationFilter) { |
| 272 | + const auto& field_filter = static_cast<const FieldFilter&>(*filter); |
| 273 | + Operator filter_op = field_filter.op(); |
| 274 | + if (field_filter.IsInequality()) { |
| 275 | + const FieldPath* existing_inequality = [query_ inequalityFilterField]; |
| 276 | + const FieldPath* new_inequality = &filter.field(); |
286 | 277 |
|
287 |
| - const FieldPath* first_order_by_field = [query_ firstSortOrderField]; |
288 |
| - if (first_order_by_field) { |
289 |
| - ValidateOrderByField(*first_order_by_field, filter.field()); |
290 |
| - } |
291 |
| - } else if (filter.op() == Filter::Operator::ArrayContains) { |
292 |
| - if ([query_ hasArrayContainsFilter]) { |
293 |
| - ThrowInvalidArgument( |
294 |
| - "Invalid Query. Queries only support a single arrayContains filter."); |
| 278 | + if (existing_inequality && *existing_inequality != *new_inequality) { |
| 279 | + ThrowInvalidArgument( |
| 280 | + "Invalid Query. All where filters with an inequality (lessThan, " |
| 281 | + "lessThanOrEqual, greaterThan, or greaterThanOrEqual) must be on the " |
| 282 | + "same field. But you have inequality filters on '%s' and '%s'", |
| 283 | + existing_inequality->CanonicalString(), new_inequality->CanonicalString()); |
| 284 | + } |
| 285 | + |
| 286 | + const FieldPath* first_order_by_field = [query_ firstSortOrderField]; |
| 287 | + if (first_order_by_field) { |
| 288 | + ValidateOrderByField(*first_order_by_field, filter.field()); |
| 289 | + } |
| 290 | + } else if (filter_op == Operator::ArrayContains) { |
| 291 | + if ([query_ hasArrayContainsFilter]) { |
| 292 | + ThrowInvalidArgument( |
| 293 | + "Invalid Query. Queries only support a single arrayContains filter."); |
| 294 | + } |
295 | 295 | }
|
296 |
| - } |
297 | 296 | }
|
298 | 297 |
|
299 | 298 | void Query::ValidateNewOrderByPath(const FieldPath& fieldPath) const {
|
|
0 commit comments