summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/pipeline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/pipeline/pipeline.cpp')
-rw-r--r--src/mongo/db/pipeline/pipeline.cpp33
1 files changed, 27 insertions, 6 deletions
diff --git a/src/mongo/db/pipeline/pipeline.cpp b/src/mongo/db/pipeline/pipeline.cpp
index 5c62e945e5b..5222a11d300 100644
--- a/src/mongo/db/pipeline/pipeline.cpp
+++ b/src/mongo/db/pipeline/pipeline.cpp
@@ -38,6 +38,7 @@
#include "mongo/db/operation_context.h"
#include "mongo/db/pipeline/accumulator.h"
#include "mongo/db/pipeline/document_source.h"
+#include "mongo/db/pipeline/document_source_lookup.h"
#include "mongo/db/pipeline/document_source_match.h"
#include "mongo/db/pipeline/document_source_merge.h"
#include "mongo/db/pipeline/document_source_out.h"
@@ -111,6 +112,19 @@ void validateTopLevelPipeline(const Pipeline& pipeline) {
}
}
+/**
+ * Convert a vector of Values to BSONObjs.
+ */
+std::vector<BSONObj> convertToBson(const std::vector<Value>& stages) {
+ std::vector<BSONObj> asBson;
+ asBson.reserve(stages.size());
+ for (const auto& stage : stages) {
+ invariant(stage.getType() == BSONType::Object);
+ asBson.push_back(stage.getDocument().toBson());
+ }
+ return asBson;
+}
+
} // namespace
MONGO_FAIL_POINT_DEFINE(disablePipelineOptimization);
@@ -422,13 +436,20 @@ vector<Value> Pipeline::serialize() const {
vector<BSONObj> Pipeline::serializeToBson() const {
const auto serialized = serialize();
- std::vector<BSONObj> asBson;
- asBson.reserve(serialized.size());
- for (auto&& stage : serialized) {
- invariant(stage.getType() == BSONType::Object);
- asBson.push_back(stage.getDocument().toBson());
+ return convertToBson(serialized);
+}
+
+std::vector<BSONObj> Pipeline::serializeForQueryAnalysis() const {
+ std::vector<Value> serializedSources;
+ for (auto&& source : _sources) {
+ // $lookup has a separate serialization path for query analysis.
+ if (auto* lookup = dynamic_cast<DocumentSourceLookUp*>(source.get())) {
+ lookup->serializeToArrayForQueryAnalysis(serializedSources);
+ } else {
+ source->serializeToArray(serializedSources);
+ }
}
- return asBson;
+ return convertToBson(serializedSources);
}
void Pipeline::stitch() {