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