From ddd8ef66671441d46a3fba2eea63ed44999bc0e1 Mon Sep 17 00:00:00 2001 From: Andrey Abramov Date: Tue, 8 May 2018 16:23:56 +0300 Subject: [PATCH] refactor execution node type enum to be less error prone --- arangod/Aql/ConditionFinder.cpp | 5 +++++ arangod/Aql/ExecutionNode.cpp | 9 +++++++++ arangod/Aql/ExecutionNode.h | 12 +++--------- arangod/Aql/ExecutionPlan.cpp | 2 +- arangod/Aql/ExecutionPlan.h | 2 +- arangod/Aql/OptimizerRules.cpp | 20 ++++++++++++++++++++ arangod/Aql/TraversalConditionFinder.cpp | 5 +++++ 7 files changed, 44 insertions(+), 11 deletions(-) diff --git a/arangod/Aql/ConditionFinder.cpp b/arangod/Aql/ConditionFinder.cpp index 3b216979ff..95371faba6 100644 --- a/arangod/Aql/ConditionFinder.cpp +++ b/arangod/Aql/ConditionFinder.cpp @@ -162,6 +162,11 @@ bool ConditionFinder::before(ExecutionNode* en) { break; } + + default: { + // should not reach this point + TRI_ASSERT(false); + } } return false; diff --git a/arangod/Aql/ExecutionNode.cpp b/arangod/Aql/ExecutionNode.cpp index 5211cf986b..65876932da 100644 --- a/arangod/Aql/ExecutionNode.cpp +++ b/arangod/Aql/ExecutionNode.cpp @@ -295,6 +295,10 @@ ExecutionNode* ExecutionNode::fromVPackFactory( case SCATTER_IRESEARCH_VIEW: return new iresearch::IResearchViewScatterNode(*plan, slice); #endif + default: { + // should not reach this point + TRI_ASSERT(false); + } } return nullptr; } @@ -1143,6 +1147,11 @@ void ExecutionNode::RegisterPlan::after(ExecutionNode* en) { // these node type does not produce any new registers break; #endif + + default: { + // should not reach this point + TRI_ASSERT(false); + } } en->_depth = depth; diff --git a/arangod/Aql/ExecutionNode.h b/arangod/Aql/ExecutionNode.h index 15962e4520..e7d4b62b67 100644 --- a/arangod/Aql/ExecutionNode.h +++ b/arangod/Aql/ExecutionNode.h @@ -131,18 +131,12 @@ class ExecutionNode { INDEX = 23, SHORTEST_PATH = 24, #ifdef USE_IRESEARCH - ENUMERATE_IRESEARCH_VIEW = 25, - SCATTER_IRESEARCH_VIEW = 26 + ENUMERATE_IRESEARCH_VIEW, + SCATTER_IRESEARCH_VIEW, #endif - // adjust MaxNodeTypeValue below when new ExecutionNode types are added! + MAX_NODE_TYPE_VALUE }; -#ifdef USE_IRESEARCH - static constexpr size_t MaxNodeTypeValue = SCATTER_IRESEARCH_VIEW; -#else - static constexpr size_t MaxNodeTypeValue = SHORTEST_PATH; -#endif - ExecutionNode() = delete; ExecutionNode(ExecutionNode const&) = delete; ExecutionNode& operator=(ExecutionNode const&) = delete; diff --git a/arangod/Aql/ExecutionPlan.cpp b/arangod/Aql/ExecutionPlan.cpp index e8c9a235b8..8005948fbb 100644 --- a/arangod/Aql/ExecutionPlan.cpp +++ b/arangod/Aql/ExecutionPlan.cpp @@ -64,7 +64,7 @@ namespace { #ifdef ARANGODB_ENABLE_MAINTAINER_MODE /// @brief validate the counters of the plan struct NodeCounter final : public WalkerWorker { - std::array counts; + std::array counts; NodeCounter() : counts{} {} diff --git a/arangod/Aql/ExecutionPlan.h b/arangod/Aql/ExecutionPlan.h index 485471eef5..dad0a2d423 100644 --- a/arangod/Aql/ExecutionPlan.h +++ b/arangod/Aql/ExecutionPlan.h @@ -347,7 +347,7 @@ class ExecutionPlan { std::unordered_set _excludeFromScatterGather; /// @brief number of nodes used in the plan, by type - std::array _typeCounts; + std::array _typeCounts; }; } } diff --git a/arangod/Aql/OptimizerRules.cpp b/arangod/Aql/OptimizerRules.cpp index 3b11f55805..05538893e6 100644 --- a/arangod/Aql/OptimizerRules.cpp +++ b/arangod/Aql/OptimizerRules.cpp @@ -2328,6 +2328,11 @@ struct SortToIndexNode final : public WalkerWorker { case EN::ENUMERATE_COLLECTION: return handleEnumerateCollectionNode( static_cast(en)); + + default: { + // should not reach this point + TRI_ASSERT(false); + } } return true; } @@ -3657,6 +3662,11 @@ void arangodb::aql::distributeFilternCalcToClusterRule( // ready to rumble! } break; + + default: { + // should not reach this point + TRI_ASSERT(false); + } } if (stopSearching) { @@ -3728,6 +3738,11 @@ void arangodb::aql::distributeSortToClusterRule( case EN::ENUMERATE_IRESEARCH_VIEW: case EN::SCATTER_IRESEARCH_VIEW: #endif + case EN::MAX_NODE_TYPE_VALUE: { + // should not reach this point + TRI_ASSERT(false); + } + // For all these, we do not want to pull a SortNode further down // out to the DBservers, note that potential FilterNodes and // CalculationNodes that can be moved to the DBservers have @@ -4245,6 +4260,11 @@ class RemoveToEnumCollFinder final : public WalkerWorker { case EN::SHORTEST_PATH: { // if we meet any of the above, then we abort . . . } + + default: { + // should not reach this point + TRI_ASSERT(false); + } } _toUnlink.clear(); return true; diff --git a/arangod/Aql/TraversalConditionFinder.cpp b/arangod/Aql/TraversalConditionFinder.cpp index 86d09b0e94..600b1050da 100644 --- a/arangod/Aql/TraversalConditionFinder.cpp +++ b/arangod/Aql/TraversalConditionFinder.cpp @@ -713,6 +713,11 @@ bool TraversalConditionFinder::before(ExecutionNode* en) { } break; } + + default: { + // should not reach this point + TRI_ASSERT(false); + } } return false; }