Skip to content

Commit aedab52

Browse files
committed
[realppl 7] realppl integration with remote/local and unit/spec tests
1 parent 7f35bbd commit aedab52

Some content is hidden

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

75 files changed

+2582
-397
lines changed

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
@@ -42,10 +42,18 @@ class Ordering {
4242
return expr_.get();
4343
}
4444

45+
const std::shared_ptr<Expr> expr_shared() const {
46+
return expr_;
47+
}
48+
4549
Direction direction() const {
4650
return direction_;
4751
}
4852

53+
Ordering WithReversedDirection() const {
54+
return Ordering(expr_, direction_ == ASCENDING ? DESCENDING : ASCENDING);
55+
}
56+
4957
google_firestore_v1_Value to_proto() const;
5058

5159
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 & 11 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,17 +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)),
32-
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;
3351
}
3452

3553
RealtimePipeline RealtimePipeline::AddingStage(
3654
std::shared_ptr<EvaluableStage> stage) {
3755
auto copy = std::vector<std::shared_ptr<EvaluableStage>>(this->stages_);
3856
copy.push_back(stage);
3957

40-
return {copy, serializer_};
58+
return {copy,
59+
std::make_unique<remote::Serializer>(serializer_->database_id())};
4160
}
4261

4362
const std::vector<std::shared_ptr<EvaluableStage>>& RealtimePipeline::stages()
@@ -50,13 +69,8 @@ RealtimePipeline::rewritten_stages() const {
5069
return this->rewritten_stages_;
5170
}
5271

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

6276
} // 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
@@ -53,7 +53,6 @@ google_firestore_v1_Pipeline_Stage CollectionSource::to_proto() const {
5353
result.args = nanopb::MakeArray<google_firestore_v1_Value>(1);
5454
result.args[0].which_value_type =
5555
google_firestore_v1_Value_reference_value_tag;
56-
// TODO: use EncodeResourceName instead
5756
result.args[0].reference_value =
5857
nanopb::MakeBytesArray(this->path_.CanonicalString());
5958

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

108-
for (size_t i = 0; i < documents_.size(); ++i) {
107+
size_t i = 0;
108+
for (const auto& document : documents_) {
109109
result.args[i].which_value_type =
110110
google_firestore_v1_Value_string_value_tag;
111-
result.args[i].string_value = nanopb::MakeBytesArray(documents_[i]);
111+
result.args[i].string_value = nanopb::MakeBytesArray(document);
112+
++i;
112113
}
113114

114115
result.options_count = 0;
@@ -359,6 +360,19 @@ model::PipelineInputOutputVector DatabaseSource::Evaluate(
359360
return results;
360361
}
361362

363+
model::PipelineInputOutputVector DocumentsSource::Evaluate(
364+
const EvaluateContext& /*context*/,
365+
const model::PipelineInputOutputVector& inputs) const {
366+
model::PipelineInputOutputVector results;
367+
for (const model::PipelineInputOutput& input : inputs) {
368+
if (input.is_found_document() &&
369+
documents_.count(input.key().path().CanonicalString()) > 0) {
370+
results.push_back(input);
371+
}
372+
}
373+
return results;
374+
}
375+
362376
model::PipelineInputOutputVector Where::Evaluate(
363377
const EvaluateContext& context,
364378
const model::PipelineInputOutputVector& inputs) const {
@@ -380,16 +394,29 @@ model::PipelineInputOutputVector Where::Evaluate(
380394
model::PipelineInputOutputVector LimitStage::Evaluate(
381395
const EvaluateContext& /*context*/,
382396
const model::PipelineInputOutputVector& inputs) const {
397+
model::PipelineInputOutputVector::const_iterator begin;
398+
model::PipelineInputOutputVector::const_iterator end;
399+
size_t count;
400+
383401
if (limit_ < 0) {
384-
// Or handle as error? Assuming non-negative limit.
385-
return {};
386-
}
387-
size_t count = static_cast<size_t>(limit_);
388-
if (count > inputs.size()) {
389-
count = inputs.size();
402+
// if limit_ is negative, we treat it as limit to last, returns the last
403+
// limit_ documents.
404+
count = static_cast<size_t>(-limit_);
405+
if (count > inputs.size()) {
406+
count = inputs.size();
407+
}
408+
begin = inputs.end() - count;
409+
end = inputs.end();
410+
} else {
411+
count = static_cast<size_t>(limit_);
412+
if (count > inputs.size()) {
413+
count = inputs.size();
414+
}
415+
begin = inputs.begin();
416+
end = inputs.begin() + count;
390417
}
391-
return model::PipelineInputOutputVector(inputs.begin(),
392-
inputs.begin() + count);
418+
419+
return model::PipelineInputOutputVector(begin, end);
393420
}
394421

395422
model::PipelineInputOutputVector SortStage::Evaluate(

Firestore/core/src/api/stages.h

Lines changed: 28 additions & 4 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"
@@ -83,6 +83,10 @@ class CollectionSource : public EvaluableStage {
8383
return "collection";
8484
}
8585

86+
std::string path() const {
87+
return path_.CanonicalString();
88+
}
89+
8690
model::PipelineInputOutputVector Evaluate(
8791
const EvaluateContext& context,
8892
const model::PipelineInputOutputVector& inputs) const override;
@@ -120,6 +124,10 @@ class CollectionGroupSource : public EvaluableStage {
120124
return "collection_group";
121125
}
122126

127+
absl::string_view collection_id() const {
128+
return collection_id_;
129+
}
130+
123131
model::PipelineInputOutputVector Evaluate(
124132
const EvaluateContext& context,
125133
const model::PipelineInputOutputVector& inputs) const override;
@@ -130,19 +138,27 @@ class CollectionGroupSource : public EvaluableStage {
130138

131139
class DocumentsSource : public EvaluableStage {
132140
public:
133-
explicit DocumentsSource(std::vector<std::string> documents)
134-
: documents_(std::move(documents)) {
141+
explicit DocumentsSource(const std::vector<std::string>& documents)
142+
: documents_(documents.cbegin(), documents.cend()) {
135143
}
136144
~DocumentsSource() override = default;
137145

138146
google_firestore_v1_Pipeline_Stage to_proto() const override;
139147

148+
model::PipelineInputOutputVector Evaluate(
149+
const EvaluateContext& context,
150+
const model::PipelineInputOutputVector& inputs) const override;
151+
140152
absl::string_view name() const override {
141153
return "documents";
142154
}
143155

156+
std::vector<std::string> documents() const {
157+
return std::vector<std::string>(documents_.cbegin(), documents_.cend());
158+
}
159+
144160
private:
145-
std::vector<std::string> documents_;
161+
std::set<std::string> documents_;
146162
};
147163

148164
class AddFields : public Stage {
@@ -185,6 +201,10 @@ class Where : public EvaluableStage {
185201
return "where";
186202
}
187203

204+
const Expr* expr() const {
205+
return expr_.get();
206+
}
207+
188208
model::PipelineInputOutputVector Evaluate(
189209
const EvaluateContext& context,
190210
const model::PipelineInputOutputVector& inputs) const override;
@@ -245,6 +265,10 @@ class LimitStage : public EvaluableStage {
245265
return "limit";
246266
}
247267

268+
int64_t limit() const {
269+
return limit_;
270+
}
271+
248272
model::PipelineInputOutputVector Evaluate(
249273
const EvaluateContext& context,
250274
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)