diff options
author | Ian Boros <puppyofkosh@gmail.com> | 2019-05-13 18:19:38 -0400 |
---|---|---|
committer | Ian Boros <puppyofkosh@gmail.com> | 2019-05-20 15:50:22 -0400 |
commit | 31967340abb31476910730163c04782f2e915d01 (patch) | |
tree | e21db441abdfbdf707f66f640796e3d8ee6ab6a8 /src/mongo/db/pipeline/document_source_facet.cpp | |
parent | 24760ca934a3c7843731de117839070ddf7fd3cc (diff) | |
download | mongo-31967340abb31476910730163c04782f2e915d01.tar.gz |
SERVER-40949 add LookupAllowed stage constraint
This bans $merge and $sB from $lookup subpipelines
Diffstat (limited to 'src/mongo/db/pipeline/document_source_facet.cpp')
-rw-r--r-- | src/mongo/db/pipeline/document_source_facet.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/mongo/db/pipeline/document_source_facet.cpp b/src/mongo/db/pipeline/document_source_facet.cpp index 3c9b55bb215..6974dfc44f2 100644 --- a/src/mongo/db/pipeline/document_source_facet.cpp +++ b/src/mongo/db/pipeline/document_source_facet.cpp @@ -107,6 +107,20 @@ vector<pair<string, vector<BSONObj>>> extractRawPipelines(const BSONElement& ele } return rawFacetPipelines; } + +StageConstraints::LookupRequirement computeLookupRequirement( + const std::vector<DocumentSourceFacet::FacetPipeline>& facets) { + for (auto&& facet : facets) { + const auto& sources = facet.pipeline->getSources(); + for (auto&& src : sources) { + if (!src->constraints().isAllowedInLookupPipeline()) { + return StageConstraints::LookupRequirement::kNotAllowed; + } + } + } + return StageConstraints::LookupRequirement::kAllowed; +} + } // namespace std::unique_ptr<DocumentSourceFacet::LiteParsed> DocumentSourceFacet::LiteParsed::parse( @@ -273,7 +287,8 @@ StageConstraints DocumentSourceFacet::constraints(Pipeline::SplitState) const { host, std::get<StageConstraints::DiskUseRequirement>(diskAndTxnReq), FacetRequirement::kNotAllowed, - std::get<StageConstraints::TransactionRequirement>(diskAndTxnReq)}; + std::get<StageConstraints::TransactionRequirement>(diskAndTxnReq), + computeLookupRequirement(_facets)}; } bool DocumentSourceFacet::usedDisk() { |