Skip to content

Commit 70ee60c

Browse files
authored
Replace FilterList with std::vector<Filter> for future maintenance (#10398)
1 parent 0e9f9ae commit 70ee60c

File tree

12 files changed

+144
-150
lines changed

12 files changed

+144
-150
lines changed

Firestore/core/src/bundle/bundle_serializer.cc

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ using core::Bound;
5151
using core::Direction;
5252
using core::FieldFilter;
5353
using core::Filter;
54-
using core::FilterList;
5554
using core::LimitType;
5655
using core::OrderBy;
5756
using core::OrderByList;
@@ -400,8 +399,8 @@ ResourcePath BundleSerializer::DecodeName(JsonReader& reader,
400399
return path.PopFirst(5);
401400
}
402401

403-
FilterList BundleSerializer::DecodeWhere(JsonReader& reader,
404-
const json& query) const {
402+
std::vector<Filter> BundleSerializer::DecodeWhere(JsonReader& reader,
403+
const json& query) const {
405404
// Absent 'where' is a valid case.
406405
if (!query.contains("where")) {
407406
return {};
@@ -413,13 +412,12 @@ FilterList BundleSerializer::DecodeWhere(JsonReader& reader,
413412
return {};
414413
}
415414

416-
FilterList result;
417415
if (where.contains("compositeFilter")) {
418416
return DecodeCompositeFilter(reader, where.at("compositeFilter"));
419417
} else if (where.contains("fieldFilter")) {
420-
return result.push_back(DecodeFieldFilter(reader, where.at("fieldFilter")));
418+
return {DecodeFieldFilter(reader, where.at("fieldFilter"))};
421419
} else if (where.contains("unaryFilter")) {
422-
return result.push_back(DecodeUnaryFilter(reader, where.at("unaryFilter")));
420+
return {DecodeUnaryFilter(reader, where.at("unaryFilter"))};
423421
} else {
424422
reader.Fail("'where' does not have valid filter");
425423
return {};
@@ -446,8 +444,8 @@ Filter BundleSerializer::DecodeFieldFilter(JsonReader& reader,
446444
return FieldFilter::Create(path, op, std::move(value));
447445
}
448446

449-
FilterList BundleSerializer::DecodeCompositeFilter(JsonReader& reader,
450-
const json& filter) const {
447+
std::vector<Filter> BundleSerializer::DecodeCompositeFilter(
448+
JsonReader& reader, const json& filter) const {
451449
if (reader.RequiredString("op", filter) != "AND") {
452450
reader.Fail("The SDK only supports composite filters of type 'AND'");
453451
return {};
@@ -458,14 +456,14 @@ FilterList BundleSerializer::DecodeCompositeFilter(JsonReader& reader,
458456
reader.OptionalArray("filters", filter, default_filters);
459457

460458
const json default_objects;
461-
FilterList result;
459+
std::vector<Filter> result;
462460
for (const auto& f : filters) {
463461
const json& field_filter =
464462
reader.OptionalObject("fieldFilter", f, default_objects);
465463
if (!field_filter.empty()) {
466-
result = result.push_back(DecodeFieldFilter(reader, field_filter));
464+
result.push_back(DecodeFieldFilter(reader, field_filter));
467465
} else {
468-
result = result.push_back(DecodeUnaryFilter(
466+
result.push_back(DecodeUnaryFilter(
469467
reader, reader.OptionalObject("unaryFilter", f, default_objects)));
470468
}
471469

Firestore/core/src/bundle/bundle_serializer.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "Firestore/core/src/bundle/bundled_document_metadata.h"
2727
#include "Firestore/core/src/bundle/named_query.h"
2828
#include "Firestore/core/src/core/core_fwd.h"
29+
#include "Firestore/core/src/core/filter.h"
2930
#include "Firestore/core/src/model/resource_path.h"
3031
#include "Firestore/core/src/model/snapshot_version.h"
3132
#include "Firestore/core/src/nanopb/message.h"
@@ -60,12 +61,12 @@ class BundleSerializer {
6061
private:
6162
BundledQuery DecodeBundledQuery(util::JsonReader& reader,
6263
const nlohmann::json& query) const;
63-
core::FilterList DecodeWhere(util::JsonReader& reader,
64-
const nlohmann::json& query) const;
64+
std::vector<core::Filter> DecodeWhere(util::JsonReader& reader,
65+
const nlohmann::json& query) const;
6566
core::Filter DecodeFieldFilter(util::JsonReader& reader,
6667
const nlohmann::json& filter) const;
67-
core::FilterList DecodeCompositeFilter(util::JsonReader& reader,
68-
const nlohmann::json& filter) const;
68+
std::vector<core::Filter> DecodeCompositeFilter(
69+
util::JsonReader& reader, const nlohmann::json& filter) const;
6970
nanopb::Message<google_firestore_v1_Value> DecodeValue(
7071
util::JsonReader& reader, const nlohmann::json& value) const;
7172

Firestore/core/src/core/core_fwd.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,6 @@ class EventListener;
7272

7373
using CollectionGroupId = std::shared_ptr<const std::string>;
7474

75-
using FilterList = immutable::AppendOnlyList<Filter>;
76-
7775
using OrderByList = immutable::AppendOnlyList<OrderBy>;
7876

7977
using TransactionResultCallback = util::StatusCallback;

Firestore/core/src/core/filter.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@
2727
namespace firebase {
2828
namespace firestore {
2929

30-
namespace immutable {
31-
template <typename T>
32-
class AppendOnlyList;
33-
} // namespace immutable
34-
3530
namespace core {
3631

3732
class FieldFilter;
@@ -177,9 +172,6 @@ inline bool operator!=(const Filter& lhs, const Filter& rhs) {
177172
return !(lhs == rhs);
178173
}
179174

180-
/** A list of Filters, as used in Queries and elsewhere. */
181-
using FilterList = immutable::AppendOnlyList<Filter>;
182-
183175
std::ostream& operator<<(std::ostream& os, const Filter& filter);
184176

185177
} // namespace core

Firestore/core/src/core/query.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,12 @@ Query Query::AddingFilter(Filter filter) const {
172172
explicit_order_bys_[0].field() == *new_inequality_field,
173173
"First orderBy must match inequality field");
174174

175+
std::vector<Filter> filters_copy(filters_);
176+
filters_copy.push_back(std::move(filter));
177+
175178
return {path_,
176179
collection_group_,
177-
filters_.push_back(std::move(filter)),
180+
std::move(filters_copy),
178181
explicit_order_bys_,
179182
limit_,
180183
limit_type_,

Firestore/core/src/core/query.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class Query {
6363
*/
6464
Query(model::ResourcePath path,
6565
CollectionGroupId collection_group,
66-
FilterList filters,
66+
std::vector<Filter> filters,
6767
OrderByList explicit_order_bys,
6868
int32_t limit,
6969
LimitType limit_type,
@@ -108,7 +108,7 @@ class Query {
108108
bool MatchesAllDocuments() const;
109109

110110
/** The filters on the documents returned by the query. */
111-
const FilterList& filters() const {
111+
const std::vector<Filter>& filters() const {
112112
return filters_;
113113
}
114114

@@ -260,10 +260,11 @@ class Query {
260260
std::shared_ptr<const std::string> collection_group_;
261261

262262
// Filters are shared across related Query instance. i.e. when you call
263-
// Query::Filter(f), a new Query instance is created that contains all of the
264-
// existing filters, plus the new one. (Both Query and Filter objects are
265-
// immutable.) Filters are not shared across unrelated Query instances.
266-
FilterList filters_;
263+
// Query::AddingFilter(f), a new Query instance is created that contains
264+
// all of the existing filters, plus the new one. (Both Query and Filter
265+
// objects are immutable.) Filters are not shared across unrelated Query
266+
// instances.
267+
std::vector<Filter> filters_;
267268

268269
// A list of fields given to sort by. This does not include the implicit key
269270
// sort at the end.

Firestore/core/src/core/target.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class Target {
8686
bool IsDocumentQuery() const;
8787

8888
/** The filters on the documents returned by the target. */
89-
const FilterList& filters() const {
89+
const std::vector<Filter>& filters() const {
9090
return filters_;
9191
}
9292

@@ -178,7 +178,7 @@ class Target {
178178
*/
179179
Target(model::ResourcePath path,
180180
CollectionGroupId collection_group,
181-
FilterList filters,
181+
std::vector<Filter> filters,
182182
OrderByList order_bys,
183183
int32_t limit,
184184
absl::optional<Bound> start_at,
@@ -221,7 +221,7 @@ class Target {
221221

222222
model::ResourcePath path_;
223223
std::shared_ptr<const std::string> collection_group_;
224-
FilterList filters_;
224+
std::vector<Filter> filters_;
225225
OrderByList order_bys_;
226226
int32_t limit_ = kNoLimit;
227227
absl::optional<Bound> start_at_;

Firestore/core/src/local/leveldb_index_manager.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -957,17 +957,18 @@ 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.
960961
for (const Filter& term : dnf) {
961-
core::FilterList filter_list;
962+
std::vector<Filter> subfilters;
962963
if (term.IsAFieldFilter()) {
963-
filter_list = filter_list.push_back(term);
964+
subfilters.push_back(term);
964965
} else if (term.IsACompositeFilter()) {
965966
for (const auto& filter : (CompositeFilter(term)).filters()) {
966-
filter_list = filter_list.push_back(filter);
967+
subfilters.push_back(filter);
967968
}
968969
}
969970
subtargets.push_back({target.path(), target.collection_group(),
970-
std::move(filter_list), target.order_bys(),
971+
std::move(subfilters), target.order_bys(),
971972
target.limit(), target.start_at(),
972973
target.end_at()});
973974
}

Firestore/core/src/remote/serializer.cc

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ using core::CompositeFilter;
6666
using core::Direction;
6767
using core::FieldFilter;
6868
using core::Filter;
69-
using core::FilterList;
7069
using core::OrderBy;
7170
using core::OrderByList;
7271
using core::Query;
@@ -757,7 +756,7 @@ Target Serializer::DecodeStructuredQuery(
757756
}
758757
}
759758

760-
FilterList filter_by;
759+
std::vector<Filter> filter_by;
761760
if (query.where.which_filter_type != 0) {
762761
filter_by = DecodeFilters(context, query.where);
763762
}
@@ -803,16 +802,12 @@ Target Serializer::DecodeQueryTarget(
803802
}
804803

805804
google_firestore_v1_StructuredQuery_Filter Serializer::EncodeFilters(
806-
const core::FilterList& filter_list) const {
807-
std::vector<Filter> filters;
808-
for (const auto& filter : filter_list) {
809-
filters.push_back(filter);
810-
}
805+
const std::vector<Filter>& filter_list) const {
811806
return EncodeCompositeFilter(CompositeFilter::Create(
812-
std::move(filters), CompositeFilter::Operator::And));
807+
std::vector<Filter>(filter_list), CompositeFilter::Operator::And));
813808
}
814809

815-
FilterList Serializer::DecodeFilters(
810+
std::vector<Filter> Serializer::DecodeFilters(
816811
ReadContext* context,
817812
google_firestore_v1_StructuredQuery_Filter& proto) const {
818813
Filter decoded_filter = DecodeFilter(context, proto).ValueOrDie();
@@ -824,12 +819,7 @@ FilterList Serializer::DecodeFilters(
824819
if (decoded_filter.IsACompositeFilter()) {
825820
CompositeFilter composite_filter(decoded_filter);
826821
if (composite_filter.IsFlatConjunction()) {
827-
FilterList result;
828-
result = result.reserve(composite_filter.filters().size());
829-
for (const auto& filter : composite_filter.filters()) {
830-
result = result.push_back(filter);
831-
}
832-
return result;
822+
return composite_filter.filters();
833823
}
834824
}
835825

Firestore/core/src/remote/serializer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ class Serializer {
219219
* Decodes the structured query. Modifies the provided proto to release
220220
* ownership of any Value messages.
221221
*/
222-
core::FilterList DecodeFilters(
222+
std::vector<core::Filter> DecodeFilters(
223223
util::ReadContext* context,
224224
google_firestore_v1_StructuredQuery_Filter& proto) const;
225225

@@ -270,7 +270,7 @@ class Serializer {
270270
std::string EncodeLabel(local::QueryPurpose purpose) const;
271271

272272
google_firestore_v1_StructuredQuery_Filter EncodeFilters(
273-
const core::FilterList& filter_list) const;
273+
const std::vector<core::Filter>& filter_list) const;
274274
google_firestore_v1_StructuredQuery_Filter EncodeFilter(
275275
const core::Filter& filter) const;
276276
google_firestore_v1_StructuredQuery_Filter EncodeUnaryOrFieldFilter(

0 commit comments

Comments
 (0)