diff --git a/arangod/Aql/Expression.cpp b/arangod/Aql/Expression.cpp index 3983a41972..fe152e0d76 100644 --- a/arangod/Aql/Expression.cpp +++ b/arangod/Aql/Expression.cpp @@ -354,6 +354,7 @@ void Expression::analyzeExpression () { // specialize the simple expression into an attribute accessor _accessor = new AttributeAccessor(name, v); _type = ATTRIBUTE; + _built = true; } } } @@ -808,8 +809,13 @@ bool Expression::isConstant () const { /// call isAttributeAccess in advance to ensure no exceptions. //////////////////////////////////////////////////////////////////////////////// -std::pair Expression::getMultipleAttributes() { - if (_type != SIMPLE && _type != ATTRIBUTE) { +std::pair Expression::getAttributeAccess () { + if (_type == UNPROCESSED) { + analyzeExpression(); + } + + if (_type != SIMPLE && + _type != ATTRIBUTE) { THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "getMultipleAttributes works only on simple expressions or attribute accesses!"); } @@ -819,11 +825,11 @@ std::pair Expression::getMultipleAttributes() { if (expNode->type != triagens::aql::NODE_TYPE_ATTRIBUTE_ACCESS) { THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, - "getAccessNRef works only on simple expressions!"); + "getMultipleAttributes works only on simple expressions or attribute accesses(2)!"); } while (expNode->type == triagens::aql::NODE_TYPE_ATTRIBUTE_ACCESS) { - attributeVector.push_back(expNode->getStringValue()); + attributeVector.emplace_back(expNode->getStringValue()); expNode = expNode->getMember(0); } @@ -832,14 +838,14 @@ std::pair Expression::getMultipleAttributes() { oneAttr != attributeVector.rend(); ++oneAttr) { if (! attributeVectorStr.empty()) { - attributeVectorStr += std::string("."); + attributeVectorStr.push_back('.'); } attributeVectorStr += *oneAttr; } if (expNode->type != triagens::aql::NODE_TYPE_REFERENCE) { THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, - "getAccessNRef works only on simple expressions!"); + "getMultipleAttributes works only on simple expressions or attribute accesses(3)!"); } auto variable = static_cast(expNode->getData()); diff --git a/arangod/Aql/Expression.h b/arangod/Aql/Expression.h index 56b347e8a0..19303f98ef 100644 --- a/arangod/Aql/Expression.h +++ b/arangod/Aql/Expression.h @@ -243,7 +243,7 @@ namespace triagens { /// call isAttributeAccess in advance to ensure no exceptions. //////////////////////////////////////////////////////////////////////////////// - std::pair getMultipleAttributes(); + std::pair getAttributeAccess(); //////////////////////////////////////////////////////////////////////////////// /// @brief stringify an expression diff --git a/arangod/Aql/OptimizerRules.cpp b/arangod/Aql/OptimizerRules.cpp index 547bca8828..1c3481f343 100644 --- a/arangod/Aql/OptimizerRules.cpp +++ b/arangod/Aql/OptimizerRules.cpp @@ -2590,7 +2590,7 @@ public: auto oneSortExpression = cn->expression(); if (oneSortExpression->isAttributeAccess()) { - auto simpleExpression = oneSortExpression->getMultipleAttributes(); + auto simpleExpression = oneSortExpression->getAttributeAccess(); d->variableName = simpleExpression.first; d->attributevec = simpleExpression.second; }