summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/document_source_union_with.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/pipeline/document_source_union_with.cpp')
-rw-r--r--src/mongo/db/pipeline/document_source_union_with.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/mongo/db/pipeline/document_source_union_with.cpp b/src/mongo/db/pipeline/document_source_union_with.cpp
index 67c9fe032e3..a6a31657dbf 100644
--- a/src/mongo/db/pipeline/document_source_union_with.cpp
+++ b/src/mongo/db/pipeline/document_source_union_with.cpp
@@ -30,6 +30,8 @@
#include "mongo/platform/basic.h"
+#include <iterator>
+
#include "mongo/db/pipeline/document_source_union_with.h"
#include "mongo/db/pipeline/document_source_union_with_gen.h"
#include "mongo/util/log.h"
@@ -40,6 +42,26 @@ REGISTER_TEST_DOCUMENT_SOURCE(unionWith,
DocumentSourceUnionWith::LiteParsed::parse,
DocumentSourceUnionWith::createFromBson);
+namespace {
+std::unique_ptr<Pipeline, PipelineDeleter> buildPipelineFromViewDefinition(
+ const boost::intrusive_ptr<ExpressionContext>& expCtx,
+ ExpressionContext::ResolvedNamespace resolvedNs,
+ std::vector<BSONObj> currentPipeline) {
+ if (resolvedNs.pipeline.empty()) {
+ return uassertStatusOK(Pipeline::parse(currentPipeline, expCtx->copyWith(resolvedNs.ns)));
+ }
+ auto resolvedPipeline = std::move(resolvedNs.pipeline);
+ resolvedPipeline.reserve(currentPipeline.size() + resolvedPipeline.size());
+ resolvedPipeline.insert(resolvedPipeline.end(),
+ std::make_move_iterator(currentPipeline.begin()),
+ std::make_move_iterator(currentPipeline.end()));
+
+ return uassertStatusOK(
+ Pipeline::parse(std::move(resolvedPipeline), expCtx->copyWith(resolvedNs.ns)));
+}
+
+} // namespace
+
std::unique_ptr<DocumentSourceUnionWith::LiteParsed> DocumentSourceUnionWith::LiteParsed::parse(
const NamespaceString& nss, const BSONElement& spec) {
uassert(ErrorCodes::FailedToParse,
@@ -112,8 +134,8 @@ boost::intrusive_ptr<DocumentSource> DocumentSourceUnionWith::createFromBson(
}
return make_intrusive<DocumentSourceUnionWith>(
expCtx,
- uassertStatusOK(
- Pipeline::parse(std::move(pipeline), expCtx->copyWith(std::move(unionNss)))));
+ buildPipelineFromViewDefinition(
+ expCtx, expCtx->getResolvedNamespace(std::move(unionNss)), std::move(pipeline)));
}
DocumentSource::GetNextResult DocumentSourceUnionWith::doGetNext() {