1
0
Fork 0
This commit is contained in:
James 2014-11-03 10:38:05 +00:00
parent b301102655
commit fa7668e1ce
1 changed files with 42 additions and 1 deletions

View File

@ -2274,6 +2274,33 @@ struct OrToInConverter {
std::vector<AstNode const*> 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
}