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());
}
}