Skip to content

Commit e5ad9fd

Browse files
authored
Support GetFilters() in core::Filter (#10401)
1 parent d25c83c commit e5ad9fd

File tree

7 files changed

+24
-13
lines changed

7 files changed

+24
-13
lines changed

Firestore/core/src/core/composite_filter.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ class CompositeFilter : public Filter {
138138

139139
const model::FieldPath* GetFirstInequalityField() const override;
140140

141+
std::vector<Filter> GetFilters() const override {
142+
return filters();
143+
}
144+
141145
/**
142146
* Performs a depth-first search to find and return the first FieldFilter in
143147
* the composite filter that satisfies the condition. Returns nullptr if

Firestore/core/src/core/field_filter.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ const std::vector<FieldFilter>& FieldFilter::Rep::GetFlattenedFilters() const {
131131
return Filter::Rep::memoized_flattened_filters_;
132132
}
133133

134+
std::vector<Filter> FieldFilter::Rep::GetFilters() const {
135+
// This is the only filter within this object, so we return a list of size
136+
// one.
137+
return std::vector<Filter>{FieldFilter(std::make_shared<const Rep>(*this))};
138+
}
139+
134140
FieldFilter::Rep::Rep(FieldPath field,
135141
Operator op,
136142
SharedMessage<google_firestore_v1_Value> value_rhs)

Firestore/core/src/core/field_filter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ class FieldFilter : public Filter {
121121

122122
const std::vector<FieldFilter>& GetFlattenedFilters() const override;
123123

124+
std::vector<Filter> GetFilters() const override;
125+
124126
protected:
125127
/**
126128
* Creates a new filter that compares fields and values. Only intended to be

Firestore/core/src/core/filter.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,13 @@ class Filter {
110110
return rep_->GetFlattenedFilters();
111111
}
112112

113+
/**
114+
* Returns a list of all filters that are contained within this filter
115+
*/
116+
std::vector<Filter> GetFilters() const {
117+
return rep_->GetFilters();
118+
}
119+
113120
friend bool operator==(const Filter& lhs, const Filter& rhs);
114121

115122
protected:
@@ -150,6 +157,8 @@ class Filter {
150157

151158
virtual const std::vector<FieldFilter>& GetFlattenedFilters() const = 0;
152159

160+
virtual std::vector<Filter> GetFilters() const = 0;
161+
153162
/**
154163
* Memoized list of all field filters that can be found by
155164
* traversing the tree of filters contained in this composite filter.

Firestore/core/src/local/leveldb_index_manager.cc

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -957,18 +957,9 @@ std::vector<Target> LevelDbIndexManager::GetSubTargets(const Target& target) {
957957
std::vector<Filter> dnf = LogicUtils::GetDnfTerms(CompositeFilter::Create(
958958
std::move(filters), CompositeFilter::Operator::And));
959959

960-
// TODO(orquery): Add getFilters() in Filter class.
961960
for (const Filter& term : dnf) {
962-
std::vector<Filter> subfilters;
963-
if (term.IsAFieldFilter()) {
964-
subfilters.push_back(term);
965-
} else if (term.IsACompositeFilter()) {
966-
for (const auto& filter : (CompositeFilter(term)).filters()) {
967-
subfilters.push_back(filter);
968-
}
969-
}
970961
subtargets.push_back({target.path(), target.collection_group(),
971-
std::move(subfilters), target.order_bys(),
962+
term.GetFilters(), target.order_bys(),
972963
target.limit(), target.start_at(),
973964
target.end_at()});
974965
}

Firestore/core/src/remote/serializer.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,7 @@ google_firestore_v1_StructuredQuery_Filter Serializer::EncodeUnaryOrFieldFilter(
908908
google_firestore_v1_StructuredQuery_Filter Serializer::EncodeCompositeFilter(
909909
const core::CompositeFilter& filter) const {
910910
// If there's only one filter in the composite filter, use it directly.
911-
if (filter.filters().size() == 1u) {
911+
if (filter.filters().size() == 1U) {
912912
return EncodeFilter(filter.filters()[0]);
913913
}
914914

Firestore/core/src/util/logic_utils.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,7 @@ std::vector<core::Filter> LogicUtils::GetDnfTerms(
270270
return {std::move(result)};
271271
}
272272

273-
const CompositeFilter composite_filter(result);
274-
return composite_filter.filters();
273+
return result.GetFilters();
275274
}
276275

277276
} // namespace util

0 commit comments

Comments
 (0)