static void DumpValue (TRI_aql_dump_t* const state, const TRI_aql_node_t* const node) { PrintIndent(state); switch (node->_value._type) { case TRI_AQL_TYPE_FAIL: printf("fail\n"); break; case TRI_AQL_TYPE_NULL: printf("null\n"); break; case TRI_AQL_TYPE_BOOL: printf("bool (%lu)\n", (unsigned long) TRI_AQL_NODE_BOOL(node)); break; case TRI_AQL_TYPE_INT: printf("int (%ld)\n", (long) TRI_AQL_NODE_INT(node)); break; case TRI_AQL_TYPE_DOUBLE: printf("double (%f)\n", TRI_AQL_NODE_DOUBLE(node)); break; case TRI_AQL_TYPE_STRING: printf("string (%s)\n", TRI_AQL_NODE_STRING(node)); break; } }
static TRI_aql_node_t* ProcessStatement (TRI_aql_statement_walker_t* const walker, TRI_aql_node_t* node) { TRI_aql_explain_t* explain; TRI_aql_node_type_e type = node->_type; explain = (TRI_aql_explain_t*) walker->_data; switch (type) { case TRI_AQL_NODE_SCOPE_START: { TRI_aql_scope_t* scope = (TRI_aql_scope_t*) TRI_AQL_NODE_DATA(node); assert(scope); if (scope->_type != TRI_AQL_SCOPE_SUBQUERY && scope->_type != TRI_AQL_SCOPE_MAIN) { ++explain->_level; } break; } case TRI_AQL_NODE_SCOPE_END: { TRI_aql_scope_t* scope = (TRI_aql_scope_t*) TRI_AQL_NODE_DATA(node); assert(scope); if (scope->_type != TRI_AQL_SCOPE_SUBQUERY && scope->_type != TRI_AQL_SCOPE_MAIN) { --explain->_level; } break; } case TRI_AQL_NODE_EXPAND: { TRI_aql_node_t* variableNode; TRI_json_t* row; row = GetRowProtoType(explain, TRI_AQL_NODE_REFERENCE); variableNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, row, "resultVariable", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, TRI_AQL_NODE_STRING(variableNode))); AddNodeValue(row, TRI_AQL_NODE_MEMBER(node, 2)); AddRow(explain, row); row = GetRowProtoType(explain, TRI_AQL_NODE_EXPAND); variableNode = TRI_AQL_NODE_MEMBER(node, 1); TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, row, "resultVariable", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, TRI_AQL_NODE_STRING(variableNode))); AddNodeValue(row, TRI_AQL_NODE_MEMBER(node, 3)); AddRow(explain, row); break; } case TRI_AQL_NODE_SUBQUERY: { TRI_aql_node_t* variableNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_json_t* row; row = GetRowProtoType(explain, node->_type); TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, row, "resultVariable", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, TRI_AQL_NODE_STRING(variableNode))); AddRow(explain, row); break; } case TRI_AQL_NODE_FOR: { TRI_aql_node_t* variableNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_aql_node_t* expressionNode = TRI_AQL_NODE_MEMBER(node, 1); TRI_json_t* row; row = GetRowProtoType(explain, node->_type); TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, row, "resultVariable", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, TRI_AQL_NODE_STRING(variableNode))); AddNodeValue(row, expressionNode); AddRow(explain, row); break; } case TRI_AQL_NODE_RETURN: case TRI_AQL_NODE_RETURN_EMPTY: { TRI_aql_node_t* expressionNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_json_t* row; row = GetRowProtoType(explain, node->_type); AddNodeValue(row, expressionNode); AddRow(explain, row); break; } case TRI_AQL_NODE_FILTER: { TRI_aql_node_t* expressionNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_json_t* row; row = GetRowProtoType(explain, node->_type); AddNodeValue(row, expressionNode); AddRow(explain, row); break; } case TRI_AQL_NODE_LET: { TRI_aql_node_t* variableNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_aql_node_t* expressionNode = TRI_AQL_NODE_MEMBER(node, 1); TRI_json_t* row; row = GetRowProtoType(explain, node->_type); TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, row, "resultVariable", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, TRI_AQL_NODE_STRING(variableNode))); AddNodeValue(row, expressionNode); AddRow(explain, row); break; } case TRI_AQL_NODE_SORT: { TRI_aql_node_t* listNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_json_t* row; row = GetRowProtoType(explain, node->_type); AddNodeValue(row, listNode); AddRow(explain, row); break; } case TRI_AQL_NODE_LIMIT: { TRI_aql_node_t* offsetNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_aql_node_t* countNode = TRI_AQL_NODE_MEMBER(node, 1); TRI_json_t* row; row = GetRowProtoType(explain, node->_type); TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, row, "offset", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, (double) TRI_AQL_NODE_INT(offsetNode))); TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, row, "count", TRI_CreateNumberJson(TRI_UNKNOWN_MEM_ZONE, (double) TRI_AQL_NODE_INT(countNode))); AddRow(explain, row); break; } case TRI_AQL_NODE_COLLECT: { TRI_aql_node_t* listNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_json_t* row; row = GetRowProtoType(explain, node->_type); if (node->_members._length > 1) { TRI_aql_node_t* variableNode = TRI_AQL_NODE_MEMBER(node, 1); TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, row, "resultVariable", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, TRI_AQL_NODE_STRING(variableNode))); } AddNodeValue(row, listNode); AddRow(explain, row); break; } default: { } } return NULL; }