1
0
Fork 0

remove p.edges[*].foo detection, we can't handle this.

This commit is contained in:
Wilfried Goesgens 2015-11-16 15:43:54 +01:00
parent 21cf784cbc
commit c2fcef77e6
3 changed files with 22 additions and 34 deletions

View File

@ -50,7 +50,6 @@ bool checkPathVariableAccessFeasible(CalculationNode const* cn,
size_t len = onePath.size(); size_t len = onePath.size();
bool isEdgeAccess = false; bool isEdgeAccess = false;
bool isVertexAccess = false; bool isVertexAccess = false;
bool isAsterisc = false;
size_t attrAccessTo = 0; size_t attrAccessTo = 0;
if (onePath[len - 2]->type == NODE_TYPE_ATTRIBUTE_ACCESS) { if (onePath[len - 2]->type == NODE_TYPE_ATTRIBUTE_ACCESS) {
@ -82,7 +81,7 @@ bool checkPathVariableAccessFeasible(CalculationNode const* cn,
else if ((onePath[len - 3]->type == NODE_TYPE_ITERATOR) && else if ((onePath[len - 3]->type == NODE_TYPE_ITERATOR) &&
(onePath[len - 4]->type == NODE_TYPE_EXPANSION)){ (onePath[len - 4]->type == NODE_TYPE_EXPANSION)){
// we now need to check for p.edges[*] which becomes a fancy structure // we now need to check for p.edges[*] which becomes a fancy structure
isAsterisc = true; return false;
} }
else { else {
return false; return false;
@ -118,42 +117,29 @@ bool checkPathVariableAccessFeasible(CalculationNode const* cn,
} }
if (accessNodeBranch->isSimple() && filterByNode->type == NODE_TYPE_VALUE) { if (accessNodeBranch->isSimple() && filterByNode->type == NODE_TYPE_VALUE) {
AstNode *newNode = accessNodeBranch->clone(ast); AstNode *newNode = pathAccessNode->clone(ast);
// since we just copied one path, we should only find one. // since we just copied one path, we should only find one.
newNode->findVariableAccess(currentPath, clonePath, var); newNode->findVariableAccess(currentPath, clonePath, var);
newNode->dump(20);
if (isAsterisc) {
}
else {
auto len = clonePath[0].size(); auto len = clonePath[0].size();
/// todo len < 4 if (len < 4) {
// well, if we've gotten here, we can't cluster filter, but
// usual early filtering should be fine.
return true;
}
AstNode* firstRefNode = (AstNode*) clonePath[0][len - 4]; AstNode* firstRefNode = (AstNode*) clonePath[0][len - 4];
TRI_ASSERT(firstRefNode->type == NODE_TYPE_ATTRIBUTE_ACCESS); TRI_ASSERT(firstRefNode->type == NODE_TYPE_ATTRIBUTE_ACCESS);
auto varRefNode = new AstNode(NODE_TYPE_REFERENCE); auto varRefNode = new AstNode(NODE_TYPE_REFERENCE);
ast->query()->addNode(varRefNode); ast->query()->addNode(varRefNode);
varRefNode->setData(isEdgeAccess ? tn->edgeOutVariable(): tn->vertexOutVariable()); varRefNode->setData(isEdgeAccess ? tn->edgeOutVariable(): tn->vertexOutVariable());
firstRefNode->changeMember(0, varRefNode); firstRefNode->changeMember(0, varRefNode);
tn->storeSimpleExpression(isAsterisc, tn->storeSimpleExpression(isEdgeAccess,
isEdgeAccess,
attrAccessTo, attrAccessTo,
NODE_TYPE_OPERATOR_BINARY_EQ, NODE_TYPE_OPERATOR_BINARY_EQ,
newNode, newNode,
filterByNode); filterByNode);
printf("\n xxxxx: %s\n", newNode->toString().c_str());
printf("\n yyyy: %s\n", accessNodeBranch->toString().c_str());
printf("\n yyyy: %s\n", filterByNode->toString().c_str());
} }
}
printf("\na: %s\n", compareNode->toString().c_str());
printf("\na: %s\n", accessNodeBranch->toString().c_str());
triagens::basics::Json j(TRI_UNKNOWN_MEM_ZONE, accessNodeBranch->toJson(TRI_UNKNOWN_MEM_ZONE, true));
printf("sanotuh %s\n", j.toString().c_str());
} }
} }

View File

@ -35,10 +35,16 @@ using namespace triagens::aql;
void TraversalNode::simpleTravererExpression::toJson(triagens::basics::Json& json, void TraversalNode::simpleTravererExpression::toJson(triagens::basics::Json& json,
TRI_memory_zone_t* zone) const TRI_memory_zone_t* zone) const
{ {
json("isAsteriscAccess", triagens::basics::Json(isAsteriscAccess)) auto op = AstNode::Operators.find(comparisonType);
("isEdgeAccess", triagens::basics::Json(isEdgeAccess))
if (op == AstNode::Operators.end()) {
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_QUERY_PARSE, "invalid operator for simpleTraverserExpression");
}
std::string const operatorStr = op->second;
json("isEdgeAccess", triagens::basics::Json(isEdgeAccess))
("indexAccess", triagens::basics::Json((int32_t)indexAccess)) ("indexAccess", triagens::basics::Json((int32_t)indexAccess))
("comparisonType", triagens::basics::Json("==")) /// TODO more comparison types? ("comparisonType", triagens::basics::Json(operatorStr))
("varAccess", varAccess->toJson(zone, true)) ("varAccess", varAccess->toJson(zone, true))
("compareTo", compareTo->toJson(zone, true)); ("compareTo", compareTo->toJson(zone, true));
@ -414,15 +420,13 @@ void TraversalNode::setCondition(triagens::aql::Condition* condition){
_condition = condition; _condition = condition;
} }
void TraversalNode::storeSimpleExpression(bool isAsteriscAccess, void TraversalNode::storeSimpleExpression(bool isEdgeAccess,
bool isEdgeAccess,
size_t indexAccess, size_t indexAccess,
AstNodeType comparisonType, AstNodeType comparisonType,
AstNode const* varAccess, AstNode const* varAccess,
AstNode const* compareTo) { AstNode const* compareTo) {
simpleTravererExpression e { simpleTravererExpression e {
isAsteriscAccess,
isEdgeAccess, isEdgeAccess,
indexAccess, indexAccess,
comparisonType, comparisonType,

View File

@ -50,7 +50,6 @@ namespace triagens {
friend class TraversalCollectionBlock; friend class TraversalCollectionBlock;
struct simpleTravererExpression { struct simpleTravererExpression {
bool isAsteriscAccess;
bool isEdgeAccess; bool isEdgeAccess;
size_t indexAccess; size_t indexAccess;
AstNodeType comparisonType; AstNodeType comparisonType;
@ -341,8 +340,7 @@ namespace triagens {
/// @brief Remember a simple comparator filter /// @brief Remember a simple comparator filter
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void storeSimpleExpression(bool isAsteriscAccess, void storeSimpleExpression(bool isEdgeAccess,
bool isEdgeAccess,
size_t indexAccess, size_t indexAccess,
AstNodeType comparisonType, AstNodeType comparisonType,
AstNode const* varAccess, AstNode const* varAccess,