diff --git a/arangod/Aql/ExecutionNode.cpp b/arangod/Aql/ExecutionNode.cpp index 132478badb..5ebbfb88c0 100644 --- a/arangod/Aql/ExecutionNode.cpp +++ b/arangod/Aql/ExecutionNode.cpp @@ -551,7 +551,7 @@ void ExecutionNode::cloneDependencies(ExecutionPlan* plan, ExecutionNode* theClo } } -bool ExecutionNode::isEqualTo(ExecutionNode const& other) { +bool ExecutionNode::isEqualTo(ExecutionNode const& other) const { meta::details::static_assert_size(); diff --git a/arangod/Aql/ExecutionNode.h b/arangod/Aql/ExecutionNode.h index 314f16166b..4995ceef4a 100644 --- a/arangod/Aql/ExecutionNode.h +++ b/arangod/Aql/ExecutionNode.h @@ -334,7 +334,7 @@ class ExecutionNode { void cloneDependencies(ExecutionPlan* plan, ExecutionNode* theClone, bool withProperties) const; /// @brief check equality of ExecutionNodes - virtual bool isEqualTo(ExecutionNode const& other); + virtual bool isEqualTo(ExecutionNode const& other) const; /// @brief invalidate the cost estimate for the node and its dependencies virtual void invalidateCost(); diff --git a/arangod/Aql/OptimizerRules.cpp b/arangod/Aql/OptimizerRules.cpp index 75fb741db0..5bb990dd3d 100644 --- a/arangod/Aql/OptimizerRules.cpp +++ b/arangod/Aql/OptimizerRules.cpp @@ -4556,6 +4556,8 @@ void arangodb::aql::distributeSortToClusterRule(Optimizer* opt, break; } + case EN::SUBQUERY_START: + case EN::SUBQUERY_END: case EN::MAX_NODE_TYPE_VALUE: { // should not reach this point TRI_ASSERT(false); diff --git a/arangod/Aql/SubqueryEndExecutionNode.cpp b/arangod/Aql/SubqueryEndExecutionNode.cpp index 9f24d2a400..170467dc93 100644 --- a/arangod/Aql/SubqueryEndExecutionNode.cpp +++ b/arangod/Aql/SubqueryEndExecutionNode.cpp @@ -74,18 +74,18 @@ void SubqueryEndNode::replaceOutVariable(Variable const* var) { } CostEstimate SubqueryEndNode::estimateCost() const { - TRI_ASSERT(!_dependencies.size() == 1); + TRI_ASSERT(_dependencies.size() == 1); CostEstimate estimate = _dependencies.at(0)->getCost(); return estimate; } -bool SubqueryEndNode::isEqualTo(SubqueryEndNode const& other) +bool SubqueryEndNode::isEqualTo(SubqueryEndNode const& other) const { - TRI_ASSERT(_outVariable); TRI_ASSERT(other->_outVariable); + TRI_ASSERT(_outVariable != nullptr); TRI_ASSERT(other._outVariable != nullptr); return ExecutionNode::isEqualTo(other) && - _outVariable->isEqualTo(*other->_outVariable); + _outVariable->isEqualTo(*(other._outVariable)); } } // namespace aql diff --git a/arangod/Aql/SubqueryEndExecutionNode.h b/arangod/Aql/SubqueryEndExecutionNode.h index c06541ff8e..fbc73b7245 100644 --- a/arangod/Aql/SubqueryEndExecutionNode.h +++ b/arangod/Aql/SubqueryEndExecutionNode.h @@ -57,7 +57,7 @@ class SubqueryEndNode : public ExecutionNode { ExecutionNode* clone(ExecutionPlan* plan, bool withDependencies, bool withProperties) const override final; - bool isEqualTo(SubqueryEndNode const &other); + bool isEqualTo(SubqueryEndNode const &other) const; std::vector getVariablesSetHere() const override final { return std::vector{_outVariable}; diff --git a/arangod/Aql/SubqueryStartExecutionNode.cpp b/arangod/Aql/SubqueryStartExecutionNode.cpp index 280bb9b320..ce2d9938fc 100644 --- a/arangod/Aql/SubqueryStartExecutionNode.cpp +++ b/arangod/Aql/SubqueryStartExecutionNode.cpp @@ -69,10 +69,6 @@ bool SubqueryStartNode::isEqualTo(SubqueryStartNode const& other) { return ExecutionNode::isEqualTo(other); } -bool SubqueryStartNode::isEqualTo(SubqueryStartNode const* other) { - return ExecutionNode::isEqualTo(other); -} - } // namespace aql } // namespace arangodb diff --git a/arangod/Aql/Variable.cpp b/arangod/Aql/Variable.cpp index f155768e4d..f9c47f2a2f 100644 --- a/arangod/Aql/Variable.cpp +++ b/arangod/Aql/Variable.cpp @@ -25,6 +25,7 @@ #include "Aql/Ast.h" #include "Aql/VariableGenerator.h" #include "Basics/VelocyPackHelper.h" +#include "Meta/static_assert_size.h" #include #include @@ -93,7 +94,7 @@ Variable* Variable::varFromVPack(Ast* ast, arangodb::velocypack::Slice const& ba return ast->variables()->createVariable(variable); } -bool Variable::isEqualTo(Variable const& other) { - meta::details::static_assert_size(); +bool Variable::isEqualTo(Variable const& other) const { + meta::details::static_assert_size(); return (id == other.id) && (name == other.name); } diff --git a/arangod/Aql/Variable.h b/arangod/Aql/Variable.h index 95c3ba1622..c26dc0be3b 100644 --- a/arangod/Aql/Variable.h +++ b/arangod/Aql/Variable.h @@ -80,6 +80,9 @@ struct Variable { static Variable* varFromVPack(Ast* ast, arangodb::velocypack::Slice const& base, char const* variableName, bool optional = false); + + bool isEqualTo(Variable const& other) const; + /// @brief variable name std::string name; diff --git a/tests/Aql/ExecutionNodeTest.cpp b/tests/Aql/ExecutionNodeTest.cpp index e98c092aff..2c299cabd9 100644 --- a/tests/Aql/ExecutionNodeTest.cpp +++ b/tests/Aql/ExecutionNodeTest.cpp @@ -60,55 +60,55 @@ public: TEST_F(ExecutionNodeTest, start_node_velocypack_roundtrip) { VPackBuilder builder; - SubqueryStartNode *node, *nodeFromVPack; + std::unique_ptr node, nodeFromVPack; - node = new SubqueryStartNode(&plan, 0); + node = std::make_unique(&plan, 0); builder.openArray(); node->toVelocyPackHelper(builder, ExecutionNode::SERIALIZE_DETAILS); builder.close(); - nodeFromVPack = new SubqueryStartNode(&plan, builder.slice()[0]); + nodeFromVPack = std::make_unique(&plan, builder.slice()[0]); - ASSERT_TRUE(node->isEqualTo(nodeFromVPack)); + ASSERT_TRUE(node->isEqualTo(*nodeFromVPack)); } TEST_F(ExecutionNodeTest, start_node_not_equal_different_id) { - SubqueryStartNode *node1, *node2; + std::unique_ptr node1, node2; - node1 = new SubqueryStartNode(&plan, 0); - node1 = new SubqueryStartNode(&plan, 1); + node1 = std::make_unique(&plan, 0); + node2 = std::make_unique(&plan, 1); - ASSERT_FALSE(node1->isEqualTo(node2)); + ASSERT_FALSE(node1->isEqualTo(*node2)); } TEST_F(ExecutionNodeTest, end_node_velocypack_roundtrip) { VPackBuilder builder; - Variable *outvar = new Variable("name", 1); + Variable outvar("name", 1); - SubqueryEndNode *node, *nodeFromVPack; + std::unique_ptr node, nodeFromVPack; - node = new SubqueryEndNode(&plan, 0, outvar); + node = std::make_unique(&plan, 0, &outvar); builder.openArray(); node->toVelocyPackHelper(builder, ExecutionNode::SERIALIZE_DETAILS); builder.close(); - nodeFromVPack = new SubqueryEndNode(&plan, builder.slice()[0]); + nodeFromVPack = std::make_unique(&plan, builder.slice()[0]); - ASSERT_TRUE(node->isEqualTo(nodeFromVPack)); + ASSERT_TRUE(node->isEqualTo(*nodeFromVPack)); } TEST_F(ExecutionNodeTest, end_node_not_equal_different_id) { - SubqueryEndNode *node1, *node2; + std::unique_ptr node1, node2; - Variable *outvar = new Variable("name", 1); + Variable outvar("name", 1); - node1 = new SubqueryEndNode(&plan, 0, outvar); - node1 = new SubqueryEndNode(&plan, 1, outvar); + node1 = std::make_unique(&plan, 0, &outvar); + node2 = std::make_unique(&plan, 1, &outvar); - ASSERT_FALSE(node1->isEqualTo(node2)); + ASSERT_FALSE(node1->isEqualTo(*node2)); }