summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/document_source_facet.cpp
diff options
context:
space:
mode:
authorIan Boros <puppyofkosh@gmail.com>2019-05-13 18:19:38 -0400
committerIan Boros <puppyofkosh@gmail.com>2019-05-20 15:50:22 -0400
commit31967340abb31476910730163c04782f2e915d01 (patch)
treee21db441abdfbdf707f66f640796e3d8ee6ab6a8 /src/mongo/db/pipeline/document_source_facet.cpp
parent24760ca934a3c7843731de117839070ddf7fd3cc (diff)
downloadmongo-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.cpp17
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() {