summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/sbe_stage_builder_coll_scan.cpp
diff options
context:
space:
mode:
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.cpp32
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)};