private void waitForQueryCompleted()

in tajo-client/src/main/java/org/apache/tajo/cli/TajoCli.java [334:454]


  private void waitForQueryCompleted(QueryId queryId) {
    // if query is empty string
    if (queryId.equals(QueryIdFactory.NULL_QUERY_ID)) {
      return;
    }

    // query execute
    try {

      QueryStatus status;
      int initRetries = 0;
      int progressRetries = 0;
      while (true) {
        // TODO - configurabl
        status = client.getQueryStatus(queryId);
        if(status.getState() == QueryState.QUERY_MASTER_INIT || status.getState() == QueryState.QUERY_MASTER_LAUNCHED) {
          Thread.sleep(Math.min(20 * initRetries, 1000));
          initRetries++;
          continue;
        }

        if (status.getState() == QueryState.QUERY_RUNNING || status.getState() == QueryState.QUERY_SUCCEEDED) {
          sout.println("Progress: " + (int)(status.getProgress() * 100.0f)
              + "%, response time: " + ((float)(status.getFinishTime() - status.getSubmitTime()) / 1000.0) + " sec");
          sout.flush();
        }

        if (status.getState() != QueryState.QUERY_RUNNING &&
            status.getState() != QueryState.QUERY_NOT_ASSIGNED &&
            status.getState() != QueryState.QUERY_KILL_WAIT) {
          break;
        } else {
          Thread.sleep(Math.min(200 * progressRetries, 1000));
          progressRetries += 2;
        }
      }

      if (status.getState() == QueryState.QUERY_ERROR) {
        sout.println("Internal error!");
      } else if (status.getState() == QueryState.QUERY_FAILED) {
        sout.println("Query failed!");
      } else if (status.getState() == QueryState.QUERY_KILLED) {
        sout.println(queryId + " is killed.");
      } else {
        if (status.getState() == QueryState.QUERY_SUCCEEDED) {
          sout.println("final state: " + status.getState()
              + ", response time: " + (((float)(status.getFinishTime() - status.getSubmitTime()) / 1000.0)
              + " sec"));
          if (status.hasResult()) {
            ResultSet res = null;
            TableDesc desc = null;
            if (queryId.equals(QueryIdFactory.NULL_QUERY_ID)) {
              res = client.createNullResultSet(queryId);
            } else {
              ClientProtos.GetQueryResultResponse response = client.getResultResponse(queryId);
              desc = CatalogUtil.newTableDesc(response.getTableDesc());
              conf.setVar(ConfVars.USERNAME, response.getTajoUserName());
              res = new TajoResultSet(client, queryId, conf, desc);
            }
            try {
              if (res == null) {
                sout.println("OK");
                return;
              }

              ResultSetMetaData rsmd = res.getMetaData();

              TableStats stat = desc.getStats();
              String volume = FileUtil.humanReadableByteCount(stat.getNumBytes(), false);
              long resultRows = stat.getNumRows();
              sout.println("result: " + desc.getPath() + ", " + resultRows + " rows (" + volume + ")");

              int numOfColumns = rsmd.getColumnCount();
              for (int i = 1; i <= numOfColumns; i++) {
                if (i > 1) sout.print(",  ");
                String columnName = rsmd.getColumnName(i);
                sout.print(columnName);
              }
              sout.println("\n-------------------------------");

              int numOfPrintedRows = 0;
              while (res.next()) {
                // TODO - to be improved to print more formatted text
                for (int i = 1; i <= numOfColumns; i++) {
                  if (i > 1) sout.print(",  ");
                  String columnValue = res.getObject(i).toString();
                  if(res.wasNull()){
                    sout.print("null");
                  } else {
                    sout.print(columnValue);
                  }
                }
                sout.println();
                sout.flush();
                numOfPrintedRows++;
                if (numOfPrintedRows >= PRINT_LIMIT) {
                  sout.print("continue... ('q' is quit)");
                  sout.flush();
                  if (sin.read() == 'q') {
                    sout.println();
                    break;
                  }
                  numOfPrintedRows = 0;
                  sout.println();
                }
              }
            } finally {
              if(res != null) {
                res.close();
              }
            }
          } else {
            sout.println("OK");
          }
        }
      }
    } catch (Throwable t) {
      t.printStackTrace();
      System.err.println(t.getMessage());
    }
  }