1
0
Fork 0

slightly refactor the handling of optimizer rules (#6855)

This commit is contained in:
Jan 2018-10-12 13:49:46 +02:00 committed by GitHub
parent 2dc05429fe
commit d3c446156c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 32 deletions

View File

@ -24,6 +24,7 @@
#include "Aql/ExecutionPlan.h"
#include "Aql/OptimizerRules.h"
#include "Basics/Exceptions.h"
#include "Basics/StringRef.h"
#include "Cluster/ServerState.h"
#include "StorageEngine/EngineSelectorFeature.h"
#include "StorageEngine/StorageEngine.h"
@ -373,42 +374,58 @@ std::unordered_set<int> OptimizerRulesFeature::getDisabledRuleIds(
continue;
}
if (name[0] == '-') {
// disable rule
if (name == "-all") {
// disable all rules
for (auto const& it : _rules) {
if (it.second.canBeDisabled) {
disabled.emplace(it.first);
}
}
} else {
// disable a specific rule
auto it = _ruleLookup.find(name.c_str() + 1);
if (it != _ruleLookup.end()) {
if ((*it).second.second) {
// can be disabled
disabled.emplace((*it).second.first);
}
}
}
} else if (name[0] == '+') {
// enable rule
if (name == "+all") {
// enable all rules
disabled.clear();
} else {
auto it = _ruleLookup.find(name.c_str() + 1);
if (it != _ruleLookup.end()) {
disabled.erase((*it).second.first);
}
}
disableRule(name, disabled);
} else {
enableRule(name, disabled);
}
}
return disabled;
}
void OptimizerRulesFeature::disableRule(std::string const& name, std::unordered_set<int>& disabled) {
TRI_ASSERT(name[0] == '-');
char const* p = name.data() + 1;
size_t size = name.size() - 1;
if (StringRef(p, size) == "all") {
// disable all rules
for (auto const& it : _rules) {
if (it.second.canBeDisabled) {
disabled.emplace(it.first);
}
}
} else {
// disable a specific rule
auto it = _ruleLookup.find(p);
if (it != _ruleLookup.end() && (*it).second.second) {
// can be disabled
disabled.emplace((*it).second.first);
}
}
}
void OptimizerRulesFeature::enableRule(std::string const& name, std::unordered_set<int>& disabled) {
char const* p = name.data();
size_t size = name.size();
if (name[0] == '+') {
++p;
--size;
}
if (StringRef(p, size) == "all") {
// enable all rules
disabled.clear();
} else {
auto it = _ruleLookup.find(p);
if (it != _ruleLookup.end()) {
disabled.erase((*it).second.first);
}
}
}
} // aql
} // arangodb

View File

@ -64,6 +64,9 @@ class OptimizerRulesFeature final : public application_features::ApplicationFeat
void addRules();
void addStorageEngineRules();
static void disableRule(std::string const& name, std::unordered_set<int>& disabled);
static void enableRule(std::string const& name, std::unordered_set<int>& disabled);
/// @brief the rules database
static std::map<int, OptimizerRule> _rules;
@ -74,4 +77,4 @@ class OptimizerRulesFeature final : public application_features::ApplicationFeat
} // namespace aql
} // namespace arangodb
#endif
#endif