Skip to content

Commit e64663a

Browse files
authored
Convert Filters to polymorphic value types (#3568)
1 parent 7974497 commit e64663a

22 files changed

+338
-196
lines changed

Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ - (void)testEncodesListenRequestLabels {
546546

547547
- (void)testEncodesUnaryFilter {
548548
auto input = Filter("item", "==", nullptr);
549-
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:*input];
549+
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:input];
550550

551551
GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
552552
GCFSStructuredQuery_UnaryFilter *prop = expected.unaryFilter;
@@ -555,12 +555,12 @@ - (void)testEncodesUnaryFilter {
555555
XCTAssertEqualObjects(actual, expected);
556556

557557
auto roundTripped = [self.serializer decodedUnaryFilter:prop];
558-
XCTAssertEqual(*input, *roundTripped);
558+
XCTAssertEqual(input, roundTripped);
559559
}
560560

561561
- (void)testEncodesFieldFilter {
562562
auto input = Filter("item.part.top", "==", "food");
563-
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:*input];
563+
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:input];
564564

565565
GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
566566
GCFSStructuredQuery_FieldFilter *prop = expected.fieldFilter;
@@ -570,12 +570,12 @@ - (void)testEncodesFieldFilter {
570570
XCTAssertEqualObjects(actual, expected);
571571

572572
auto roundTripped = [self.serializer decodedFieldFilter:prop];
573-
XCTAssertEqual(*input, *roundTripped);
573+
XCTAssertEqual(input, roundTripped);
574574
}
575575

576576
- (void)testEncodesArrayContainsFilter {
577577
auto input = Filter("item.tags", "array_contains", "food");
578-
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:*input];
578+
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:input];
579579

580580
GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
581581
GCFSStructuredQuery_FieldFilter *prop = expected.fieldFilter;
@@ -585,12 +585,12 @@ - (void)testEncodesArrayContainsFilter {
585585
XCTAssertEqualObjects(actual, expected);
586586

587587
auto roundTripped = [self.serializer decodedFieldFilter:prop];
588-
XCTAssertEqual(*input, *roundTripped);
588+
XCTAssertEqual(input, roundTripped);
589589
}
590590

591591
- (void)testEncodesArrayContainsAnyFilter {
592592
auto input = Filter("item.tags", "array-contains-any", Array("food"));
593-
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:*input];
593+
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:input];
594594

595595
GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
596596
GCFSStructuredQuery_FieldFilter *prop = expected.fieldFilter;
@@ -600,12 +600,12 @@ - (void)testEncodesArrayContainsAnyFilter {
600600
XCTAssertEqualObjects(actual, expected);
601601

602602
auto roundTripped = [self.serializer decodedFieldFilter:prop];
603-
XCTAssertEqual(*input, *roundTripped);
603+
XCTAssertEqual(input, roundTripped);
604604
}
605605

606606
- (void)testEncodesInFilter {
607607
auto input = Filter("item.tags", "in", Array("food"));
608-
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:*input];
608+
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:input];
609609

610610
GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
611611
GCFSStructuredQuery_FieldFilter *prop = expected.fieldFilter;
@@ -615,12 +615,12 @@ - (void)testEncodesInFilter {
615615
XCTAssertEqualObjects(actual, expected);
616616

617617
auto roundTripped = [self.serializer decodedFieldFilter:prop];
618-
XCTAssertEqual(*input, *roundTripped);
618+
XCTAssertEqual(input, roundTripped);
619619
}
620620

621621
- (void)testEncodesKeyFieldFilter {
622622
auto input = Filter("__name__", "==", Ref("p/d", "coll/doc"));
623-
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:*input];
623+
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:input];
624624

625625
GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
626626
GCFSStructuredQuery_FieldFilter *prop = expected.fieldFilter;
@@ -630,7 +630,7 @@ - (void)testEncodesKeyFieldFilter {
630630
XCTAssertEqualObjects(actual, expected);
631631

632632
auto roundTripped = [self.serializer decodedFieldFilter:prop];
633-
XCTAssertEqual(*input, *roundTripped);
633+
XCTAssertEqual(input, roundTripped);
634634
}
635635

636636
#pragma mark - encodedQuery

