diff options
Diffstat (limited to 'src/mongo/db/pipeline/document_source_union_with.cpp')
-rw-r--r-- | src/mongo/db/pipeline/document_source_union_with.cpp | 26 |
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() { |