mirror of https://gitee.com/bigwinds/arangodb
slightly speed up conditions optimizer
This commit is contained in:
parent
0d14b52b69
commit
9dce58e418
|
@ -1129,6 +1129,7 @@ AstNode* Condition::transformNode(AstNode* node) {
|
||||||
|
|
||||||
// create a new n-ary node
|
// create a new n-ary node
|
||||||
node = _ast->createNode(Ast::NaryOperatorType(old->type));
|
node = _ast->createNode(Ast::NaryOperatorType(old->type));
|
||||||
|
node->reserve(2);
|
||||||
node->addMember(old->getMember(0));
|
node->addMember(old->getMember(0));
|
||||||
node->addMember(old->getMember(1));
|
node->addMember(old->getMember(1));
|
||||||
}
|
}
|
||||||
|
@ -1146,11 +1147,9 @@ AstNode* Condition::transformNode(AstNode* node) {
|
||||||
auto sub = transformNode(node->getMemberUnchecked(i));
|
auto sub = transformNode(node->getMemberUnchecked(i));
|
||||||
node->changeMember(i, sub);
|
node->changeMember(i, sub);
|
||||||
|
|
||||||
if (sub->type == NODE_TYPE_OPERATOR_NARY_OR ||
|
if (sub->type == NODE_TYPE_OPERATOR_NARY_OR) {
|
||||||
sub->type == NODE_TYPE_OPERATOR_BINARY_OR) {
|
|
||||||
processChildren = true;
|
processChildren = true;
|
||||||
} else if (sub->type == NODE_TYPE_OPERATOR_NARY_AND ||
|
} else if (sub->type == NODE_TYPE_OPERATOR_NARY_AND) {
|
||||||
sub->type == NODE_TYPE_OPERATOR_BINARY_AND) {
|
|
||||||
mustCollapse = true;
|
mustCollapse = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1169,14 +1168,15 @@ AstNode* Condition::transformNode(AstNode* node) {
|
||||||
auto newOperator = _ast->createNode(NODE_TYPE_OPERATOR_NARY_OR);
|
auto newOperator = _ast->createNode(NODE_TYPE_OPERATOR_NARY_OR);
|
||||||
|
|
||||||
std::vector<PermutationState> permutationStates;
|
std::vector<PermutationState> permutationStates;
|
||||||
|
permutationStates.reserve(n);
|
||||||
|
|
||||||
for (size_t i = 0; i < n; ++i) {
|
for (size_t i = 0; i < n; ++i) {
|
||||||
auto sub = node->getMemberUnchecked(i);
|
auto sub = node->getMemberUnchecked(i);
|
||||||
|
|
||||||
if (sub->type == NODE_TYPE_OPERATOR_NARY_OR) {
|
if (sub->type == NODE_TYPE_OPERATOR_NARY_OR) {
|
||||||
permutationStates.emplace_back(
|
permutationStates.emplace_back(sub, sub->numMembers());
|
||||||
PermutationState(sub, sub->numMembers()));
|
|
||||||
} else {
|
} else {
|
||||||
permutationStates.emplace_back(PermutationState(sub, 1));
|
permutationStates.emplace_back(sub, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1186,9 +1186,10 @@ AstNode* Condition::transformNode(AstNode* node) {
|
||||||
|
|
||||||
while (!done) {
|
while (!done) {
|
||||||
auto andOperator = _ast->createNode(NODE_TYPE_OPERATOR_NARY_AND);
|
auto andOperator = _ast->createNode(NODE_TYPE_OPERATOR_NARY_AND);
|
||||||
|
andOperator->reserve(numPermutations);
|
||||||
|
|
||||||
for (size_t i = 0; i < numPermutations; ++i) {
|
for (size_t i = 0; i < numPermutations; ++i) {
|
||||||
auto state = permutationStates[i];
|
auto const& state = permutationStates[i];
|
||||||
andOperator->addMember(state.getValue()->clone(_ast));
|
andOperator->addMember(state.getValue()->clone(_ast));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue