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>>>|
 *--+--+

Reply via email to