Skip to content

Commit 6b3e105

Browse files
committed
[realppl 7] realppl integration with remote/local and unit tests
1 parent 00b7820 commit 6b3e105

File tree

77 files changed

+2882
-408
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+2882
-408
lines changed

Firestore/Example/Firestore.xcodeproj/project.pbxproj

Lines changed: 24 additions & 9 deletions
Large diffs are not rendered by default.

Firestore/Example/Tests/SpecTests/FSTMockDatastore.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ bool IsOpen() const override {
109109
}
110110

111111
void WatchQuery(const TargetData& query) override {
112-
LOG_DEBUG("WatchQuery: %s: %s, %s", query.target_id(), query.target().ToString(),
112+
LOG_DEBUG("WatchQuery: %s: %s, %s", query.target_id(), query.target_or_pipeline().ToString(),
113113
query.resume_token().ToString());
114114

115115
// Snapshot version is ignored on the wire

Firestore/Example/Tests/SpecTests/FSTSpecTests.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,7 @@ - (void)validateActiveTargets {
982982
const TargetData &actual = found->second;
983983

984984
XCTAssertEqual(actual.purpose(), targetData.purpose());
985-
XCTAssertEqual(actual.target(), targetData.target());
985+
XCTAssertEqual(actual.target_or_pipeline(), targetData.target_or_pipeline());
986986
XCTAssertEqual(actual.target_id(), targetData.target_id());
987987
XCTAssertEqual(actual.snapshot_version(), targetData.snapshot_version());
988988
XCTAssertEqual(actual.resume_token(), targetData.resume_token());

Firestore/core/src/api/api_fwd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class Firestore;
4646
class ListenerRegistration;
4747
class Pipeline;
4848
class PipelineSnapshot;
49+
class RealtimePipeline;
4950
class Query;
5051
class QuerySnapshot;
5152
class Settings;

Firestore/core/src/api/expressions.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ google_firestore_v1_Value Constant::to_proto() const {
5050
return *model::DeepClone(*value_).release();
5151
}
5252

53+
const google_firestore_v1_Value& Constant::value() const {
54+
return *value_;
55+
}
56+
5357
std::unique_ptr<core::EvaluableExpr> Constant::ToEvaluable() const {
5458
return std::make_unique<core::CoreConstant>(
5559
std::make_unique<Constant>(*this));

Firestore/core/src/api/expressions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ class Constant : public Expr {
8080
}
8181
google_firestore_v1_Value to_proto() const override;
8282

83+
const google_firestore_v1_Value& value() const;
84+
8385
std::unique_ptr<core::EvaluableExpr> ToEvaluable() const override;
8486

8587
private:

Firestore/core/src/api/ordering.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,18 @@ class Ordering {
4949
return expr_.get();
5050
}
5151

52+
const std::shared_ptr<Expr> expr_shared() const {
53+
return expr_;
54+
}
55+
5256
Direction direction() const {
5357
return direction_;
5458
}
5559

60+
Ordering WithReversedDirection() const {
61+
return Ordering(expr_, direction_ == ASCENDING ? DESCENDING : ASCENDING);
62+
}
63+
5664
google_firestore_v1_Value to_proto() const;
5765

5866
private:

Firestore/core/src/api/query_snapshot.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ void QuerySnapshot::ForEachChange(
110110
// Special case the first snapshot because index calculation is easy and
111111
// fast. Also all changes on the first snapshot are adds so there are also
112112
// no metadata-only changes to filter out.
113-
DocumentComparator doc_comparator = snapshot_.query().Comparator();
113+
DocumentComparator doc_comparator =
114+
snapshot_.query_or_pipeline().Comparator();
114115
absl::optional<Document> last_document;
115116
size_t index = 0;
116117
for (const DocumentViewChange& change : snapshot_.document_changes()) {

Firestore/core/src/api/realtime_pipeline.cc

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <memory>
2020
#include <utility>
2121

22+
#include "Firestore/core/src/core/pipeline_util.h"
2223
#include "Firestore/core/src/remote/serializer.h"
2324

2425
namespace firebase {
@@ -27,16 +28,35 @@ namespace api {
2728

2829
RealtimePipeline::RealtimePipeline(
2930
std::vector<std::shared_ptr<EvaluableStage>> stages,
30-
remote::Serializer serializer)
31-
: stages_(std::move(stages)), serializer_(serializer) {
31+
std::unique_ptr<remote::Serializer> serializer)
32+
: stages_(std::move(stages)), serializer_(std::move(serializer)) {
33+
this->rewritten_stages_ = core::RewriteStages(this->stages());
34+
}
35+
36+
RealtimePipeline::RealtimePipeline(const RealtimePipeline& other)
37+
: stages_(other.stages_),
38+
rewritten_stages_(other.rewritten_stages_),
39+
serializer_(std::make_unique<remote::Serializer>(
40+
other.serializer_->database_id())) {
41+
}
42+
43+
RealtimePipeline& RealtimePipeline::operator=(const RealtimePipeline& other) {
44+
if (this != &other) {
45+
stages_ = other.stages_;
46+
rewritten_stages_ = other.rewritten_stages_;
47+
serializer_ =
48+
std::make_unique<remote::Serializer>(other.serializer_->database_id());
49+
}
50+
return *this;
3251
}
3352

3453
RealtimePipeline RealtimePipeline::AddingStage(
3554
std::shared_ptr<EvaluableStage> stage) {
3655
auto copy = std::vector<std::shared_ptr<EvaluableStage>>(this->stages_);
3756
copy.push_back(stage);
3857

39-
return {copy, serializer_};
58+
return {copy,
59+
std::make_unique<remote::Serializer>(serializer_->database_id())};
4060
}
4161

4262
const std::vector<std::shared_ptr<EvaluableStage>>& RealtimePipeline::stages()
@@ -49,13 +69,8 @@ RealtimePipeline::rewritten_stages() const {
4969
return this->rewritten_stages_;
5070
}
5171

52-
void RealtimePipeline::SetRewrittentStages(
53-
std::vector<std::shared_ptr<EvaluableStage>> stages) {
54-
this->rewritten_stages_ = std::move(stages);
55-
}
56-
57-
EvaluateContext RealtimePipeline::evaluate_context() {
58-
return EvaluateContext(&serializer_);
72+
EvaluateContext RealtimePipeline::evaluate_context() const {
73+
return EvaluateContext(serializer_.get());
5974
}
6075

6176
} // namespace api

Firestore/core/src/api/realtime_pipeline.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,37 @@
1818
#define FIRESTORE_CORE_SRC_API_REALTIME_PIPELINE_H_
1919

2020
#include <memory>
21-
#include <utility>
2221
#include <vector>
2322

24-
#include "Firestore/core/src/api/firestore.h"
25-
#include "Firestore/core/src/api/pipeline_snapshot.h"
2623
#include "Firestore/core/src/api/stages.h"
27-
#include "Firestore/core/src/remote/serializer.h"
2824

2925
namespace firebase {
3026
namespace firestore {
27+
namespace remote {
28+
class Serializer;
29+
} // namespace remote
30+
3131
namespace api {
3232

3333
class RealtimePipeline {
3434
public:
3535
RealtimePipeline(std::vector<std::shared_ptr<EvaluableStage>> stages,
36-
remote::Serializer serializer);
36+
std::unique_ptr<remote::Serializer> serializer);
37+
38+
RealtimePipeline(const RealtimePipeline& other);
39+
RealtimePipeline& operator=(const RealtimePipeline& other);
3740

3841
RealtimePipeline AddingStage(std::shared_ptr<EvaluableStage> stage);
3942

4043
const std::vector<std::shared_ptr<EvaluableStage>>& stages() const;
4144
const std::vector<std::shared_ptr<EvaluableStage>>& rewritten_stages() const;
4245

43-
void SetRewrittentStages(std::vector<std::shared_ptr<EvaluableStage>>);
44-
45-
EvaluateContext evaluate_context();
46+
EvaluateContext evaluate_context() const;
4647

4748
private:
4849
std::vector<std::shared_ptr<EvaluableStage>> stages_;
4950
std::vector<std::shared_ptr<EvaluableStage>> rewritten_stages_;
50-
remote::Serializer serializer_;
51+
std::unique_ptr<remote::Serializer> serializer_;
5152
};
5253

5354
} // namespace api

Firestore/core/src/api/stages.cc

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ google_firestore_v1_Pipeline_Stage CollectionSource::to_proto() const {
5454
result.args = nanopb::MakeArray<google_firestore_v1_Value>(1);
5555
result.args[0].which_value_type =
5656
google_firestore_v1_Value_reference_value_tag;
57-
// TODO: use EncodeResourceName instead
5857
result.args[0].reference_value =
5958
nanopb::MakeBytesArray(this->path_.CanonicalString());
6059

@@ -106,10 +105,12 @@ google_firestore_v1_Pipeline_Stage DocumentsSource::to_proto() const {
106105
result.args_count = documents_.size();
107106
result.args = nanopb::MakeArray<google_firestore_v1_Value>(result.args_count);
108107

109-
for (size_t i = 0; i < documents_.size(); ++i) {
108+
size_t i = 0;
109+
for (const auto& document : documents_) {
110110
result.args[i].which_value_type =
111111
google_firestore_v1_Value_reference_value_tag;
112-
result.args[i].reference_value = nanopb::MakeBytesArray(documents_[i]);
112+
result.args[i].reference_value = nanopb::MakeBytesArray(document);
113+
i++;
113114
}
114115

115116
result.options_count = 0;
@@ -478,6 +479,19 @@ model::PipelineInputOutputVector DatabaseSource::Evaluate(
478479
return results;
479480
}
480481

482+
model::PipelineInputOutputVector DocumentsSource::Evaluate(
483+
const EvaluateContext& /*context*/,
484+
const model::PipelineInputOutputVector& inputs) const {
485+
model::PipelineInputOutputVector results;
486+
for (const model::PipelineInputOutput& input : inputs) {
487+
if (input.is_found_document() &&
488+
documents_.count(input.key().path().CanonicalString()) > 0) {
489+
results.push_back(input);
490+
}
491+
}
492+
return results;
493+
}
494+
481495
model::PipelineInputOutputVector Where::Evaluate(
482496
const EvaluateContext& context,
483497
const model::PipelineInputOutputVector& inputs) const {
@@ -499,16 +513,29 @@ model::PipelineInputOutputVector Where::Evaluate(
499513
model::PipelineInputOutputVector LimitStage::Evaluate(
500514
const EvaluateContext& /*context*/,
501515
const model::PipelineInputOutputVector& inputs) const {
516+
model::PipelineInputOutputVector::const_iterator begin;
517+
model::PipelineInputOutputVector::const_iterator end;
518+
size_t count;
519+
502520
if (limit_ < 0) {
503-
// Or handle as error? Assuming non-negative limit.
504-
return {};
505-
}
506-
size_t count = static_cast<size_t>(limit_);
507-
if (count > inputs.size()) {
508-
count = inputs.size();
521+
// if limit_ is negative, we treat it as limit to last, returns the last
522+
// limit_ documents.
523+
count = static_cast<size_t>(-limit_);
524+
if (count > inputs.size()) {
525+
count = inputs.size();
526+
}
527+
begin = inputs.end() - count;
528+
end = inputs.end();
529+
} else {
530+
count = static_cast<size_t>(limit_);
531+
if (count > inputs.size()) {
532+
count = inputs.size();
533+
}
534+
begin = inputs.begin();
535+
end = inputs.begin() + count;
509536
}
510-
return model::PipelineInputOutputVector(inputs.begin(),
511-
inputs.begin() + count);
537+
538+
return model::PipelineInputOutputVector(begin, end);
512539
}
513540

514541
model::PipelineInputOutputVector SortStage::Evaluate(

Firestore/core/src/api/stages.h

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
#define FIRESTORE_CORE_SRC_API_STAGES_H_
1919

2020
#include <memory>
21+
#include <set>
2122
#include <string>
2223
#include <unordered_map>
23-
#include <utility>
2424
#include <vector>
2525

2626
#include "Firestore/Protos/nanopb/google/firestore/v1/document.nanopb.h"
@@ -85,6 +85,10 @@ class CollectionSource : public EvaluableStage {
8585
return "collection";
8686
}
8787

88+
std::string path() const {
89+
return path_.CanonicalString();
90+
}
91+
8892
model::PipelineInputOutputVector Evaluate(
8993
const EvaluateContext& context,
9094
const model::PipelineInputOutputVector& inputs) const override;
@@ -122,6 +126,10 @@ class CollectionGroupSource : public EvaluableStage {
122126
return "collection_group";
123127
}
124128

129+
absl::string_view collection_id() const {
130+
return collection_id_;
131+
}
132+
125133
model::PipelineInputOutputVector Evaluate(
126134
const EvaluateContext& context,
127135
const model::PipelineInputOutputVector& inputs) const override;
@@ -130,21 +138,29 @@ class CollectionGroupSource : public EvaluableStage {
130138
std::string collection_id_;
131139
};
132140

133-
class DocumentsSource : public Stage {
141+
class DocumentsSource : public EvaluableStage {
134142
public:
135-
explicit DocumentsSource(std::vector<std::string> documents)
136-
: documents_(std::move(documents)) {
143+
explicit DocumentsSource(const std::vector<std::string>& documents)
144+
: documents_(documents.cbegin(), documents.cend()) {
137145
}
138146
~DocumentsSource() override = default;
139147

140148
google_firestore_v1_Pipeline_Stage to_proto() const override;
141149

142-
absl::string_view name() const {
150+
model::PipelineInputOutputVector Evaluate(
151+
const EvaluateContext& context,
152+
const model::PipelineInputOutputVector& inputs) const override;
153+
154+
absl::string_view name() const override {
143155
return "documents";
144156
}
145157

158+
std::vector<std::string> documents() const {
159+
return std::vector<std::string>(documents_.cbegin(), documents_.cend());
160+
}
161+
146162
private:
147-
std::vector<std::string> documents_;
163+
std::set<std::string> documents_;
148164
};
149165

150166
class AddFields : public Stage {
@@ -190,6 +206,10 @@ class Where : public EvaluableStage {
190206
return "where";
191207
}
192208

209+
const Expr* expr() const {
210+
return expr_.get();
211+
}
212+
193213
model::PipelineInputOutputVector Evaluate(
194214
const EvaluateContext& context,
195215
const model::PipelineInputOutputVector& inputs) const override;
@@ -250,6 +270,10 @@ class LimitStage : public EvaluableStage {
250270
return "limit";
251271
}
252272

273+
int64_t limit() const {
274+
return limit_;
275+
}
276+
253277
model::PipelineInputOutputVector Evaluate(
254278
const EvaluateContext& context,
255279
const model::PipelineInputOutputVector& inputs) const override;

Firestore/core/src/core/core_fwd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class QueryListener;
5555
class SyncEngine;
5656
class SyncEngineCallback;
5757
class Target;
58+
class TargetOrPipeline;
5859
class TargetIdGenerator;
5960
class Transaction;
6061
class ViewDocumentChanges;

0 commit comments

Comments
 (0)