mirror of https://gitee.com/bigwinds/arangodb
remove p.edges[*].foo detection, we can't handle this.
This commit is contained in:
parent
21cf784cbc
commit
c2fcef77e6
|
@ -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());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue