summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/document_source_facet.h
diff options
context:
space:
mode:
authorCharlie Swanson <cswanson310@gmail.com>2016-08-29 10:06:41 -0400
committerCharlie Swanson <cswanson310@gmail.com>2016-09-01 14:08:25 -0400
commitb1014fe1b40a69cd90b27cb336a170317eecc6b7 (patch)
treec189d2d931cdfbdec83359f08cbb1639c1d5e254 /src/mongo/db/pipeline/document_source_facet.h
parentd289e240b653e70a7d90be885a3ad6de21b7c6cb (diff)
downloadmongo-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.h19
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;
};