summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSvilen Mihaylov <svilen.mihaylov@mongodb.com>2023-02-06 20:04:47 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-02-06 20:41:05 +0000
commit30546810e4352efde0750b3447672e51cceca7e4 (patch)
tree43b0946fa919379e7ef1092ec16b63c671ce1a22
parent6087fdd3215cb1145f5b0843988e179ad28a10b2 (diff)
downloadmongo-30546810e4352efde0750b3447672e51cceca7e4.tar.gz
SERVER-73462 [CQF] Transition SpoolId generator to use IdGenerator
-rw-r--r--jstests/cqf/recursive_ix_nav.js12
-rw-r--r--src/mongo/db/query/optimizer/cascades/implementers.cpp6
-rw-r--r--src/mongo/db/query/optimizer/cascades/implementers.h2
-rw-r--r--src/mongo/db/query/optimizer/cascades/physical_rewriter.h2
-rw-r--r--src/mongo/db/query/optimizer/physical_rewriter_optimizer_test.cpp20
-rw-r--r--src/mongo/db/query/optimizer/utils/utils.cpp8
-rw-r--r--src/mongo/db/query/optimizer/utils/utils.h18
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,