Skip to content

Refactor Filters #3359

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Jul 20, 2019
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions Firestore/Example/Tests/Core/FSTViewTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@

#import "Firestore/Example/Tests/Util/FSTHelpers.h"

#include "Firestore/core/src/firebase/firestore/core/field_filter.h"
#include "Firestore/core/src/firebase/firestore/core/filter.h"
#include "Firestore/core/src/firebase/firestore/core/relation_filter.h"
#include "Firestore/core/src/firebase/firestore/core/view_snapshot.h"
#include "Firestore/core/src/firebase/firestore/model/document_set.h"
#include "Firestore/core/src/firebase/firestore/model/resource_path.h"
Expand All @@ -39,8 +39,8 @@

namespace testutil = firebase::firestore::testutil;
using firebase::firestore::core::DocumentViewChange;
using firebase::firestore::core::FieldFilter;
using firebase::firestore::core::Filter;
using firebase::firestore::core::RelationFilter;
using firebase::firestore::core::ViewSnapshot;
using firebase::firestore::model::ResourcePath;
using firebase::firestore::model::DocumentKeySet;
Expand All @@ -50,6 +50,7 @@

using testing::ElementsAre;
using testutil::Field;
using testutil::Filter;

NS_ASSUME_NONNULL_BEGIN

