@@ -53,7 +53,6 @@ google_firestore_v1_Pipeline_Stage CollectionSource::to_proto() const {
53
53
result.args = nanopb::MakeArray<google_firestore_v1_Value>(1 );
54
54
result.args [0 ].which_value_type =
55
55
google_firestore_v1_Value_reference_value_tag;
56
- // TODO: use EncodeResourceName instead
57
56
result.args [0 ].reference_value =
58
57
nanopb::MakeBytesArray (this ->path_ .CanonicalString ());
59
58
@@ -105,10 +104,12 @@ google_firestore_v1_Pipeline_Stage DocumentsSource::to_proto() const {
105
104
result.args_count = documents_.size ();
106
105
result.args = nanopb::MakeArray<google_firestore_v1_Value>(result.args_count );
107
106
108
- for (size_t i = 0 ; i < documents_.size (); ++i) {
107
+ size_t i = 0 ;
108
+ for (const auto & document : documents_) {
109
109
result.args [i].which_value_type =
110
110
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;
112
113
}
113
114
114
115
result.options_count = 0 ;
@@ -359,6 +360,19 @@ model::PipelineInputOutputVector DatabaseSource::Evaluate(
359
360
return results;
360
361
}
361
362
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
+
362
376
model::PipelineInputOutputVector Where::Evaluate (
363
377
const EvaluateContext& context,
364
378
const model::PipelineInputOutputVector& inputs) const {
@@ -380,16 +394,29 @@ model::PipelineInputOutputVector Where::Evaluate(
380
394
model::PipelineInputOutputVector LimitStage::Evaluate (
381
395
const EvaluateContext& /* context*/ ,
382
396
const model::PipelineInputOutputVector& inputs) const {
397
+ model::PipelineInputOutputVector::const_iterator begin;
398
+ model::PipelineInputOutputVector::const_iterator end;
399
+ size_t count;
400
+
383
401
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;
390
417
}
391
- return model::PipelineInputOutputVector (inputs. begin (),
392
- inputs. begin () + count );
418
+
419
+ return model::PipelineInputOutputVector (begin, end );
393
420
}
394
421
395
422
model::PipelineInputOutputVector SortStage::Evaluate (
0 commit comments