in quick-start/java/RedshiftDataAPI.java [88:161]
private String executeSqlDataApi(AWSRedshiftDataAPI redshiftDataApiClient, String redshiftClusterId,
String redshiftDatabaseName, String redshiftUser, String command, String query, boolean isSynchronous,
LambdaLogger logger) throws InterruptedException {
String queryStatus = "";
int attempts = 0;
try {
ExecuteStatementRequest statementRequest = new ExecuteStatementRequest();
DescribeStatementRequest describeRequest = new DescribeStatementRequest();
statementRequest.setClusterIdentifier(redshiftClusterId);
statementRequest.setDbUser(redshiftUser);
statementRequest.setDatabase(redshiftDatabaseName);
statementRequest.setSql(query);
// Calling Redshift Data API with executeStatement()
ExecuteStatementResult resp = redshiftDataApiClient.executeStatement(statementRequest);
String queryId = resp.getId();
boolean done = false;
describeRequest.setId(queryId);
DescribeStatementResult describeResult = redshiftDataApiClient.describeStatement(describeRequest);
queryStatus = describeResult.getStatus();
// Wait until query is finished or max cycles limit has been reached.
while (done == false && isSynchronous && attempts++ < MAX_WAIT_CYCLES) {
TimeUnit.SECONDS.sleep(1);
describeResult = redshiftDataApiClient.describeStatement(describeRequest);
queryStatus = describeResult.getStatus();
if (queryStatus.equals("FAILED")) {
logger.log(String.format("SQL query failed, query id: %s \n Error: %s", queryId,
describeResult.getError().toString()));
System.exit(1);
} else if (queryStatus.equals("FINISHED")) {
logger.log(String.format("Query status is: %s for query id: %s and command: %s\n", queryStatus,
queryId, command));
done = true;
// Print query response if available (typically from Select SQL statements)
if (describeResult.isHasResultSet()) {
GetStatementResultRequest statementResultRequest = new GetStatementResultRequest();
statementResultRequest.setId(queryId);
GetStatementResultResult sqlresult = redshiftDataApiClient
.getStatementResult(statementResultRequest);
logger.log(String.format("Printing response of query: %s --> %s", command,
sqlresult.getRecords().toString()));
}
} else {
logger.log(String.format("Currently working... query status is: %s \n", queryStatus));
}
}
if (done == false && attempts >= MAX_WAIT_CYCLES && isSynchronous) {
logger.log(
"Limit for MAX_WAIT_CYCLES has been reached before the query was able to finish. We have exited out of the while-loop. You may increase the limit accordingly. \n");
logger.log(String.format("Query status is: %s for query id: %s and command: %s\n", queryStatus, queryId,
command));
System.exit(1);
}
} catch (AWSRedshiftDataAPIException e) {
logger.log(e.getStackTrace().toString());
System.exit(1);
}
return queryStatus;
}