Expand Down Expand Up @@ -176,9 +177,7 @@ - (void)testDoesNotReturnNilForFirstChanges {

- (void)testFiltersDocumentsBasedOnQueryWithFilter {
FSTQuery *query = [self queryForMessages];
auto filter = std::make_shared<RelationFilter>(Field("sort"), Filter::Operator::LessThanOrEqual,
FieldValue::FromDouble(2));
query = [query queryByAddingFilter:filter];
query = [query queryByAddingFilter:Filter("sort", "<=", 2)];

FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}];
FSTDocument *doc1 =
Expand Down Expand Up @@ -213,9 +212,7 @@ - (void)testFiltersDocumentsBasedOnQueryWithFilter {

- (void)testUpdatesDocumentsBasedOnQueryWithFilter {
FSTQuery *query = [self queryForMessages];
auto filter = std::make_shared<RelationFilter>(Field("sort"), Filter::Operator::LessThanOrEqual,
FieldValue::FromDouble(2));
query = [query queryByAddingFilter:filter];
query = [query queryByAddingFilter:Filter("sort", "<=", 2)];

FSTView *view = [[FSTView alloc] initWithQuery:query remoteDocuments:DocumentKeySet{}];
FSTDocument *doc1 =
Expand Down
15 changes: 7 additions & 8 deletions Firestore/Example/Tests/Remote/FSTSerializerBetaTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@
#import "Firestore/Example/Tests/Util/FSTHelpers.h"

#include "Firestore/core/include/firebase/firestore/firestore_errors.h"
#include "Firestore/core/src/firebase/firestore/core/field_filter.h"
#include "Firestore/core/src/firebase/firestore/core/filter.h"
#include "Firestore/core/src/firebase/firestore/core/relation_filter.h"
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
#include "Firestore/core/src/firebase/firestore/model/field_path.h"
Expand All @@ -64,7 +64,7 @@
namespace util = firebase::firestore::util;
using firebase::Timestamp;
using firebase::firestore::FirestoreErrorCode;
using firebase::firestore::core::RelationFilter;
using firebase::firestore::core::FieldFilter;
using firebase::firestore::model::DatabaseId;
using firebase::firestore::model::DocumentKey;
using firebase::firestore::model::DocumentState;
Expand Down Expand Up @@ -528,9 +528,9 @@ - (void)testEncodesListenRequestLabels {
XCTAssertEqualObjects(result, @{@"goog-listen-tags" : @"existence-filter-mismatch"});
}

- (void)testEncodesRelationFilter {
auto input = std::static_pointer_cast<RelationFilter>(Filter("item.part.top", "==", "food"));
GCFSStructuredQuery_Filter *actual = [self.serializer encodedRelationFilter:*input];
- (void)testEncodesFieldFilter {
auto input = std::static_pointer_cast<FieldFilter>(Filter("item.part.top", "==", "food"));
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:*input];

GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
GCFSStructuredQuery_FieldFilter *prop = expected.fieldFilter;
Expand All @@ -541,9 +541,8 @@ - (void)testEncodesRelationFilter {
}

- (void)testEncodesArrayContainsFilter {
auto input =
std::static_pointer_cast<RelationFilter>(Filter("item.tags", "array_contains", "food"));
GCFSStructuredQuery_Filter *actual = [self.serializer encodedRelationFilter:*input];
auto input = std::static_pointer_cast<FieldFilter>(Filter("item.tags", "array_contains", "food"));
GCFSStructuredQuery_Filter *actual = [self.serializer encodedUnaryOrFieldFilter:*input];

GCFSStructuredQuery_Filter *expected = [GCFSStructuredQuery_Filter message];
GCFSStructuredQuery_FieldFilter *prop = expected.fieldFilter;
Expand Down
4 changes: 1 addition & 3 deletions Firestore/Source/Core/FSTQuery.mm
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,9 @@
#import "Firestore/Source/Util/FSTClasses.h"

#include "Firestore/core/src/firebase/firestore/api/input_validation.h"
#include "Firestore/core/src/firebase/firestore/core/field_filter.h"
#include "Firestore/core/src/firebase/firestore/core/filter.h"
#include "Firestore/core/src/firebase/firestore/core/nan_filter.h"
#include "Firestore/core/src/firebase/firestore/core/null_filter.h"
#include "Firestore/core/src/firebase/firestore/core/query.h"
#include "Firestore/core/src/firebase/firestore/core/relation_filter.h"
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
#include "Firestore/core/src/firebase/firestore/model/field_path.h"
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
Expand Down
4 changes: 2 additions & 2 deletions Firestore/Source/Remote/FSTSerializerBeta.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#include <vector>

#include "Firestore/core/include/firebase/firestore/timestamp.h"
#include "Firestore/core/src/firebase/firestore/core/relation_filter.h"
#include "Firestore/core/src/firebase/firestore/core/field_filter.h"
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
Expand Down Expand Up @@ -120,7 +120,7 @@ NS_ASSUME_NONNULL_BEGIN
- (GCFSTarget_QueryTarget *)encodedQueryTarget:(FSTQuery *)query;
- (FSTQuery *)decodedQueryFromQueryTarget:(GCFSTarget_QueryTarget *)target;

- (GCFSStructuredQuery_Filter *)encodedRelationFilter:(const core::RelationFilter &)filter;
- (GCFSStructuredQuery_Filter *)encodedUnaryOrFieldFilter:(const core::FieldFilter &)filter;

- (std::unique_ptr<remote::WatchChange>)decodedWatchChange:(GCFSListenResponse *)watchChange;
- (model::SnapshotVersion)versionFromListenResponse:(GCFSListenResponse *)watchChange;
Expand Down
62 changes: 31 additions & 31 deletions Firestore/Source/Remote/FSTSerializerBeta.mm
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,9 @@

#include "Firestore/core/include/firebase/firestore/firestore_errors.h"
#include "Firestore/core/include/firebase/firestore/geo_point.h"
#include "Firestore/core/src/firebase/firestore/core/field_filter.h"
#include "Firestore/core/src/firebase/firestore/core/filter.h"
#include "Firestore/core/src/firebase/firestore/core/nan_filter.h"
#include "Firestore/core/src/firebase/firestore/core/null_filter.h"
#include "Firestore/core/src/firebase/firestore/core/query.h"
#include "Firestore/core/src/firebase/firestore/core/relation_filter.h"
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
#include "Firestore/core/src/firebase/firestore/model/field_mask.h"
Expand All @@ -69,9 +67,9 @@
using firebase::Timestamp;
using firebase::firestore::FirestoreErrorCode;
using firebase::firestore::GeoPoint;
using firebase::firestore::core::FieldFilter;
using firebase::firestore::core::Filter;
using firebase::firestore::core::Query;
using firebase::firestore::core::RelationFilter;
using firebase::firestore::model::ArrayTransform;
using firebase::firestore::model::DatabaseId;
using firebase::firestore::model::DocumentKey;
Expand All @@ -98,6 +96,8 @@
using firebase::firestore::remote::WatchTargetChange;
using firebase::firestore::remote::WatchTargetChangeState;

using Operator = Filter::Operator;

NS_ASSUME_NONNULL_BEGIN

@implementation FSTSerializerBeta {
Expand Down Expand Up @@ -888,10 +888,8 @@ - (GCFSStructuredQuery_Filter *_Nullable)encodedFilters:(const Query::FilterList
}
NSMutableArray<GCFSStructuredQuery_Filter *> *protos = [NSMutableArray array];
for (const auto &filter : filters) {
if (filter->type() == Filter::Type::kRelationFilter) {
[protos addObject:[self encodedRelationFilter:static_cast<const RelationFilter &>(*filter)]];
} else {
[protos addObject:[self encodedUnaryFilter:*filter]];
if (filter->IsFieldFilter()) {
[protos addObject:[self encodedUnaryOrFieldFilter:static_cast<const FieldFilter &>(*filter)]];
}
}
if (protos.count == 1) {
Expand Down Expand Up @@ -924,7 +922,7 @@ - (GCFSStructuredQuery_Filter *_Nullable)encodedFilters:(const Query::FilterList
HARD_FAIL("Nested composite filters are not supported");

case GCFSStructuredQuery_Filter_FilterType_OneOfCase_FieldFilter:
result.push_back([self decodedRelationFilter:filter.fieldFilter]);
result.push_back([self decodedFieldFilter:filter.fieldFilter]);
break;

case GCFSStructuredQuery_Filter_FilterType_OneOfCase_UnaryFilter:
Expand All @@ -938,43 +936,45 @@ - (GCFSStructuredQuery_Filter *_Nullable)encodedFilters:(const Query::FilterList
return result;
}

- (GCFSStructuredQuery_Filter *)encodedRelationFilter:(const RelationFilter &)filter {
- (GCFSStructuredQuery_Filter *)encodedUnaryOrFieldFilter:(const FieldFilter &)filter {
GCFSStructuredQuery_Filter *proto = [GCFSStructuredQuery_Filter message];

if (filter.op() == Operator::Equal) {
if (filter.value().is_null()) {
proto.unaryFilter.field = [self encodedFieldPath:filter.field()];
proto.unaryFilter.op = GCFSStructuredQuery_UnaryFilter_Operator_IsNull;
return proto;
}

if (filter.value().is_nan()) {
proto.unaryFilter.field = [self encodedFieldPath:filter.field()];
proto.unaryFilter.op = GCFSStructuredQuery_UnaryFilter_Operator_IsNan;
return proto;
}
}

GCFSStructuredQuery_FieldFilter *fieldFilter = proto.fieldFilter;
fieldFilter.field = [self encodedFieldPath:filter.field()];
fieldFilter.op = [self encodedRelationFilterOperator:filter.op()];
fieldFilter.op = [self encodedFieldFilterOperator:filter.op()];
fieldFilter.value = [self encodedFieldValue:filter.value()];
return proto;
}

- (std::shared_ptr<RelationFilter>)decodedRelationFilter:(GCFSStructuredQuery_FieldFilter *)proto {
- (std::shared_ptr<FieldFilter>)decodedFieldFilter:(GCFSStructuredQuery_FieldFilter *)proto {
FieldPath fieldPath = FieldPath::FromServerFormat(util::MakeString(proto.field.fieldPath));
Filter::Operator op = [self decodedRelationFilterOperator:proto.op];
Filter::Operator op = [self decodedFieldFilterOperator:proto.op];
FieldValue value = [self decodedFieldValue:proto.value];
return std::make_shared<RelationFilter>(std::move(fieldPath), op, std::move(value));
}

- (GCFSStructuredQuery_Filter *)encodedUnaryFilter:(const Filter &)filter {
GCFSStructuredQuery_Filter *proto = [GCFSStructuredQuery_Filter message];
proto.unaryFilter.field = [self encodedFieldPath:filter.field()];
if (filter.type() == Filter::Type::kNanFilter) {
proto.unaryFilter.op = GCFSStructuredQuery_UnaryFilter_Operator_IsNan;
} else if (filter.type() == Filter::Type::kNullFilter) {
proto.unaryFilter.op = GCFSStructuredQuery_UnaryFilter_Operator_IsNull;
} else {
HARD_FAIL("Unrecognized filter: %s", filter.ToString());
}
return proto;
return FieldFilter::Create(std::move(fieldPath), op, std::move(value));
}

- (std::shared_ptr<Filter>)decodedUnaryFilter:(GCFSStructuredQuery_UnaryFilter *)proto {
FieldPath field = FieldPath::FromServerFormat(util::MakeString(proto.field.fieldPath));
switch (proto.op) {
case GCFSStructuredQuery_UnaryFilter_Operator_IsNan:
return std::make_shared<core::NanFilter>(std::move(field));
return FieldFilter::Create(std::move(field), Operator::Equal, FieldValue::Nan());

case GCFSStructuredQuery_UnaryFilter_Operator_IsNull:
return std::make_shared<core::NullFilter>(std::move(field));
return FieldFilter::Create(std::move(field), Operator::Equal, FieldValue::Null());

default:
HARD_FAIL("Unrecognized UnaryFilter.operator %s", proto.op);
Expand All @@ -987,7 +987,7 @@ - (GCFSStructuredQuery_FieldReference *)encodedFieldPath:(const FieldPath &)fiel
return ref;
}

- (GCFSStructuredQuery_FieldFilter_Operator)encodedRelationFilterOperator:
- (GCFSStructuredQuery_FieldFilter_Operator)encodedFieldFilterOperator:
(Filter::Operator)filterOperator {
switch (filterOperator) {
case Filter::Operator::LessThan:
Expand All @@ -1007,7 +1007,7 @@ - (GCFSStructuredQuery_FieldFilter_Operator)encodedRelationFilterOperator:
}
}

- (Filter::Operator)decodedRelationFilterOperator:
- (Filter::Operator)decodedFieldFilterOperator:
(GCFSStructuredQuery_FieldFilter_Operator)filterOperator {
switch (filterOperator) {
case GCFSStructuredQuery_FieldFilter_Operator_LessThan:
Expand Down
3 changes: 1 addition & 2 deletions Firestore/core/src/firebase/firestore/api/query_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#include "Firestore/core/src/firebase/firestore/core/event_listener.h"
#include "Firestore/core/src/firebase/firestore/core/filter.h"
#include "Firestore/core/src/firebase/firestore/core/listen_options.h"
#include "Firestore/core/src/firebase/firestore/core/relation_filter.h"
#include "Firestore/core/src/firebase/firestore/model/field_value.h"
#include "Firestore/core/src/firebase/firestore/objc/objc_class.h"

Expand Down Expand Up @@ -164,7 +163,7 @@ class Query {
}

private:
void ValidateNewRelationFilter(const core::RelationFilter& filter) const;
void ValidateNewFilter(const core::Filter& filter) const;
void ValidateNewOrderByPath(const model::FieldPath& fieldPath) const;
void ValidateOrderByField(const model::FieldPath& orderByField,
const model::FieldPath& inequalityField) const;
Expand Down
Loading