diff options
7 files changed, 28 insertions, 40 deletions
diff --git a/jstests/cqf/recursive_ix_nav.js b/jstests/cqf/recursive_ix_nav.js index 151494ed375..529ec9d7eac 100644 --- a/jstests/cqf/recursive_ix_nav.js +++ b/jstests/cqf/recursive_ix_nav.js @@ -115,11 +115,11 @@ assert.commandWorked(t.createIndex({a: 1, b: 1, c: 1, d: 1, e: 1})); // We have two spool producer nodes, one for each interval for "a" ([1, 3] and [6, 6]). assertValueOnPlanPath( "SpoolProducer", res, "child.leftChild.child.children.0.leftChild.nodeType"); - assertValueOnPlanPath(0, res, "child.leftChild.child.children.0.leftChild.id"); + assertValueOnPlanPath(1, res, "child.leftChild.child.children.0.leftChild.id"); assertValueOnPlanPath( "SpoolProducer", res, "child.leftChild.child.children.1.leftChild.nodeType"); - assertValueOnPlanPath(1, res, "child.leftChild.child.children.1.leftChild.id"); + assertValueOnPlanPath(2, res, "child.leftChild.child.children.1.leftChild.id"); } { @@ -139,10 +139,10 @@ assert.commandWorked(t.createIndex({a: 1, b: 1, c: 1, d: 1, e: 1})); // We have two spool producers, for the first two equality prefixes. assertValueOnPlanPath("SpoolProducer", res, "child.child.leftChild.nodeType"); - assertValueOnPlanPath(1, res, "child.child.leftChild.id"); + assertValueOnPlanPath(2, res, "child.child.leftChild.id"); assertValueOnPlanPath("SpoolProducer", res, "child.child.rightChild.leftChild.nodeType"); - assertValueOnPlanPath(0, res, "child.child.rightChild.leftChild.id"); + assertValueOnPlanPath(1, res, "child.child.rightChild.leftChild.id"); } { @@ -171,11 +171,11 @@ assert.commandWorked(t.createIndex({a: 1, b: 1, c: 1, d: 1, e: 1})); // Assert we have two spool producers, one for each interval for "a" ([1, 3] and [6, 6]). assertValueOnPlanPath( "SpoolProducer", res, "child.child.leftChild.child.children.0.leftChild.nodeType"); - assertValueOnPlanPath(6, res, "child.child.leftChild.child.children.0.leftChild.id"); + assertValueOnPlanPath(7, res, "child.child.leftChild.child.children.0.leftChild.id"); assertValueOnPlanPath( "SpoolProducer", res, "child.child.leftChild.child.children.1.leftChild.nodeType"); - assertValueOnPlanPath(7, res, "child.child.leftChild.child.children.1.leftChild.id"); + assertValueOnPlanPath(8, res, "child.child.leftChild.child.children.1.leftChild.id"); } { diff --git a/src/mongo/db/query/optimizer/cascades/implementers.cpp b/src/mongo/db/query/optimizer/cascades/implementers.cpp index 05f6326301b..a0405f1dafe 100644 --- a/src/mongo/db/query/optimizer/cascades/implementers.cpp +++ b/src/mongo/db/query/optimizer/cascades/implementers.cpp @@ -1254,7 +1254,7 @@ public: const QueryHints& hints, const RIDProjectionsMap& ridProjections, PrefixId& prefixId, - SpoolId& spoolId, + SpoolIdGenerator& spoolId, PhysRewriteQueue& queue, const PhysProps& physProps, const LogicalProps& logicalProps, @@ -1678,7 +1678,7 @@ private: const QueryHints& _hints; const RIDProjectionsMap& _ridProjections; PrefixId& _prefixId; - SpoolId& _spoolId; + SpoolIdGenerator& _spoolId; PhysRewriteQueue& _queue; const PhysProps& _physProps; const LogicalProps& _logicalProps; @@ -1690,7 +1690,7 @@ void addImplementers(const Metadata& metadata, const QueryHints& hints, const RIDProjectionsMap& ridProjections, PrefixId& prefixId, - SpoolId& spoolId, + SpoolIdGenerator& spoolId, const PhysProps& physProps, PhysQueueAndImplPos& queue, const LogicalProps& logicalProps, diff --git a/src/mongo/db/query/optimizer/cascades/implementers.h b/src/mongo/db/query/optimizer/cascades/implementers.h index 7fba48dd25b..0e71c2c9d9a 100644 --- a/src/mongo/db/query/optimizer/cascades/implementers.h +++ b/src/mongo/db/query/optimizer/cascades/implementers.h @@ -44,7 +44,7 @@ void addImplementers(const Metadata& metadata, const QueryHints& hints, const RIDProjectionsMap& ridProjections, PrefixId& prefixId, - SpoolId& spoolId, + SpoolIdGenerator& spoolId, const properties::PhysProps& physProps, PhysQueueAndImplPos& queue, const properties::LogicalProps& logicalProps, diff --git a/src/mongo/db/query/optimizer/cascades/physical_rewriter.h b/src/mongo/db/query/optimizer/cascades/physical_rewriter.h index 3bf0cc1790d..aa4555d97df 100644 --- a/src/mongo/db/query/optimizer/cascades/physical_rewriter.h +++ b/src/mongo/db/query/optimizer/cascades/physical_rewriter.h @@ -90,7 +90,7 @@ private: ChildPropsType childProps, CostType costLimit); - SpoolId _spoolId; + SpoolIdGenerator _spoolId; // We don't own any of this. const Metadata& _metadata; diff --git a/src/mongo/db/query/optimizer/physical_rewriter_optimizer_test.cpp b/src/mongo/db/query/optimizer/physical_rewriter_optimizer_test.cpp index 25f35a160a6..2adeaa3427b 100644 --- a/src/mongo/db/query/optimizer/physical_rewriter_optimizer_test.cpp +++ b/src/mongo/db/query/optimizer/physical_rewriter_optimizer_test.cpp @@ -1729,7 +1729,7 @@ TEST(PhysRewriter, FilterIndexingRIN) { "| | IndexScan [{'<rid>': rid_0}, scanDefName: c1, indexDefName: index1, interval: " "{=Variable [evalTemp_57] | Variable [evalTemp_58] | Variable [evalTemp_59] | Variable " "[evalTemp_60] | Const [3]}]\n" - "| SpoolProducer [Lazy, id: 0, {evalTemp_59, evalTemp_60}]\n" + "| SpoolProducer [Lazy, id: 1, {evalTemp_59, evalTemp_60}]\n" "| | | Const [true]\n" "| Union [{evalTemp_59, evalTemp_60}]\n" "| | NestedLoopJoin [joinType: Inner, {rinInner_2, rinInner_3}]\n" @@ -1743,7 +1743,7 @@ TEST(PhysRewriter, FilterIndexingRIN) { "[evalTemp_58] | Variable [rinInner_2] | Variable [rinInner_3] | Const [maxKey], Variable " "[evalTemp_57] | Variable [evalTemp_58] | Const [maxKey] | Const [maxKey] | Const " "[maxKey])}]\n" - "| | SpoolConsumer [Stack, id: 0, {rinInner_2, rinInner_3}]\n" + "| | SpoolConsumer [Stack, id: 1, {rinInner_2, rinInner_3}]\n" "| LimitSkip []\n" "| | limitSkip:\n" "| | limit: 1\n" @@ -1752,7 +1752,7 @@ TEST(PhysRewriter, FilterIndexingRIN) { "c1, indexDefName: index1, interval: {(Variable [evalTemp_57] | Variable [evalTemp_58] | " "Const [2] | Const [maxKey] | Const [maxKey], Variable [evalTemp_57] | Variable " "[evalTemp_58] | Const [maxKey] | Const [maxKey] | Const [maxKey]]}]\n" - "SpoolProducer [Lazy, id: 1, {evalTemp_57, evalTemp_58}]\n" + "SpoolProducer [Lazy, id: 2, {evalTemp_57, evalTemp_58}]\n" "| | Const [true]\n" "Union [{evalTemp_57, evalTemp_58}]\n" "| NestedLoopJoin [joinType: Inner, {rinInner_0, rinInner_1}]\n" @@ -1765,7 +1765,7 @@ TEST(PhysRewriter, FilterIndexingRIN) { "scanDefName: c1, indexDefName: index1, interval: {(Variable [rinInner_0] | Variable " "[rinInner_1] | Const [maxKey] | Const [maxKey] | Const [maxKey], Const [maxKey | maxKey | " "maxKey | maxKey | maxKey])}]\n" - "| SpoolConsumer [Stack, id: 1, {rinInner_0, rinInner_1}]\n" + "| SpoolConsumer [Stack, id: 2, {rinInner_0, rinInner_1}]\n" "LimitSkip []\n" "| limitSkip:\n" "| limit: 1\n" @@ -1843,7 +1843,7 @@ TEST(PhysRewriter, FilterIndexingRIN1) { "| | Const [true]\n" "| IndexScan [{'<indexKey> 1': pb, '<rid>': rid_0}, scanDefName: c1, indexDefName: " "index1, interval: {(Variable [pa] | Const [2], Variable [pa] | Const [maxKey]]}]\n" - "SpoolProducer [Lazy, id: 1, {pa}]\n" + "SpoolProducer [Lazy, id: 2, {pa}]\n" "| | Const [true]\n" "Union [{pa}]\n" "| NestedLoopJoin [joinType: Inner, {rinInner_1}]\n" @@ -1854,7 +1854,7 @@ TEST(PhysRewriter, FilterIndexingRIN1) { "| | | skip: 0\n" "| | IndexScan [{'<indexKey> 0': pa}, scanDefName: c1, indexDefName: index1, interval: " "{(Const [1 | maxKey], Variable [rinInner_1] | Const [minKey])}, reversed]\n" - "| SpoolConsumer [Stack, id: 1, {rinInner_1}]\n" + "| SpoolConsumer [Stack, id: 2, {rinInner_1}]\n" "LimitSkip []\n" "| limitSkip:\n" "| limit: 1\n" @@ -1958,7 +1958,7 @@ TEST(PhysRewriter, FilterIndexingRIN2) { "| | IndexScan [{'<indexKey> 1': disjunction_3, '<rid>': rid_0}, scanDefName: c1, " "indexDefName: index1, interval: {[Variable [disjunction_0] | Const [5], Variable " "[disjunction_0] | Const [6]]}]\n" - "| SpoolProducer [Lazy, id: 1, {disjunction_0}]\n" + "| SpoolProducer [Lazy, id: 2, {disjunction_0}]\n" "| | | Const [true]\n" "| Union [{disjunction_0}]\n" "| | NestedLoopJoin [joinType: Inner, {rinInner_1}]\n" @@ -1969,7 +1969,7 @@ TEST(PhysRewriter, FilterIndexingRIN2) { "| | | | skip: 0\n" "| | | IndexScan [{'<indexKey> 0': disjunction_0}, scanDefName: c1, indexDefName: " "index1, interval: {(Variable [rinInner_1] | Const [maxKey], Const [4 | maxKey])}]\n" - "| | SpoolConsumer [Stack, id: 1, {rinInner_1}]\n" + "| | SpoolConsumer [Stack, id: 2, {rinInner_1}]\n" "| LimitSkip []\n" "| | limitSkip:\n" "| | limit: 1\n" @@ -1993,7 +1993,7 @@ TEST(PhysRewriter, FilterIndexingRIN2) { "| IndexScan [{'<indexKey> 1': disjunction_2, '<rid>': rid_0}, scanDefName: c1, " "indexDefName: index1, interval: {[Variable [disjunction_0] | Const [5], Variable " "[disjunction_0] | Const [6]]}]\n" - "SpoolProducer [Lazy, id: 0, {disjunction_0}]\n" + "SpoolProducer [Lazy, id: 1, {disjunction_0}]\n" "| | Const [true]\n" "Union [{disjunction_0}]\n" "| NestedLoopJoin [joinType: Inner, {rinInner_0}]\n" @@ -2004,7 +2004,7 @@ TEST(PhysRewriter, FilterIndexingRIN2) { "| | | skip: 0\n" "| | IndexScan [{'<indexKey> 0': disjunction_0}, scanDefName: c1, indexDefName: " "index1, interval: {(Variable [rinInner_0] | Const [maxKey], Const [2 | maxKey])}]\n" - "| SpoolConsumer [Stack, id: 0, {rinInner_0}]\n" + "| SpoolConsumer [Stack, id: 1, {rinInner_0}]\n" "LimitSkip []\n" "| limitSkip:\n" "| limit: 1\n" diff --git a/src/mongo/db/query/optimizer/utils/utils.cpp b/src/mongo/db/query/optimizer/utils/utils.cpp index eb87415b20d..817809debff 100644 --- a/src/mongo/db/query/optimizer/utils/utils.cpp +++ b/src/mongo/db/query/optimizer/utils/utils.cpp @@ -2194,7 +2194,7 @@ public: FieldProjectionMap indexProjectionMap, const std::string& scanDefName, const std::string& indexDefName, - SpoolId& spoolId, + SpoolIdGenerator& spoolId, const size_t indexFieldCount, const std::vector<EqualityPrefixEntry>& eqPrefixes, const size_t currentEqPrefixIndex, @@ -2346,7 +2346,7 @@ public: _indexDefName, reverse, currentCE, - _spoolId.getNextId(), + _spoolId.generate(), std::move(outerProjNames), std::move(outerFPM), std::move(interval), @@ -2526,7 +2526,7 @@ private: const std::string& _indexDefName; // Equality-prefix and related. - SpoolId& _spoolId; + SpoolIdGenerator& _spoolId; const size_t _indexFieldCount; const std::vector<EqualityPrefixEntry>& _eqPrefixes; const size_t _currentEqPrefixIndex; @@ -2551,7 +2551,7 @@ PhysPlanBuilder lowerEqPrefixes(PrefixId& prefixId, FieldProjectionMap indexProjectionMap, const std::string& scanDefName, const std::string& indexDefName, - SpoolId& spoolId, + SpoolIdGenerator& spoolId, const size_t indexFieldCount, const std::vector<EqualityPrefixEntry>& eqPrefixes, const size_t eqPrefixIndex, diff --git a/src/mongo/db/query/optimizer/utils/utils.h b/src/mongo/db/query/optimizer/utils/utils.h index a9c84b2d74b..cdb46974d15 100644 --- a/src/mongo/db/query/optimizer/utils/utils.h +++ b/src/mongo/db/query/optimizer/utils/utils.h @@ -34,6 +34,7 @@ #include "mongo/db/query/optimizer/node_defs.h" #include "mongo/db/query/optimizer/props.h" #include "mongo/db/query/optimizer/utils/physical_plan_builder.h" +#include "mongo/util/id_generator.h" namespace mongo::optimizer { @@ -216,20 +217,7 @@ private: std::variant<IdType, PrefixMapType> _ids; }; -/** - * Used to vend out fresh spool ids. - */ -class SpoolId { -public: - SpoolId() : _nextId(0) {} - - int64_t getNextId() { - return _nextId++; - } - -private: - int64_t _nextId; -}; +using SpoolIdGenerator = IdGenerator<int64_t>; ProjectionNameOrderedSet convertToOrderedSet(ProjectionNameSet unordered); @@ -514,7 +502,7 @@ PhysPlanBuilder lowerEqPrefixes(PrefixId& prefixId, FieldProjectionMap indexProjectionMap, const std::string& scanDefName, const std::string& indexDefName, - SpoolId& spoolId, + SpoolIdGenerator& spoolId, size_t indexFieldCount, const std::vector<EqualityPrefixEntry>& eqPrefixes, size_t eqPrefixIndex, |