diff options
author | Charlie Swanson <cswanson310@gmail.com> | 2016-08-29 10:06:41 -0400 |
---|---|---|
committer | Charlie Swanson <cswanson310@gmail.com> | 2016-09-01 14:08:25 -0400 |
commit | b1014fe1b40a69cd90b27cb336a170317eecc6b7 (patch) | |
tree | c189d2d931cdfbdec83359f08cbb1639c1d5e254 /src/mongo/db/pipeline/document_source_facet.h | |
parent | d289e240b653e70a7d90be885a3ad6de21b7c6cb (diff) | |
download | mongo-b1014fe1b40a69cd90b27cb336a170317eecc6b7.tar.gz |
SERVER-24153 Allow pipelines within $facet stage to process in batches.
This approach removes the need to buffer all documents in memory, thus
removing concerns about spilling intermediate results to disk.
Diffstat (limited to 'src/mongo/db/pipeline/document_source_facet.h')
-rw-r--r-- | src/mongo/db/pipeline/document_source_facet.h | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/mongo/db/pipeline/document_source_facet.h b/src/mongo/db/pipeline/document_source_facet.h index 81f7b23e9cf..8f30f10f887 100644 --- a/src/mongo/db/pipeline/document_source_facet.h +++ b/src/mongo/db/pipeline/document_source_facet.h @@ -34,7 +34,7 @@ #include <vector> #include "mongo/db/pipeline/document_source.h" -#include "mongo/util/string_map.h" +#include "mongo/db/pipeline/pipeline.h" namespace mongo { @@ -43,7 +43,6 @@ class TeeBuffer; class DocumentSourceTeeConsumer; struct ExpressionContext; class NamespaceString; -class Pipeline; /** * A $facet stage contains multiple sub-pipelines. Each input to the $facet stage will feed into @@ -57,17 +56,25 @@ class Pipeline; class DocumentSourceFacet final : public DocumentSourceNeedsMongod, public SplittableDocumentSource { public: + struct FacetPipeline { + FacetPipeline(std::string name, boost::intrusive_ptr<Pipeline> pipeline) + : name(std::move(name)), pipeline(std::move(pipeline)) {} + + std::string name; + boost::intrusive_ptr<Pipeline> pipeline; + }; + static boost::intrusive_ptr<DocumentSource> createFromBson( BSONElement elem, const boost::intrusive_ptr<ExpressionContext>& pExpCtx); static boost::intrusive_ptr<DocumentSourceFacet> create( - StringMap<boost::intrusive_ptr<Pipeline>> facetPipelines, + std::vector<FacetPipeline> facetPipelines, const boost::intrusive_ptr<ExpressionContext>& expCtx); /** * Blocking call. Will consume all input and produces one output document. */ - boost::optional<Document> getNext() final; + GetNextResult getNext() final; /** * Optimizes inner pipelines. @@ -114,13 +121,13 @@ public: bool needsPrimaryShard() const final; private: - DocumentSourceFacet(StringMap<boost::intrusive_ptr<Pipeline>> facetPipelines, + DocumentSourceFacet(std::vector<FacetPipeline> facetPipelines, const boost::intrusive_ptr<ExpressionContext>& pExpCtx); Value serialize(bool explain = false) const final; boost::intrusive_ptr<TeeBuffer> _teeBuffer; - StringMap<boost::intrusive_ptr<Pipeline>> _facetPipelines; + std::vector<FacetPipeline> _facets; bool _done = false; }; |