diff options
Diffstat (limited to 'src/mongo/db/query/optimizer/node.cpp')
-rw-r--r-- | src/mongo/db/query/optimizer/node.cpp | 216 |
1 files changed, 16 insertions, 200 deletions
diff --git a/src/mongo/db/query/optimizer/node.cpp b/src/mongo/db/query/optimizer/node.cpp index 4836dcce39e..a1455efd60f 100644 --- a/src/mongo/db/query/optimizer/node.cpp +++ b/src/mongo/db/query/optimizer/node.cpp @@ -30,130 +30,19 @@ #include <functional> #include <stack> +#include "mongo/db/query/optimizer/memo.h" #include "mongo/db/query/optimizer/node.h" -#include "mongo/db/query/optimizer/visitor.h" -#include "mongo/util/assert_util.h" namespace mongo::optimizer { -Node::Node(Context& ctx) : _nodeId(ctx.getNextNodeId()), _children() {} - -Node::Node(Context& ctx, NodePtr child) : _nodeId(ctx.getNextNodeId()) { - _children.push_back(std::move(child)); -} - -Node::Node(Context& ctx, ChildVector children) - : _nodeId(ctx.getNextNodeId()), _children(std::move(children)) {} +Node::Node(Context& ctx) : _nodeId(ctx.getNextNodeId()) {} void Node::generateMemoBase(std::ostringstream& os) const { os << "NodeId: " << _nodeId << "\n"; } -void Node::visitPreOrder(AbstractVisitor& visitor) const { - visit(visitor); - for (const NodePtr& ptr : _children) { - ptr->visitPreOrder(visitor); - } -} - -void Node::visitPostOrder(AbstractVisitor& visitor) const { - for (const NodePtr& ptr : _children) { - ptr->visitPostOrder(visitor); - } - visit(visitor); -} - -std::string Node::generateMemo() const { - class MemoVisitor : public AbstractVisitor { - protected: - void visit(const ScanNode& node) override { - node.generateMemo(_os); - } - void visit(const MultiJoinNode& node) override { - node.generateMemo(_os); - } - void visit(const UnionNode& node) override { - node.generateMemo(_os); - } - void visit(const GroupByNode& node) override { - node.generateMemo(_os); - } - void visit(const UnwindNode& node) override { - node.generateMemo(_os); - } - void visit(const WindNode& node) override { - node.generateMemo(_os); - } - - public: - std::ostringstream _os; - }; - - MemoVisitor visitor; - visitPreOrder(visitor); - return visitor._os.str(); -} - -NodePtr Node::clone(Context& ctx) const { - class CloneVisitor : public AbstractVisitor { - public: - explicit CloneVisitor(Context& ctx) : _ctx(ctx), _childStack() {} - - protected: - void visit(const ScanNode& node) override { - doClone(node, [&](ChildVector v){ return ScanNode::clone(_ctx, node); }); - } - void visit(const MultiJoinNode& node) override { - doClone(node, [&](ChildVector v){ return MultiJoinNode::clone(_ctx, node, std::move(v)); }); - } - void visit(const UnionNode& node) override { - doClone(node, [&](ChildVector v){ return UnionNode::clone(_ctx, node, std::move(v)); }); - } - void visit(const GroupByNode& node) override { - doClone(node, [&](ChildVector v){ return GroupByNode::clone(_ctx, node, std::move(v.at(0))); }); - } - void visit(const UnwindNode& node) override { - doClone(node, [&](ChildVector v){ return UnwindNode::clone(_ctx, node, std::move(v.at(0))); }); - } - void visit(const WindNode& node) override { - doClone(node, [&](ChildVector v){ return WindNode::clone(_ctx, node, std::move(v.at(0))); }); - } - - private: - void doClone(const Node& node, const std::function<NodePtr(ChildVector newChildren)>& cloneFn) { - ChildVector newChildren; - for (int i = 0; i < node.getChildCount(); i++) { - newChildren.push_back(std::move(_childStack.top())); - _childStack.pop(); - } - _childStack.push(cloneFn(std::move(newChildren))); - } - - public: - Context& _ctx; - std::stack<NodePtr> _childStack; - }; - - CloneVisitor visitor(ctx); - visitPostOrder(visitor); - invariant(visitor._childStack.size() == 1); - return std::move(visitor._childStack.top()); -} - -int Node::getChildCount() const { - return _children.size(); -} - -NodePtr ScanNode::create(Context& ctx, CollectionNameType collectionName) { - return NodePtr(new ScanNode(ctx, std::move(collectionName))); -} - -NodePtr ScanNode::clone(Context& ctx, const ScanNode& other) { - return create(ctx, other._collectionName); -} - ScanNode::ScanNode(Context& ctx, CollectionNameType collectionName) - : Node(ctx), _collectionName(std::move(collectionName)) {} + : Base(), Node(ctx), _collectionName(std::move(collectionName)) {} void ScanNode::generateMemo(std::ostringstream& os) const { Node::generateMemoBase(os); @@ -161,27 +50,12 @@ void ScanNode::generateMemo(std::ostringstream& os) const { << "\n"; } -void ScanNode::visit(AbstractVisitor& visitor) const { - visitor.visit(*this); -} - -NodePtr MultiJoinNode::create(Context& ctx, - FilterSet filterSet, - ProjectionMap projectionMap, - ChildVector children) { - return NodePtr(new MultiJoinNode( - ctx, std::move(filterSet), std::move(projectionMap), std::move(children))); -} - -NodePtr MultiJoinNode::clone(Context& ctx, const MultiJoinNode& other, ChildVector newChildren) { - return create(ctx, other._filterSet, other._projectionMap, std::move(newChildren)); -} - MultiJoinNode::MultiJoinNode(Context& ctx, FilterSet filterSet, ProjectionMap projectionMap, - ChildVector children) - : Node(ctx, std::move(children)), + PolymorphicNodeVector children) + : Base(std::move(children)), + Node(ctx), _filterSet(std::move(filterSet)), _projectionMap(std::move(projectionMap)) {} @@ -191,20 +65,8 @@ void MultiJoinNode::generateMemo(std::ostringstream& os) const { << "\n"; } -void MultiJoinNode::visit(AbstractVisitor& visitor) const { - visitor.visit(*this); -} - -NodePtr UnionNode::create(Context& ctx, ChildVector children) { - return NodePtr(new UnionNode(ctx, std::move(children))); -} - -NodePtr UnionNode::clone(Context& ctx, const UnionNode& other, ChildVector newChildren) { - return create(ctx, std::move(newChildren)); -} - -UnionNode::UnionNode(Context& ctx, ChildVector children) - : Node(ctx, std::move(children)) {} +UnionNode::UnionNode(Context& ctx, PolymorphicNodeVector children) + : Base(std::move(children)), Node(ctx) {} void UnionNode::generateMemo(std::ostringstream& os) const { Node::generateMemoBase(os); @@ -212,27 +74,12 @@ void UnionNode::generateMemo(std::ostringstream& os) const { << "\n"; } -void UnionNode::visit(AbstractVisitor& visitor) const { - visitor.visit(*this); -} - -NodePtr GroupByNode::create(Context& ctx, - GroupByNode::GroupByVector groupByVector, - GroupByNode::ProjectionMap projectionMap, - NodePtr child) { - return NodePtr( - new GroupByNode(ctx, std::move(groupByVector), std::move(projectionMap), std::move(child))); -} - -NodePtr GroupByNode::clone(Context& ctx, const GroupByNode& other, NodePtr newChild) { - return create(ctx, other._groupByVector, other._projectionMap, std::move(newChild)); -} - GroupByNode::GroupByNode(Context& ctx, GroupByNode::GroupByVector groupByVector, GroupByNode::ProjectionMap projectionMap, - NodePtr child) - : Node(ctx, std::move(child)), + PolymorphicNode child) + : Base(std::move(child)), + Node(ctx), _groupByVector(std::move(groupByVector)), _projectionMap(std::move(projectionMap)) {} @@ -242,27 +89,12 @@ void GroupByNode::generateMemo(std::ostringstream& os) const { << "\n"; } -void GroupByNode::visit(AbstractVisitor& visitor) const { - visitor.visit(*this); -} - -NodePtr UnwindNode::create(Context& ctx, - ProjectionName projectionName, - const bool retainNonArrays, - NodePtr child) { - return NodePtr( - new UnwindNode(ctx, std::move(projectionName), retainNonArrays, std::move(child))); -} - -NodePtr UnwindNode::clone(Context& ctx, const UnwindNode& other, NodePtr newChild) { - return create(ctx, other._projectionName, other._retainNonArrays, std::move(newChild)); -} - UnwindNode::UnwindNode(Context& ctx, ProjectionName projectionName, const bool retainNonArrays, - NodePtr child) - : Node(ctx, std::move(child)), + PolymorphicNode child) + : Base(std::move(child)), + Node(ctx), _projectionName(std::move(projectionName)), _retainNonArrays(retainNonArrays) {} @@ -272,20 +104,8 @@ void UnwindNode::generateMemo(std::ostringstream& os) const { << "\n"; } -void UnwindNode::visit(AbstractVisitor& visitor) const { - visitor.visit(*this); -} - -NodePtr WindNode::create(Context& ctx, ProjectionName projectionName, NodePtr child) { - return NodePtr(new WindNode(ctx, std::move(projectionName), std::move(child))); -} - -NodePtr WindNode::clone(Context& ctx, const WindNode& other, NodePtr newChild) { - return create(ctx, other._projectionName, std::move(newChild)); -} - -WindNode::WindNode(Context& ctx, ProjectionName projectionName, NodePtr child) - : Node(ctx, std::move(child)), _projectionName(std::move(projectionName)) {} +WindNode::WindNode(Context& ctx, ProjectionName projectionName, PolymorphicNode child) + : Base(std::move(child)), Node(ctx), _projectionName(std::move(projectionName)) {} void WindNode::generateMemo(std::ostringstream& os) const { Node::generateMemoBase(os); @@ -293,8 +113,4 @@ void WindNode::generateMemo(std::ostringstream& os) const { << "\n"; } -void WindNode::visit(AbstractVisitor& visitor) const { - visitor.visit(*this); -} - } // namespace mongo::optimizer |