1
0
Fork 0

Merge branch 'devel' of https://github.com/arangodb/arangodb into vpack

This commit is contained in:
jsteemann 2015-12-14 00:12:36 +01:00
commit db746389f8
2 changed files with 44 additions and 5 deletions

View File

@ -121,10 +121,42 @@ int triagens::aql::sortInValuesRule (Optimizer* opt,
// calculation. sorting the IN values will not provide a benefit here
continue;
}
AstNode const* originalNode = static_cast<CalculationNode*>(setter)->expression()->node();
TRI_ASSERT(originalNode != nullptr);
AstNode const* testNode = originalNode;
if (originalNode->type == NODE_TYPE_FCALL &&
static_cast<Function const*>(originalNode->getData())->externalName == "NOOPT") {
// bypass NOOPT(...)
TRI_ASSERT(originalNode->numMembers() == 1);
auto args = originalNode->getMember(0);
if (args->numMembers() > 0) {
testNode = args->getMember(0);
}
}
if (testNode->type == NODE_TYPE_VALUE ||
testNode->type == NODE_TYPE_OBJECT) {
// not really usable...
continue;
}
if (testNode->type == NODE_TYPE_ARRAY &&
testNode->numMembers() < 8) {
continue;
}
if (testNode->isSorted()) {
// already sorted
continue;
}
auto ast = plan->getAst();
auto args = ast->createNodeArray();
args->addMember(static_cast<CalculationNode*>(setter)->expression()->node());
args->addMember(originalNode);
auto sorted = ast->createNodeFunctionCall("SORTED_UNIQUE", args);
auto outVar = ast->variables()->createTemporaryVariable();
@ -3831,7 +3863,7 @@ int triagens::aql::mergeFilterIntoTraversal (Optimizer* opt,
std::vector<ExecutionNode*>&& tNodes = plan->findNodesOfType(EN::TRAVERSAL, true);
if (tNodes.size() == 0) {
if (tNodes.empty()) {
opt->addPlan(plan, rule, false);
return TRI_ERROR_NO_ERROR;

View File

@ -70,7 +70,8 @@ function optimizerRuleTestSuite () {
"LET values = NOOPT(SPLIT('foo,bar,foobar,qux', ',')) FOR i IN [ { a: 'foo' }, { a: 'bar' }, { a: 'baz' } ] FILTER i.a IN values RETURN i",
"LET values = NOOPT(SPLIT('foo,bar,foobar,qux', ',')) FOR i IN [ { a: 'foo' }, { a: 'bar' }, { a: 'baz' } ] FILTER i.a NOT IN values RETURN i",
"LET values = NOOPT(SPLIT('foo,bar,foobar,qux', ',')) FOR i IN [ { a: 'foo' }, { a: 'bar' }, { a: 'baz' } ] FILTER LENGTH(i.a) >= 3 FILTER i.a IN values RETURN i",
"LET values = NOOPT(RANGE(1, 100)) FOR i IN 1..100 FILTER i IN values RETURN i"
"LET values = NOOPT(RANGE(1, 100)) FOR i IN 1..100 FILTER i IN values RETURN i",
"LET values = NOOPT([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]) FOR i IN 1..100 FILTER i IN values RETURN i"
];
queries.forEach(function(query) {
@ -93,7 +94,12 @@ function optimizerRuleTestSuite () {
"FOR i IN [ { a: 'foo' }, { a: 'bar' }, { a: 'baz' } ] FILTER i.a NOT IN SPLIT('foo,bar,foobar,qux', ',') RETURN i",
"LET values = RANGE(1, 100) FOR i IN 1..100 FILTER i IN values RETURN i",
"FOR i IN 1..100 FILTER i IN RANGE(1, 100) RETURN i",
"FOR i IN 1..100 FILTER i IN NOOPT(RANGE(1, 100)) RETURN i"
"FOR i IN 1..100 FILTER i IN NOOPT(RANGE(1, 100)) RETURN i",
"LET values = NOOPT([ 1 ]) FOR i IN 1..100 FILTER i IN values RETURN i",
"LET values = NOOPT([ 1, 2 ]) FOR i IN 1..100 FILTER i IN values RETURN i",
"LET values = NOOPT([ 1, 2, 3 ]) FOR i IN 1..100 FILTER i IN values RETURN i",
"LET values = NOOPT({ }) FOR i IN 1..100 FILTER i IN values RETURN i",
"LET values = NOOPT('foobar') FOR i IN 1..100 FILTER i IN values RETURN i"
];
queryList.forEach(function(query) {
@ -121,7 +127,8 @@ function optimizerRuleTestSuite () {
"LET values = NOOPT(SPLIT('foo,bar,foobar,qux', ',')) FOR i IN [ { a: 'foo' }, { a: 'bar' }, { a: 'baz' } ] FILTER i.a IN values RETURN i",
"LET values = NOOPT(SPLIT('foo,bar,foobar,qux', ',')) FOR i IN [ { a: 'foo' }, { a: 'bar' }, { a: 'baz' } ] FILTER i.a NOT IN values RETURN i",
"LET values = NOOPT(SPLIT('foo,bar,foobar,qux', ',')) FOR i IN [ { a: 'foo' }, { a: 'bar' }, { a: 'baz' } ] FILTER LENGTH(i.a) >= 3 FILTER i.a IN values RETURN i",
"LET values = NOOPT(RANGE(1, 100)) FOR i IN 1..100 FILTER i IN values RETURN i"
"LET values = NOOPT(RANGE(1, 100)) FOR i IN 1..100 FILTER i IN values RETURN i",
"LET values = NOOPT([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]) FOR i IN 1..100 FILTER i IN values RETURN i"
];
queries.forEach(function(query) {