You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/05/27 13:34:10 UTC

tajo git commit: TAJO-1618: [Rest API] queries/{queryId} should set default print type.

Repository: tajo
Updated Branches:
  refs/heads/master 8fd9ae72c -> f124b87e6


TAJO-1618: [Rest API] queries/{queryId} should set default print type.

Closes #581

Signed-off-by: Jihoon Son <ji...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/f124b87e
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/f124b87e
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/f124b87e

Branch: refs/heads/master
Commit: f124b87e6701481a93299bd283b00778da65710a
Parents: 8fd9ae7
Author: DaeMyung Kang <ch...@naver.com>
Authored: Wed May 27 20:33:18 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Wed May 27 20:33:48 2015 +0900

----------------------------------------------------------------------
 CHANGES                                         |   3 +
 .../tajo/ws/rs/resources/QueryResource.java     |  45 +++----
 .../ws/rs/resources/QueryResultResource.java    |   2 +-
 .../tajo/ws/rs/resources/TestQueryResource.java |  56 ++++++---
 .../rs/resources/TestQueryResultResource.java   | 122 ++++++++++++++-----
 5 files changed, 151 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index da63606..0d4ae04 100644
--- a/CHANGES
+++ b/CHANGES
@@ -27,6 +27,9 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1618: [Rest API] queries/{queryId} should set default print type.
+    (Contributed by DaeMyoung Kang, Committed by jihoon)
+
     TAJO-1553: Improve broadcast join planning. (jihoon)
 
     TAJO-1577: Add test cases to verify join plans. (jihoon)

http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
index 99609d7..8f45c7b 100644
--- a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
+++ b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResource.java
@@ -18,28 +18,6 @@
 
 package org.apache.tajo.ws.rs.resources;
 
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Application;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.UriInfo;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.tajo.QueryId;
@@ -54,13 +32,18 @@ import org.apache.tajo.querymaster.QueryJobEvent;
 import org.apache.tajo.session.InvalidSessionException;
 import org.apache.tajo.session.Session;
 import org.apache.tajo.util.TajoIdUtils;
-import org.apache.tajo.ws.rs.JerseyResourceDelegate;
-import org.apache.tajo.ws.rs.JerseyResourceDelegateContext;
-import org.apache.tajo.ws.rs.JerseyResourceDelegateContextKey;
-import org.apache.tajo.ws.rs.JerseyResourceDelegateUtil;
-import org.apache.tajo.ws.rs.ResourcesUtil;
+import org.apache.tajo.ws.rs.*;
 import org.apache.tajo.ws.rs.requests.SubmitQueryRequest;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.*;
