@@ -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+
362376model::PipelineInputOutputVector Where::Evaluate (
363377 const EvaluateContext& context,
364378 const model::PipelineInputOutputVector& inputs) const {
@@ -380,16 +394,29 @@ model::PipelineInputOutputVector Where::Evaluate(
380394model::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
395422model::PipelineInputOutputVector SortStage::Evaluate (
0 commit comments