You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by bl...@apache.org on 2015/06/29 04:14:00 UTC

tajo git commit: TAJO-1638: Remove offset parameter from rest api result/{cacheId}.

Repository: tajo
Updated Branches:
  refs/heads/master 8f3215d12 -> 773c3eb94


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/master
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)));