Skip to content

Commit aedab52

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

File tree

75 files changed

+2582
-397
lines changed

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(

0 commit comments

Comments
 (0)