+import javax.ws.rs.core.Response.Status;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @Path("/databases/{databaseName}/queries")
 public class QueryResource {
 
@@ -87,7 +70,9 @@ public class QueryResource {
   private static final String submitQueryRequestKeyName = "submitQueryRequest";
   private static final String printTypeKeyName = "printType";
   private static final String queryIdKeyName = "queryId";
-  
+
+  private static final String defaultQueryInfoPrintType = "COMPLICATED";
+
   private void initializeContext() {
     context = new JerseyResourceDelegateContext();
     JerseyResourceDelegateContextKey<UriInfo> uriInfoKey =
@@ -311,7 +296,8 @@ public class QueryResource {
   @GET
   @Path("{queryId}")
   @Produces(MediaType.APPLICATION_JSON)
-  public Response getQuery(@PathParam("queryId") String queryId, @QueryParam("print") String printType) {
+  public Response getQuery(@PathParam("queryId") String queryId,
+													 @DefaultValue(defaultQueryInfoPrintType) @QueryParam("print") String printType) {
     if (LOG.isDebugEnabled()) {
       LOG.debug("Client sent a get query request.");
     }
@@ -325,6 +311,7 @@ public class QueryResource {
       context.put(queryIdKey, queryId);
       JerseyResourceDelegateContextKey<String> printTypeKey =
           JerseyResourceDelegateContextKey.valueOf(printTypeKeyName, String.class);
+
       context.put(printTypeKey, printType);
       
       response = JerseyResourceDelegateUtil.runJerseyResourceDelegate(

http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
index 0f83189..92b95d2 100644
--- a/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
+++ b/tajo-core/src/main/java/org/apache/tajo/ws/rs/resources/QueryResultResource.java
@@ -260,7 +260,7 @@ public class QueryResultResource {
   public Response getQueryResultSet(@HeaderParam(QueryResource.tajoSessionIdHeaderName) String sessionId,
       @PathParam("cacheId") String cacheId,
       @DefaultValue("-1") @QueryParam("offset") int offset,
-      @DefaultValue("-1") @QueryParam("count") int count) {
+      @DefaultValue("100") @QueryParam("count") int count) {
     if (LOG.isDebugEnabled()) {
       LOG.debug("Client sent a get query result set request.");
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java b/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
index 47a7bcb..77c0117 100644
--- a/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
+++ b/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResource.java
@@ -18,18 +18,7 @@
 
 package org.apache.tajo.ws.rs.resources;
 
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
+import com.google.gson.internal.StringMap;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
@@ -45,7 +34,16 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.gson.internal.StringMap;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
 
 import static org.junit.Assert.*;
 
@@ -106,7 +104,7 @@ public class TestQueryResource extends QueryTestCaseBase {
   public void testGetAllQueries() throws Exception {
     String sessionId = generateNewSessionAndGetId();
     SubmitQueryRequest queryRequest = createNewQueryRequest("select * from lineitem");
-    
+
     Response response = restClient.target(queriesURI)
         .request().header(tajoSessionIdHeaderName, sessionId)
         .post(Entity.entity(queryRequest, MediaType.APPLICATION_JSON));
@@ -143,7 +141,7 @@ public class TestQueryResource extends QueryTestCaseBase {
   public void testSubmitQuery() throws Exception {
     String sessionId = generateNewSessionAndGetId();
     SubmitQueryRequest queryRequest = createNewQueryRequest("select * from lineitem");
-    
+
     Response response = restClient.target(queriesURI)
         .request().header(tajoSessionIdHeaderName, sessionId)
         .post(Entity.entity(queryRequest, MediaType.APPLICATION_JSON));
@@ -167,4 +165,32 @@ public class TestQueryResource extends QueryTestCaseBase {
     assertNotNull(queryInfo);
     assertEquals(queryId, queryInfo.getQueryIdStr());
   }
+
+  @Test
+  public void testGetQueryInfoWithDefault() throws Exception {
+    String sessionId = generateNewSessionAndGetId();
+    SubmitQueryRequest queryRequest = createNewQueryRequest("select * from lineitem");
+
+    Response response = restClient.target(queriesURI)
+      .request().header(tajoSessionIdHeaderName, sessionId)
+      .post(Entity.entity(queryRequest, MediaType.APPLICATION_JSON));
+
+    assertNotNull(response);
+    assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
+    String locationHeader = response.getHeaderString("Location");
+    assertTrue(locationHeader != null && !locationHeader.isEmpty());
+
+    String queryId = locationHeader.lastIndexOf('/') >= 0?
+      locationHeader.substring(locationHeader.lastIndexOf('/')+1):null;
+
+    assertTrue(queryId != null && !queryId.isEmpty());
+
+    QueryInfo queryInfo = restClient.target(queriesURI)
+      .path("/{queryId}")
+      .resolveTemplate("queryId", queryId)
+      .request().get(new GenericType<QueryInfo>(QueryInfo.class));
+
+    assertNotNull(queryInfo);
+    assertEquals(queryId, queryInfo.getQueryIdStr());
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/f124b87e/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java b/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
index 1b23966..d83eb60 100644
--- a/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
+++ b/tajo-core/src/test/java/org/apache/tajo/ws/rs/resources/TestQueryResultResource.java
@@ -18,25 +18,7 @@
 
 package org.apache.tajo.ws.rs.resources;
 
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
-import java.io.EOFException;
-import java.io.InputStream;
-import java.net.URI;
-import java.security.MessageDigest;
-import java.util.List;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
 import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.compress.compressors.CompressorInputStream;
-import org.apache.commons.compress.compressors.CompressorStreamFactory;
 import org.apache.tajo.QueryTestCaseBase;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.conf.TajoConf.ConfVars;
@@ -55,6 +37,21 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.EOFException;
+import java.io.InputStream;
+import java.net.URI;
+import java.security.MessageDigest;
+import java.util.List;
+
 import static org.junit.Assert.*;
 
 public class TestQueryResultResource extends QueryTestCaseBase {
@@ -63,14 +60,14 @@ public class TestQueryResultResource extends QueryTestCaseBase {
   private URI sessionsURI;
   private URI queriesURI;
   private Client restClient;
-  
+
   private static final String tajoSessionIdHeaderName = "X-Tajo-Session";
   private static final String tajoDigestHeaderName = "X-Tajo-Digest";
-  
+
   public TestQueryResultResource() {
     super(TajoConstants.DEFAULT_DATABASE_NAME);
   }
-  
+
   @Before
   public void setUp() throws Exception {
     int restPort = testBase.getTestingCluster().getConfiguration().getIntVar(ConfVars.REST_SERVICE_PORT);
@@ -84,45 +81,45 @@ public class TestQueryResultResource extends QueryTestCaseBase {
         .property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, true)
         .build();
   }
-  
+
   @After
   public void tearDown() throws Exception {
     restClient.close();
   }
-  
+
   private String generateNewSessionAndGetId() throws Exception {
     NewSessionRequest request = new NewSessionRequest();
     request.setUserName("tajo-user");
     request.setDatabaseName(TajoConstants.DEFAULT_DATABASE_NAME);
-    
+
     NewSessionResponse response = restClient.target(sessionsURI)
         .request().post(Entity.entity(request, MediaType.APPLICATION_JSON), NewSessionResponse.class);
-    
+
     assertNotNull(response);
     assertTrue(ResultCode.OK.equals(response.getResultCode()));
     assertTrue(response.getId() != null && !response.getId().isEmpty());
-    
+
     return response.getId();
   }
-  
+
   private URI sendNewQueryResquest(String sessionId, String query) throws Exception {
-    
+
     SubmitQueryRequest request = new SubmitQueryRequest();
     request.setQuery(query);
-    
+
     Response response = restClient.target(queriesURI)
         .request().header(tajoSessionIdHeaderName, sessionId)
         .post(Entity.entity(request, MediaType.APPLICATION_JSON));
-    
+
     assertNotNull(response);
     assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
     String locationHeader = response.getHeaderString("Location");
     assertTrue(locationHeader != null && !locationHeader.isEmpty());
-    
+
     URI queryIdURI = new URI(locationHeader);
 
     assertNotNull(queryIdURI);
-    
+
     return queryIdURI;
   }
 
@@ -284,4 +281,65 @@ public class TestQueryResultResource extends QueryTestCaseBase {
       assertTrue(aTuple.getInt4(response.getSchema().getColumnId("l_orderkey")) > 0);
     }
   }
+
+  @Test
+  public void testGetQueryResultSetWithDefaultCount() throws Exception {
+    String sessionId = generateNewSessionAndGetId();
+    URI queryIdURI = sendNewQueryResquest(sessionId, "select * from lineitem");
+    URI queryResultURI = new URI(queryIdURI + "/result");
+
+    GetQueryResultDataResponse response = restClient.target(queryResultURI)
+        .request().header(tajoSessionIdHeaderName, sessionId)
+        .get(new GenericType<GetQueryResultDataResponse>(GetQueryResultDataResponse.class));
+
+    assertNotNull(response);
+    assertNotNull(response.getResultCode());
+    assertEquals(ResultCode.OK, response.getResultCode());
+    assertNotNull(response.getSchema());
+    assertEquals(16, response.getSchema().getRootColumns().size());
+    assertNotNull(response.getResultset());
+    assertTrue(response.getResultset().getId() != 0);
+    assertNotNull(response.getResultset().getLink());
+
+    URI queryResultSetURI = response.getResultset().getLink();
+
+    Response queryResultSetResponse = restClient.target(queryResultSetURI)
+        .request().header(tajoSessionIdHeaderName, sessionId)
+        .get();
+
+    assertNotNull(queryResultSetResponse);
+    String tajoDigest = queryResultSetResponse.getHeaderString(tajoDigestHeaderName);
+    assertTrue(tajoDigest != null && !tajoDigest.isEmpty());
+
+    DataInputStream queryResultSetInputStream =
+        new DataInputStream(new BufferedInputStream(queryResultSetResponse.readEntity(InputStream.class)));
+
+    assertNotNull(queryResultSetInputStream);
+
+    boolean isFinished = false;
+    List<Tuple> tupleList = TUtil.newList();
+    RowStoreUtil.RowStoreDecoder decoder = RowStoreUtil.createDecoder(response.getSchema());
+    MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
+    while (!isFinished) {
+      try {
+        int length = queryResultSetInputStream.readInt();
+        byte[] dataByteArray = new byte[length];
+        int readBytes = queryResultSetInputStream.read(dataByteArray);
+
+        assertEquals(length, readBytes);
+
+        tupleList.add(decoder.toTuple(dataByteArray));
+        messageDigest.update(dataByteArray);
+      } catch (EOFException eof) {
+        isFinished = true;
+      }
+    }
+
+    assertEquals(5, tupleList.size());
+    assertEquals(tajoDigest, Base64.encodeBase64String(messageDigest.digest()));
+
+    for (Tuple aTuple: tupleList) {
+      assertTrue(aTuple.getInt4(response.getSchema().getColumnId("l_orderkey")) > 0);
+    }
+  }
 }