Skip to content

Commit 3ada38a

Browse files
committed
Port api::Query::ValidateNewFilter
1 parent 1c435e0 commit 3ada38a

File tree

2 files changed

+44
-46
lines changed

2 files changed

+44
-46
lines changed

Firestore/core/src/firebase/firestore/api/query_core.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include "Firestore/core/src/firebase/firestore/api/source.h"
2727
#include "Firestore/core/src/firebase/firestore/core/direction.h"
2828
#include "Firestore/core/src/firebase/firestore/core/event_listener.h"
29-
#include "Firestore/core/src/firebase/firestore/core/field_filter.h"
3029
#include "Firestore/core/src/firebase/firestore/core/filter.h"
3130
#include "Firestore/core/src/firebase/firestore/core/listen_options.h"
3231
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
@@ -164,7 +163,7 @@ class Query {
164163
}
165164

166165
private:
167-
void ValidateNewFieldFilter(const core::FieldFilter& filter) const;
166+
void ValidateNewFilter(const core::Filter& filter) const;
168167
void ValidateNewOrderByPath(const model::FieldPath& fieldPath) const;
169168
void ValidateOrderByField(const model::FieldPath& orderByField,
170169
const model::FieldPath& inequalityField) const;

Firestore/core/src/firebase/firestore/api/query_core.mm

Lines changed: 43 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -28,33 +28,30 @@
2828
#include "Firestore/core/src/firebase/firestore/core/filter.h"
2929
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
3030

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-
5231
NS_ASSUME_NONNULL_BEGIN
5332

5433
namespace firebase {
5534
namespace firestore {
5635
namespace api {
5736

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+
5855
Query::Query(FSTQuery* query, std::shared_ptr<Firestore> firestore)
5956
: firestore_{std::move(firestore)}, query_{query} {
6057
}
@@ -228,10 +225,7 @@ QuerySnapshot result(firestore_, query_, std::move(snapshot),
228225

229226
std::shared_ptr<FieldFilter> filter =
230227
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);
235229

236230
return Wrap([query_ queryByAddingFilter:filter]);
237231
}
@@ -273,27 +267,32 @@ QuerySnapshot result(firestore_, query_, std::move(snapshot),
273267
return Wrap([query() queryByAddingEndAt:bound]);
274268
}
275269

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();
286277

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+
}
295295
}
296-
}
297296
}
298297

299298
void Query::ValidateNewOrderByPath(const FieldPath& fieldPath) const {

0 commit comments

Comments
 (0)