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