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.cpp31
1 files changed, 11 insertions, 20 deletions
diff --git a/src/mongo/db/pipeline/pipeline.cpp b/src/mongo/db/pipeline/pipeline.cpp
index c53b5358d07..15dcebae4f4 100644
--- a/src/mongo/db/pipeline/pipeline.cpp
+++ b/src/mongo/db/pipeline/pipeline.cpp
@@ -486,8 +486,7 @@ void Pipeline::addFinalSource(intrusive_ptr<DocumentSource> source) {
DepsTracker Pipeline::getDependencies(QueryMetadataBitSet unavailableMetadata) const {
DepsTracker deps(unavailableMetadata);
- const bool scopeHasVariables = pCtx->variablesParseState.hasDefinedVariables();
- bool skipFieldsAndMetadataDeps = false;
+ bool hasUnsupportedStage = false;
bool knowAllFields = false;
bool knowAllMeta = false;
for (auto&& source : _sources) {
@@ -495,36 +494,28 @@ DepsTracker Pipeline::getDependencies(QueryMetadataBitSet unavailableMetadata) c
DepsTracker::State status = source->getDependencies(&localDeps);
deps.vars.insert(localDeps.vars.begin(), localDeps.vars.end());
+ deps.needRandomGenerator |= localDeps.needRandomGenerator;
- if ((skipFieldsAndMetadataDeps |= (status == DepsTracker::State::NOT_SUPPORTED))) {
- // Assume this stage needs everything. We may still know something about our
- // dependencies if an earlier stage returned EXHAUSTIVE_FIELDS or EXHAUSTIVE_META. If
- // this scope has variables, we need to keep enumerating the remaining stages but will
- // skip adding any further field or metadata dependencies.
- if (scopeHasVariables) {
- continue;
- } else {
- break;
- }
+ if (status == DepsTracker::State::NOT_SUPPORTED) {
+ // We don't know anything about this stage, so we have to assume it depends on
+ // everything. We may still know something about our dependencies if an earlier stage
+ // returned EXHAUSTIVE_FIELDS or EXHAUSTIVE_META.
+ hasUnsupportedStage = true;
}
- if (!knowAllFields) {
+ // If we ever saw an unsupported stage, don't bother continuing to track field and metadata
+ // deps: we already have to assume the pipeline depends on everything.
+ if (!hasUnsupportedStage && !knowAllFields) {
deps.fields.insert(localDeps.fields.begin(), localDeps.fields.end());
if (localDeps.needWholeDocument)
deps.needWholeDocument = true;
knowAllFields = status & DepsTracker::State::EXHAUSTIVE_FIELDS;
}
- if (!knowAllMeta) {
+ if (!hasUnsupportedStage && !knowAllMeta) {
deps.requestMetadata(localDeps.metadataDeps());
knowAllMeta = status & DepsTracker::State::EXHAUSTIVE_META;
}
-
- // If there are variables defined at this pipeline's scope, there may be dependencies upon
- // them in subsequent stages. Keep enumerating.
- if (knowAllMeta && knowAllFields && !scopeHasVariables) {
- break;
- }
}
if (!knowAllFields)