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)
|
||||
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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue