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/06/29 08:46:51 UTC
[4/5] tajo git commit: TAJO-1638: Remove offset parameter from rest
api result/{cacheId}.
TAJO-1638: Remove offset parameter from rest api result/{cacheId}.
Closes #599
Signed-off-by: JaeHwa Jung <bl...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/773c3eb9
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/773c3eb9
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/773c3eb9
Branch: refs/heads/index_support
Commit: 773c3eb94ad3c3a6bc3b8db7692a9a38a5f3e8af
Parents: 8f3215d
Author: DaeMyung Kang <ch...@naver.com>
Authored: Mon Jun 29 11:12:17 2015 +0900
Committer: JaeHwa Jung <bl...@apache.org>
Committed: Mon Jun 29 11:12:17 2015 +0900
----------------------------------------------------------------------
CHANGES | 3 +
.../ws/rs/resources/QueryResultResource.java | 35 +++-------
.../rs/resources/TestQueryResultResource.java | 73 +++-----------------
3 files changed, 23 insertions(+), 88 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/773c3eb9/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 04c4392..90ef54a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -29,6 +29,9 @@ Release 0.11.0 - unreleased
IMPROVEMENT
+ TAJO-1638: Remove offset parameter from rest api result/{cacheId}.
+ (Contributed by DaeMyung Kang, Committed by jaehwa)
+
TAJO-1659: Simplify scan iteration in SeqScan. (hyunsik)
TAJO-751: JDBC driver should support cancel() method.
http://git-wip-us.apache.org/repos/asf/tajo/blob/773c3eb9/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 3384c90..2f52198 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
@@ -69,6 +69,9 @@ public class QueryResultResource {
private static final String countKeyName = "count";
private static final String tajoDigestHeaderName = "X-Tajo-Digest";
+ private static final String tajoOffsetHeaderName = "X-Tajo-Offset";
+ private static final String tajoCountHeaderName = "X-Tajo-Count";
+ private static final String tajoEOSHeaderName = "X-Tajo-EOS";
public UriInfo getUriInfo() {
return uriInfo;
@@ -242,7 +245,6 @@ public class QueryResultResource {
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getQueryResultSet(@HeaderParam(QueryResource.tajoSessionIdHeaderName) String sessionId,
@PathParam("cacheId") String cacheId,
- @DefaultValue("-1") @QueryParam("offset") int offset,
@DefaultValue("100") @QueryParam("count") int count) {
if (LOG.isDebugEnabled()) {
LOG.debug("Client sent a get query result set request.");
@@ -257,9 +259,6 @@ public class QueryResultResource {
JerseyResourceDelegateContextKey<Long> cacheIdKey =
JerseyResourceDelegateContextKey.valueOf(cacheIdKeyName, Long.class);
context.put(cacheIdKey, Long.valueOf(cacheId));
- JerseyResourceDelegateContextKey<Integer> offsetKey =
- JerseyResourceDelegateContextKey.valueOf(offsetKeyName, Integer.class);
- context.put(offsetKey, offset);
JerseyResourceDelegateContextKey<Integer> countKey =
JerseyResourceDelegateContextKey.valueOf(countKeyName, Integer.class);
context.put(countKey, count);
@@ -294,9 +293,6 @@ public class QueryResultResource {
JerseyResourceDelegateContextKey<ClientApplication> clientApplicationKey =
JerseyResourceDelegateContextKey.valueOf(JerseyResourceDelegateUtil.ClientApplicationKey, ClientApplication.class);
ClientApplication clientApplication = context.get(clientApplicationKey);
- JerseyResourceDelegateContextKey<Integer> offsetKey =
- JerseyResourceDelegateContextKey.valueOf(offsetKeyName, Integer.class);
- int offset = context.get(offsetKey);
JerseyResourceDelegateContextKey<Integer> countKey =
JerseyResourceDelegateContextKey.valueOf(countKeyName, Integer.class);
int count = context.get(countKey);
@@ -329,14 +325,17 @@ public class QueryResultResource {
clientApplication.getCachedNonForwardResultScanner(queryIdObj, cacheId.longValue());
try {
- skipOffsetRow(cachedQueryResultScanner, offset);
-
+ int start_offset = cachedQueryResultScanner.getCurrentRowNumber();
List<ByteString> output = cachedQueryResultScanner.getNextRows(count);
String digestString = getEncodedBase64DigestString(output);
+ boolean eos = count != output.size();
return Response.ok(new QueryResultStreamingOutput(output))
- .header(tajoDigestHeaderName, digestString)
- .build();
+ .header(tajoDigestHeaderName, digestString)
+ .header(tajoOffsetHeaderName, start_offset)
+ .header(tajoCountHeaderName, output.size())
+ .header(tajoEOSHeaderName, eos)
+ .build();
} catch (IOException e) {
LOG.error(e.getMessage(), e);
@@ -348,20 +347,6 @@ public class QueryResultResource {
}
}
- private void skipOffsetRow(NonForwardQueryResultScanner queryResultScanner, int offset) throws IOException {
- if (offset <= 0) {
- return;
- }
-
- int currentRow = queryResultScanner.getCurrentRowNumber();
-
- if (offset < (currentRow+1)) {
- throw new RuntimeException("Offset must be over the current row number");
- }
-
- queryResultScanner.getNextRows(offset - currentRow - 1);
- }
-
private String getEncodedBase64DigestString(List<ByteString> outputList) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
http://git-wip-us.apache.org/repos/asf/tajo/blob/773c3eb9/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 d4f1785..fec1626 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
@@ -63,6 +63,9 @@ public class TestQueryResultResource extends QueryTestCaseBase {
private static final String tajoSessionIdHeaderName = "X-Tajo-Session";
private static final String tajoDigestHeaderName = "X-Tajo-Digest";
+ private static final String tajoOffsetHeaderName = "X-Tajo-Offset";
+ private static final String tajoCountHeaderName = "X-Tajo-Count";
+ private static final String tajoEOSHeaderName = "X-Tajo-EOS";
public TestQueryResultResource() {
super(TajoConstants.DEFAULT_DATABASE_NAME);
@@ -220,69 +223,6 @@ public class TestQueryResultResource extends QueryTestCaseBase {
}
@Test
- public void testGetQueryResultSetWithOffset() 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)
- .queryParam("count", 100)
- .queryParam("offset", 3)
- .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(3, tupleList.size());
- assertEquals(tajoDigest, Base64.encodeBase64String(messageDigest.digest()));
-
- for (Tuple aTuple: tupleList) {
- 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");
@@ -309,7 +249,14 @@ public class TestQueryResultResource extends QueryTestCaseBase {
assertNotNull(queryResultSetResponse);
String tajoDigest = queryResultSetResponse.getHeaderString(tajoDigestHeaderName);
+ int offset = Integer.valueOf(queryResultSetResponse.getHeaderString(tajoOffsetHeaderName));
+ int count = Integer.valueOf(queryResultSetResponse.getHeaderString(tajoCountHeaderName));
+ boolean eos = Boolean.valueOf(queryResultSetResponse.getHeaderString(tajoEOSHeaderName));
+
assertTrue(tajoDigest != null && !tajoDigest.isEmpty());
+ assertTrue(eos);
+ assertEquals(0, offset);
+ assertEquals(5, count);
DataInputStream queryResultSetInputStream =
new DataInputStream(new BufferedInputStream(queryResultSetResponse.readEntity(InputStream.class)));