mirror of https://gitee.com/bigwinds/arangodb
added all node types to FilterToEnumCollFinder.
This commit is contained in:
parent
b00521b881
commit
b6f9f11e5e
|
@ -1051,7 +1051,8 @@ void IndexRangeBlock::readSkiplistIndex () {
|
||||||
// this creates the infinite range (i.e. >= null)
|
// this creates the infinite range (i.e. >= null)
|
||||||
Json hass(Json::List);
|
Json hass(Json::List);
|
||||||
hass.add(Json(Json::Null));
|
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 {
|
else {
|
||||||
skiplistOperator = TRI_CreateIndexOperator(TRI_EQ_INDEX_OPERATOR, nullptr,
|
skiplistOperator = TRI_CreateIndexOperator(TRI_EQ_INDEX_OPERATOR, nullptr,
|
||||||
|
|
|
@ -398,12 +398,10 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
|
||||||
bool before (ExecutionNode* en) {
|
bool before (ExecutionNode* en) {
|
||||||
_canThrow = (_canThrow || en->canThrow()); // can any node walked over throw?
|
_canThrow = (_canThrow || en->canThrow()); // can any node walked over throw?
|
||||||
|
|
||||||
if (en->getType() == triagens::aql::ExecutionNode::FILTER) {
|
switch (en->getType()) {
|
||||||
std::vector<Variable const*> inVar = en->getVariablesUsedHere();
|
case EN::ENUMERATE_LIST:
|
||||||
TRI_ASSERT(inVar.size() == 1);
|
break;
|
||||||
_varIds.insert(inVar[0]->id);
|
case EN::CALCULATION: {
|
||||||
}
|
|
||||||
else if (en->getType() == triagens::aql::ExecutionNode::CALCULATION) {
|
|
||||||
auto outvar = en->getVariablesSetHere();
|
auto outvar = en->getVariablesSetHere();
|
||||||
TRI_ASSERT(outvar.size() == 1);
|
TRI_ASSERT(outvar.size() == 1);
|
||||||
if (_varIds.find(outvar[0]->id) != _varIds.end()) {
|
if (_varIds.find(outvar[0]->id) != _varIds.end()) {
|
||||||
|
@ -412,8 +410,43 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
|
||||||
std::string enumCollVar;
|
std::string enumCollVar;
|
||||||
buildRangeInfo(node->expression()->node(), enumCollVar, attr);
|
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 node = static_cast<EnumerateCollectionNode*>(en);
|
||||||
auto var = node->getVariablesSetHere()[0]; // should only be 1
|
auto var = node->getVariablesSetHere()[0]; // should only be 1
|
||||||
auto map = _ranges->find(var->name); // check if we have any ranges with this var
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue