コード例 #1
0
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;
  }
}
コード例 #2
0
ファイル: ahuacatl-explain.c プロジェクト: luxyer/ArangoDB
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;
}