LENS-590: Support sync option in "query results" command in CLI
Project: http://git-wip-us.apache.org/repos/asf/incubator-lens/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-lens/commit/41b293ca Tree: http://git-wip-us.apache.org/repos/asf/incubator-lens/tree/41b293ca Diff: http://git-wip-us.apache.org/repos/asf/incubator-lens/diff/41b293ca Branch: refs/heads/current-release-line Commit: 41b293ca143855f7e9afbdb974fdda0aa5a5fc1b Parents: 06e1155 Author: Pranav Agarwal <[email protected]> Authored: Wed Jun 3 16:31:31 2015 +0530 Committer: Rajat Khandelwal <[email protected]> Committed: Wed Jun 3 16:31:31 2015 +0530 ---------------------------------------------------------------------- .../lens/cli/commands/LensQueryCommands.java | 24 +++++++++++++++----- .../apache/lens/cli/TestLensQueryCommands.java | 23 +++++++++++++++---- .../java/org/apache/lens/client/LensClient.java | 13 ++++++++--- .../org/apache/lens/client/LensStatement.java | 8 +++++-- src/site/apt/user/cli.apt | 2 +- 5 files changed, 53 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/41b293ca/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java ---------------------------------------------------------------------- diff --git a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java index 6c4a1b5..1eb7ed6 100644 --- a/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java +++ b/lens-cli/src/main/java/org/apache/lens/cli/commands/LensQueryCommands.java @@ -264,12 +264,16 @@ public class LensQueryCommands extends BaseLensCommand { * @return the query results */ @CliCommand(value = "query results", - help = "get results of async query with query handle <query_handle>. Can " - + "optionally save the results to a file by providing <save_location>") + help = "get results of query with query handle <query_handle>. If async is false " + + "then wait till the query execution is completed, it's by default true. " + + "Can optionally save the results to a file by providing <save_location>.") public String getQueryResults( @CliOption(key = {"", "query_handle"}, mandatory = true, help = "<query_handle>") String qh, - @CliOption(key = {"save_location"}, mandatory = false, help = "<save_location>") String location) { + @CliOption(key = {"save_location"}, mandatory = false, help = "<save_location>") String location, + @CliOption(key = {"async"}, mandatory = false, unspecifiedDefaultValue = "true", + help = "<async>") boolean async) { QueryHandle queryHandle = new QueryHandle(UUID.fromString(qh)); + LensClient.LensClientResultSetWithStats results; try { String prefix = ""; if (StringUtils.isNotBlank(location)) { @@ -285,8 +289,14 @@ public class LensQueryCommands extends BaseLensCommand { } return "Saved to " + location; } else { - LensClient.LensClientResultSetWithStats results = getClient().getAsyncResults(queryHandle); - if (results.getResultSet().getResult() instanceof InMemoryQueryResult) { + if (async) { + results = getClient().getAsyncResults(queryHandle); + } else { + results = getClient().getSyncResults(queryHandle); + } + if (results.getResultSet() == null) { + return "Resultset not yet available"; + } else if (results.getResultSet().getResult() instanceof InMemoryQueryResult) { location = getValidPath(location + File.separator + qh + ".csv", false, false); try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(location), Charset.defaultCharset())) { @@ -298,8 +308,10 @@ public class LensQueryCommands extends BaseLensCommand { + formatResultSet(results); } } - } else { + } else if (async) { return formatResultSet(getClient().getAsyncResults(queryHandle)); + } else { + return formatResultSet(getClient().getSyncResults(queryHandle)); } } catch (Throwable t) { return t.getMessage(); http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/41b293ca/lens-cli/src/test/java/org/apache/lens/cli/TestLensQueryCommands.java ---------------------------------------------------------------------- diff --git a/lens-cli/src/test/java/org/apache/lens/cli/TestLensQueryCommands.java b/lens-cli/src/test/java/org/apache/lens/cli/TestLensQueryCommands.java index 32a89ac..d5fd999 100644 --- a/lens-cli/src/test/java/org/apache/lens/cli/TestLensQueryCommands.java +++ b/lens-cli/src/test/java/org/apache/lens/cli/TestLensQueryCommands.java @@ -83,6 +83,7 @@ public class TestLensQueryCommands extends LensCliApplicationTest { assertTrue(resDir.exists() || resDir.mkdirs()); testExecuteSyncQuery(qCom); testExecuteAsyncQuery(qCom); + testSyncResults(qCom); testExplainQuery(qCom); testExplainFailQuery(qCom); testPreparedQuery(qCom); @@ -98,6 +99,7 @@ public class TestLensQueryCommands extends LensCliApplicationTest { assertEquals(result, "No prepared queries"); testExecuteSyncQuery(qCom); testExecuteAsyncQuery(qCom); + testSyncResults(qCom); testExplainQuery(qCom); testExplainFailQuery(qCom); testPreparedQuery(qCom); @@ -140,11 +142,11 @@ public class TestLensQueryCommands extends LensCliApplicationTest { log.debug("Prepared Query Status is " + status); assertTrue(status.contains("Status : SUCCESSFUL")); - result = qCom.getQueryResults(handle, null); + result = qCom.getQueryResults(handle, null, true); log.debug("Prepared Query Result is " + result); assertTrue(result.contains("1\tfirst")); // Fetch again. - result = qCom.getQueryResults(handle, null); + result = qCom.getQueryResults(handle, null, true); log.debug("Prepared Query Result is " + result); assertTrue(result.contains("1\tfirst")); @@ -248,7 +250,7 @@ public class TestLensQueryCommands extends LensCliApplicationTest { details = qCom.getDetails(qh); assertTrue(details.contains("driverQuery")); - result = qCom.getQueryResults(qh, null); + result = qCom.getQueryResults(qh, null, true); assertTrue(result.contains("1\tfirst")); downloadResult(qCom, qh, result); @@ -298,7 +300,7 @@ public class TestLensQueryCommands extends LensCliApplicationTest { } private void downloadResult(LensQueryCommands qCom, String qh, String expected) throws IOException { - assertTrue(qCom.getQueryResults(qh, resDir.getAbsolutePath()).contains("Saved")); + assertTrue(qCom.getQueryResults(qh, resDir.getAbsolutePath(), true).contains("Saved")); assertEquals(readFile(resDir.getAbsolutePath() + File.separator + qh + ".csv").trim(), expected.trim()); } private String readFile(String path) throws FileNotFoundException { @@ -371,6 +373,17 @@ public class TestLensQueryCommands extends LensCliApplicationTest { } /** + * Test execute sync results. + * + * @param qCom the q com + */ + private void testSyncResults(LensQueryCommands qCom) { + String sql = "cube select id,name from test_dim"; + String qh = qCom.executeQuery(sql, true, "testQuery4"); + String result = qCom.getQueryResults(qh, null, false); + assertTrue(result.contains("1\tfirst"), result); + } + /** * Test purged finished result set. * * @param qCom the q com @@ -387,7 +400,7 @@ public class TestLensQueryCommands extends LensCliApplicationTest { } assertTrue(qCom.getStatus(qh).contains("Status : SUCCESSFUL")); - String result = qCom.getQueryResults(qh, null); + String result = qCom.getQueryResults(qh, null, true); System.out.println("@@ RESULT " + result); assertNotNull(result); http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/41b293ca/lens-client/src/main/java/org/apache/lens/client/LensClient.java ---------------------------------------------------------------------- diff --git a/lens-client/src/main/java/org/apache/lens/client/LensClient.java b/lens-client/src/main/java/org/apache/lens/client/LensClient.java index cd8bf16..7c82619 100644 --- a/lens-client/src/main/java/org/apache/lens/client/LensClient.java +++ b/lens-client/src/main/java/org/apache/lens/client/LensClient.java @@ -133,7 +133,10 @@ public class LensClient { return new LensClientResultSetWithStats(result, statement.getQuery()); } - private LensClientResultSetWithStats getResultsFromHandle(QueryHandle q) { + private LensClientResultSetWithStats getResultsFromHandle(QueryHandle q, boolean async) { + if (!async) { + statement.waitForQueryToComplete(q); + } LensQuery query = statement.getQuery(q); if (query.getStatus().getStatus() == QueryStatus.Status.FAILED) { @@ -148,7 +151,11 @@ public class LensClient { } public LensClientResultSetWithStats getAsyncResults(QueryHandle q) { - return getResultsFromHandle(q); + return getResultsFromHandle(q, true); + } + + public LensClientResultSetWithStats getSyncResults(QueryHandle q) { + return getResultsFromHandle(q, false); } public Response getHttpResults() { @@ -524,7 +531,7 @@ public class LensClient { public LensClientResultSetWithStats getResultsFromPrepared(QueryPrepareHandle phandle, String queryName) { QueryHandle qh = statement.executeQuery(phandle, true, queryName); - return getResultsFromHandle(qh); + return getResultsFromHandle(qh, true); } public QueryHandle executePrepared(QueryPrepareHandle phandle, String queryName) { http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/41b293ca/lens-client/src/main/java/org/apache/lens/client/LensStatement.java ---------------------------------------------------------------------- diff --git a/lens-client/src/main/java/org/apache/lens/client/LensStatement.java b/lens-client/src/main/java/org/apache/lens/client/LensStatement.java index 4472a80..e2693c9 100644 --- a/lens-client/src/main/java/org/apache/lens/client/LensStatement.java +++ b/lens-client/src/main/java/org/apache/lens/client/LensStatement.java @@ -30,10 +30,13 @@ import javax.ws.rs.core.Response; import org.apache.lens.api.APIResult; import org.apache.lens.api.query.*; +import org.apache.lens.api.query.QueryStatus.Status; + import org.apache.lens.api.response.LensJAXBContextResolver; import org.apache.lens.api.response.LensResponse; import org.apache.lens.api.response.NoErrorPayload; + import org.apache.commons.lang.StringUtils; import org.glassfish.jersey.media.multipart.FormDataBodyPart; @@ -187,9 +190,10 @@ public class LensStatement { * * @param handle the handle */ - private void waitForQueryToComplete(QueryHandle handle) { + public void waitForQueryToComplete(QueryHandle handle) { query = getQuery(handle); - while (!query.getStatus().finished()) { + while (!query.getStatus().finished() + && !(query.getStatus().toString().equals(Status.CLOSED.toString()))) { query = getQuery(handle); try { Thread.sleep(connection.getLensConnectionParams().getQueryPollInterval()); http://git-wip-us.apache.org/repos/asf/incubator-lens/blob/41b293ca/src/site/apt/user/cli.apt ---------------------------------------------------------------------- diff --git a/src/site/apt/user/cli.apt b/src/site/apt/user/cli.apt index 2016bfd..a5bc056 100644 --- a/src/site/apt/user/cli.apt +++ b/src/site/apt/user/cli.apt @@ -324,7 +324,7 @@ User CLI Commands *--+--+ |query list [--state \<query-status\>] [--name \<query-name\>] [--user \<user-who-submitted-query\>] [--fromDate \<submission-time-is-after\>] [--toDate \<submission-time-is-before\>]|Get all queries. Various filter options can be provided(optionally), as can be seen from the command syntax| *--+--+ -|query results [--query_handle] \<query_handle\> [--save_location \<save_location\>]|get results of async query with query handle <<<query_handle>>>. Can optionally save the results to a file by providing <<<save_location>>>| +|query results [--query_handle] \<query_handle\> [--save_location \<save_location\>] [--async \<async\>]|get results of query with query handle <<<query_handle>>>. If async is false then wait till the query execution is completed, it's by default true. Can optionally save the results to a file by providing <<<save_location>>>.| *--+--+ |query status [--query_handle] \<query_handle\>|Fetch status of executed query having query handle <<<query_handle>>>| *--+--+
