1
0
Fork 0

added all node types to FilterToEnumCollFinder.

This commit is contained in:
James 2014-08-29 17:44:32 +02:00
parent b00521b881
commit b6f9f11e5e
2 changed files with 133 additions and 103 deletions

View File

@ -1051,7 +1051,8 @@ void IndexRangeBlock::readSkiplistIndex () {
// this creates the infinite range (i.e. >= null)
Json hass(Json::List);
hass.add(Json(Json::Null));
skiplistOperator = TRI_CreateIndexOperator(TRI_GE_INDEX_OPERATOR, nullptr, nullptr, hass.steal(), shaper, nullptr, 1, nullptr);
skiplistOperator = TRI_CreateIndexOperator(TRI_GE_INDEX_OPERATOR, nullptr,
nullptr, hass.steal(), shaper, nullptr, 1, nullptr);
}
else {
skiplistOperator = TRI_CreateIndexOperator(TRI_EQ_INDEX_OPERATOR, nullptr,

View File

@ -398,12 +398,10 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
bool before (ExecutionNode* en) {
_canThrow = (_canThrow || en->canThrow()); // can any node walked over throw?
if (en->getType() == triagens::aql::ExecutionNode::FILTER) {
std::vector<Variable const*> inVar = en->getVariablesUsedHere();
TRI_ASSERT(inVar.size() == 1);
_varIds.insert(inVar[0]->id);
}
else if (en->getType() == triagens::aql::ExecutionNode::CALCULATION) {
switch (en->getType()) {
case EN::ENUMERATE_LIST:
break;
case EN::CALCULATION: {
auto outvar = en->getVariablesSetHere();
TRI_ASSERT(outvar.size() == 1);
if (_varIds.find(outvar[0]->id) != _varIds.end()) {
@ -412,8 +410,43 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
std::string enumCollVar;
buildRangeInfo(node->expression()->node(), enumCollVar, attr);
}
break;
}
else if (en->getType() == triagens::aql::ExecutionNode::ENUMERATE_COLLECTION) {
case EN::SUBQUERY:
break;
case EN::FILTER:{
std::vector<Variable const*> inVar = en->getVariablesUsedHere();
TRI_ASSERT(inVar.size() == 1);
_varIds.insert(inVar[0]->id);
break;
}
case EN::INTERSECTION:
case EN::SINGLETON:
case EN::AGGREGATE:
case EN::LOOKUP_JOIN:
case EN::MERGE_JOIN:
case EN::LOOKUP_INDEX_UNIQUE:
case EN::LOOKUP_INDEX_RANGE:
case EN::LOOKUP_FULL_COLLECTION:
case EN::CONCATENATION:
case EN::MERGE:
case EN::REMOTE:
case EN::INSERT:
case EN::REMOVE:
case EN::REPLACE:
case EN::UPDATE:
case EN::RETURN:
case EN::NORESULTS:
case EN::ILLEGAL:
break;
case EN::LIMIT:
// if we meet a limit node between a filter and an enumerate collection,
// we abort . . .
return true;
case EN::SORT:
case EN::INDEX_RANGE:
break;
case EN::ENUMERATE_COLLECTION:{
auto node = static_cast<EnumerateCollectionNode*>(en);
auto var = node->getVariablesSetHere()[0]; // should only be 1
auto map = _ranges->find(var->name); // check if we have any ranges with this var
@ -508,13 +541,9 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
}
}
}
break;
}
else if (en->getType() == triagens::aql::ExecutionNode::LIMIT) {
// if we meet a limit node between a filter and an enumerate collection,
// we abort . . .
return true;
}
return false;
}