diff options
Diffstat (limited to 'src/mongo/db/query/sbe_stage_builder_coll_scan.cpp')
-rw-r--r-- | src/mongo/db/query/sbe_stage_builder_coll_scan.cpp | 32 |
1 files changed, 9 insertions, 23 deletions
diff --git a/src/mongo/db/query/sbe_stage_builder_coll_scan.cpp b/src/mongo/db/query/sbe_stage_builder_coll_scan.cpp index a7958c96cbe..da2867b1ef5 100644 --- a/src/mongo/db/query/sbe_stage_builder_coll_scan.cpp +++ b/src/mongo/db/query/sbe_stage_builder_coll_scan.cpp @@ -473,21 +473,12 @@ std::pair<std::unique_ptr<sbe::PlanStage>, PlanStageSlots> generateOptimizedOplo invariant(!csn->stopApplyingFilterAfterFirstMatch || csn->filter); if (csn->filter) { - auto relevantSlots = sbe::makeSV(resultSlot, recordIdSlot); - if (tsSlot) { - relevantSlots.push_back(*tsSlot); + auto filterExpr = generateFilter(state, csn->filter.get(), resultSlot, nullptr); + if (!filterExpr.isNull()) { + stage = sbe::makeS<sbe::FilterStage<false>>( + std::move(stage), filterExpr.extractExpr(state.slotVarMap), csn->nodeId()); } - relevantSlots.insert(relevantSlots.end(), fieldSlots.begin(), fieldSlots.end()); - - auto [_, outputStage] = generateFilter(state, - csn->filter.get(), - {std::move(stage), std::move(relevantSlots)}, - resultSlot, - nullptr /* planStageSlots */, - csn->nodeId()); - stage = outputStage.extractStage(csn->nodeId()); - // We may be requested to stop applying the filter after the first match. This can happen // if the query is just a lower bound on 'ts' on a forward scan. In this case every document // in the collection after the first matching one must also match, so there is no need to @@ -658,16 +649,11 @@ std::pair<std::unique_ptr<sbe::PlanStage>, PlanStageSlots> generateGenericCollSc // 'generateOptimizedOplogScan()'. invariant(!csn->stopApplyingFilterAfterFirstMatch); - auto relevantSlots = sbe::makeSV(resultSlot, recordIdSlot); - relevantSlots.insert(relevantSlots.end(), fieldSlots.begin(), fieldSlots.end()); - - auto [_, outputStage] = generateFilter(state, - csn->filter.get(), - {std::move(stage), std::move(relevantSlots)}, - resultSlot, - &outputs, - csn->nodeId()); - stage = outputStage.extractStage(csn->nodeId()); + auto filterExpr = generateFilter(state, csn->filter.get(), resultSlot, &outputs); + if (!filterExpr.isNull()) { + stage = sbe::makeS<sbe::FilterStage<false>>( + std::move(stage), filterExpr.extractExpr(state.slotVarMap), csn->nodeId()); + } } return {std::move(stage), std::move(outputs)}; |