Firestore/Source/Remote/FSTSerializerBeta.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,8 @@ NS_ASSUME_NONNULL_BEGIN
121121
- (core::Query)decodedQueryFromQueryTarget:(GCFSTarget_QueryTarget *)target;
122122

123123
- (GCFSStructuredQuery_Filter *)encodedUnaryOrFieldFilter:(const core::FieldFilter &)filter;
124-
- (std::shared_ptr<const core::FieldFilter>)decodedFieldFilter:
125-
(GCFSStructuredQuery_FieldFilter *)proto;
126-
- (std::shared_ptr<const core::FieldFilter>)decodedUnaryFilter:
127-
(GCFSStructuredQuery_UnaryFilter *)proto;
124+
- (core::FieldFilter)decodedFieldFilter:(GCFSStructuredQuery_FieldFilter *)proto;
125+
- (core::FieldFilter)decodedUnaryFilter:(GCFSStructuredQuery_UnaryFilter *)proto;
128126

129127
- (std::unique_ptr<remote::WatchChange>)decodedWatchChange:(GCFSListenResponse *)watchChange;
130128
- (model::SnapshotVersion)versionFromListenResponse:(GCFSListenResponse *)watchChange;

Firestore/Source/Remote/FSTSerializerBeta.mm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -910,8 +910,8 @@ - (GCFSStructuredQuery_Filter *_Nullable)encodedFilters:(const FilterList &)filt
910910
}
911911
NSMutableArray<GCFSStructuredQuery_Filter *> *protos = [NSMutableArray array];
912912
for (const auto &filter : filters) {
913-
if (filter->IsAFieldFilter()) {
914-
[protos addObject:[self encodedUnaryOrFieldFilter:static_cast<const FieldFilter &>(*filter)]];
913+
if (filter.IsAFieldFilter()) {
914+
[protos addObject:[self encodedUnaryOrFieldFilter:FieldFilter(filter)]];
915915
}
916916
}
917917
if (protos.count == 1) {
@@ -983,14 +983,14 @@ - (GCFSStructuredQuery_Filter *)encodedUnaryOrFieldFilter:(const FieldFilter &)f
983983
return proto;
984984
}
985985

986-
- (std::shared_ptr<const FieldFilter>)decodedFieldFilter:(GCFSStructuredQuery_FieldFilter *)proto {
986+
- (const FieldFilter)decodedFieldFilter:(GCFSStructuredQuery_FieldFilter *)proto {
987987
FieldPath fieldPath = FieldPath::FromServerFormat(util::MakeString(proto.field.fieldPath));
988988
Filter::Operator op = [self decodedFieldFilterOperator:proto.op];
989989
FieldValue value = [self decodedFieldValue:proto.value];
990990
return FieldFilter::Create(std::move(fieldPath), op, std::move(value));
991991
}
992992

993-
- (std::shared_ptr<const FieldFilter>)decodedUnaryFilter:(GCFSStructuredQuery_UnaryFilter *)proto {
993+
- (FieldFilter)decodedUnaryFilter:(GCFSStructuredQuery_UnaryFilter *)proto {
994994
FieldPath field = FieldPath::FromServerFormat(util::MakeString(proto.field.fieldPath));
995995
switch (proto.op) {
996996
case GCFSStructuredQuery_UnaryFilter_Operator_IsNull:

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,8 @@ QuerySnapshot result(firestore_, query_, std::move(snapshot),
205205
}
206206
}
207207

208-
std::shared_ptr<const FieldFilter> filter =
209-
FieldFilter::Create(field_path, op, field_value);
210-
ValidateNewFilter(*filter);
208+
FieldFilter filter = FieldFilter::Create(field_path, op, field_value);
209+
ValidateNewFilter(filter);
211210

212211
return Wrap(query_.AddingFilter(std::move(filter)));
213212
}
@@ -249,7 +248,7 @@ QuerySnapshot result(firestore_, query_, std::move(snapshot),
249248

250249
void Query::ValidateNewFilter(const class Filter& filter) const {
251250
if (filter.IsAFieldFilter()) {
252-
const auto& field_filter = static_cast<const FieldFilter&>(filter);
251+
FieldFilter field_filter(filter);
253252

254253
if (field_filter.IsInequality()) {
255254
const FieldPath* existing_inequality = query_.InequalityFilterField();

Firestore/core/src/firebase/firestore/core/array_contains_any_filter.cc

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "Firestore/core/src/firebase/firestore/core/array_contains_any_filter.h"
1818

19+
#include <memory>
1920
#include <utility>
2021

2122
#include "absl/algorithm/container.h"
@@ -30,13 +31,26 @@ using model::FieldValue;
3031

3132
using Operator = Filter::Operator;
3233

34+
class ArrayContainsAnyFilter::Rep : public FieldFilter::Rep {
35+
public:
36+
Rep(FieldPath field, FieldValue value)
37+
: FieldFilter::Rep(
38+
std::move(field), Operator::ArrayContainsAny, std::move(value)) {
39+
}
40+
41+
Type type() const override {
42+
return Type::kArrayContainsAnyFilter;
43+
}
44+
45+
bool Matches(const model::Document& doc) const override;
46+
};
47+
3348
ArrayContainsAnyFilter::ArrayContainsAnyFilter(FieldPath field,
3449
FieldValue value)
35-
: FieldFilter(
36-
std::move(field), Operator::ArrayContainsAny, std::move(value)) {
50+
: FieldFilter(std::make_shared<Rep>(std::move(field), std::move(value))) {
3751
}
3852

39-
bool ArrayContainsAnyFilter::Matches(const Document& doc) const {
53+
bool ArrayContainsAnyFilter::Rep::Matches(const Document& doc) const {
4054
const FieldValue::Array& array_value = value().array_value();
4155
absl::optional<FieldValue> maybe_lhs = doc.field(field());
4256
if (!maybe_lhs) return false;

Firestore/core/src/firebase/firestore/core/array_contains_any_filter.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@ class ArrayContainsAnyFilter : public FieldFilter {
3333
public:
3434
ArrayContainsAnyFilter(model::FieldPath field, model::FieldValue value);
3535

36-
Type type() const override {
37-
return Type::kArrayContainsAnyFilter;
38-
}
39-
40-
bool Matches(const model::Document& doc) const override;
36+
private:
37+
class Rep;
4138
};
4239

4340
} // namespace core

Firestore/core/src/firebase/firestore/core/array_contains_filter.cc

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "Firestore/core/src/firebase/firestore/core/array_contains_filter.h"
1818

19+
#include <memory>
1920
#include <utility>
2021

2122
#include "absl/algorithm/container.h"
@@ -30,11 +31,26 @@ using model::FieldValue;
3031

3132
using Operator = Filter::Operator;
3233

34+
class ArrayContainsFilter::Rep : public FieldFilter::Rep {
35+
public:
36+
Rep(FieldPath field, FieldValue value)
37+
: FieldFilter::Rep(
38+
std::move(field), Operator::ArrayContains, std::move(value)) {
39+
}
40+
41+
Type type() const override {
42+
return Type::kArrayContainsFilter;
43+
}
44+
45+
bool Matches(const model::Document& doc) const override;
46+
};
47+
3348
ArrayContainsFilter::ArrayContainsFilter(FieldPath field, FieldValue value)
34-
: FieldFilter(std::move(field), Operator::ArrayContains, std::move(value)) {
49+
: FieldFilter(
50+
std::make_shared<const Rep>(std::move(field), std::move(value))) {
3551
}
3652

37-
bool ArrayContainsFilter::Matches(const Document& doc) const {
53+
bool ArrayContainsFilter::Rep::Matches(const Document& doc) const {
3854
absl::optional<FieldValue> maybe_lhs = doc.field(field());
3955
if (!maybe_lhs) return false;
4056

Firestore/core/src/firebase/firestore/core/array_contains_filter.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@ class ArrayContainsFilter : public FieldFilter {
3333
public:
3434
ArrayContainsFilter(model::FieldPath field, model::FieldValue value);
3535

36-
Type type() const override {
37-
return Type::kArrayContainsFilter;
38-
}
39-
40-
bool Matches(const model::Document& doc) const override;
36+
private:
37+
class Rep;
4138
};
4239

4340
} // namespace core

0 commit comments

Comments
 (0)