From fa7668e1ceae48edb5a3ef7dd2eb614dc3ec6c44 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 3 Nov 2014 10:38:05 +0000 Subject: [PATCH] snapshot --- arangod/Aql/OptimizerRules.cpp | 43 +++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/arangod/Aql/OptimizerRules.cpp b/arangod/Aql/OptimizerRules.cpp index 63fef36520..ee4f47465d 100644 --- a/arangod/Aql/OptimizerRules.cpp +++ b/arangod/Aql/OptimizerRules.cpp @@ -2274,6 +2274,33 @@ struct OrToInConverter { std::vector valueNodes; std::string variableName; + // node should be an attribute access + AstNode* getValueFromArray (AstNode const* node) { + TRI_ASSERT(node->type == NODE_TYPE_ATTRIBUTE_ACCESS); + AstNode* array = node->getMember(0); + + if (array->type == NODE_TYPE_ATTRIBUTE_ACCESS) { + array = getValueFromArray(array); + } + TRI_ASSERT(array->type == NODE_TYPE_ARRAY); + + char const* key = node->getStringValue(); + + for (auto i = 0; i < array->numMembers(); i++) { + AstNode* arrayElement = array->getMember(i); + TRI_ASSERT(arrayElement->type == NODE_TYPE_ARRAY_ELEMENT); + if (strcmp(key, arrayElement->getStringValue()) == 0){ + TRI_ASSERT(arrayElement->getMember(0)->type == NODE_TYPE_VALUE); + return arrayElement->getMember(0); + } + } + return nullptr; + } + + /*AstNode* getValueFromList (AstNode const* node) { + return node; //TODO implement + }*/ + AstNode* buildInExpression (Ast* ast) { // the list of comparison values auto list = ast->createNodeList(); @@ -2307,7 +2334,21 @@ struct OrToInConverter { valueNodes.push_back(rhs); return true; } - + if (lhs->type == NODE_TYPE_ATTRIBUTE_ACCESS && canConvertExpression(rhs)) { + // value == attr + valueNodes.push_back(lhs); + return true; + } + if (rhs->type == NODE_TYPE_ATTRIBUTE_ACCESS && canConvertExpression(lhs)) { + // attr == value + valueNodes.push_back(rhs); + return true; + } + /*if (lhs->type == NODE_TYPE_INDEXED_ACCESS && canConvertExpression(rhs)) { + // value == attr + if (lhs->getMember(0)->type == NODE_TYPE_LIST) { + } + }*/ // fall-through intentional }