From cd84bbe57a04a5a52e49768a232d104d42d79c56 Mon Sep 17 00:00:00 2001 From: "clark.kang" Date: Thu, 28 May 2015 10:54:07 +0900 Subject: [PATCH] TAJO-1627 --- .../tajo/ws/rs/resources/QueryResource.java | 23 +++++++- .../GetDirectQueryResultResponse.java | 55 +++++++++++++++++++ .../ws/rs/resources/TestQueryResource.java | 35 ++++++++++++ 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 tajo-core/src/main/java/org/apache/tajo/ws/rs/responses/GetDirectQueryResultResponse.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 8f45c7b59f..000b8e96e7 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,10 +18,14 @@ package org.apache.tajo.ws.rs.resources; +import com.google.common.collect.Lists; +import com.google.protobuf.ByteString; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.tajo.QueryId; import org.apache.tajo.TajoProtos; +import org.apache.tajo.catalog.Schema; import org.apache.tajo.ipc.ClientProtos; import org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse; import org.apache.tajo.master.QueryInProgress; @@ -34,6 +38,7 @@ import org.apache.tajo.util.TajoIdUtils; import org.apache.tajo.ws.rs.*; import org.apache.tajo.ws.rs.requests.SubmitQueryRequest; +import org.apache.tajo.ws.rs.responses.GetDirectQueryResultResponse; import javax.ws.rs.*; import javax.ws.rs.core.*; @@ -288,7 +293,23 @@ public Response run(JerseyResourceDelegateContext context) { .path(QueryResource.class) .path(QueryResource.class, "getQuery") .build(databaseName, new QueryId(response.getQueryId()).toString()); - return Response.created(queryURI).build(); + + if (response.hasResultSet() == false) { + return Response.created(queryURI).build(); + } else { + GetDirectQueryResultResponse directResponse = new GetDirectQueryResultResponse(); + Schema schema = new Schema(response.getResultSet().getSchema()); + directResponse.setSchema(schema); + directResponse.setResultCode(response.getResultCode()); + + List tuples = Lists.newArrayListWithCapacity(response.getSerializedSize()); + for (ByteString tuple: response.getResultSet().getSerializedTuplesList()) { + tuples.add(Base64.encodeBase64String(tuple.toByteArray())); + } + + directResponse.setSerializedTupes(tuples); + return Response.status(Status.OK).entity(directResponse).build(); + } } } } diff --git a/tajo-core/src/main/java/org/apache/tajo/ws/rs/responses/GetDirectQueryResultResponse.java b/tajo-core/src/main/java/org/apache/tajo/ws/rs/responses/GetDirectQueryResultResponse.java new file mode 100644 index 0000000000..110c93911b --- /dev/null +++ b/tajo-core/src/main/java/org/apache/tajo/ws/rs/responses/GetDirectQueryResultResponse.java @@ -0,0 +1,55 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.responses; + +import com.google.gson.annotations.Expose; +import org.apache.tajo.catalog.Schema; +import org.apache.tajo.ipc.ClientProtos; + +import java.util.List; + +public class GetDirectQueryResultResponse { + @Expose private ClientProtos.ResultCode resultCode; + @Expose private Schema schema; + @Expose private List serializedTupes; + + public ClientProtos.ResultCode getResultCode() { + return resultCode; + } + + public void setResultCode(ClientProtos.ResultCode resultCode) { + this.resultCode = resultCode; + } + + public Schema getSchema() { + return schema; + } + + public void setSchema(Schema schema) { + this.schema = schema; + } + + public List getSerializedTupes() { + return serializedTupes; + } + + public void setSerializedTupes(List serializedTupes) { + this.serializedTupes = serializedTupes; + } +} 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 77c0117864..d688dfe96f 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 @@ -19,14 +19,19 @@ package org.apache.tajo.ws.rs.resources; import com.google.gson.internal.StringMap; +import com.google.protobuf.ByteString; +import org.apache.commons.codec.binary.Base64; import org.apache.tajo.QueryTestCaseBase; import org.apache.tajo.TajoConstants; import org.apache.tajo.conf.TajoConf.ConfVars; import org.apache.tajo.ipc.ClientProtos.ResultCode; import org.apache.tajo.master.QueryInfo; +import org.apache.tajo.storage.RowStoreUtil; +import org.apache.tajo.storage.Tuple; import org.apache.tajo.ws.rs.netty.gson.GsonFeature; import org.apache.tajo.ws.rs.requests.NewSessionRequest; import org.apache.tajo.ws.rs.requests.SubmitQueryRequest; +import org.apache.tajo.ws.rs.responses.GetDirectQueryResultResponse; import org.apache.tajo.ws.rs.responses.NewSessionResponse; import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.filter.LoggingFilter; @@ -193,4 +198,34 @@ public void testGetQueryInfoWithDefault() throws Exception { assertNotNull(queryInfo); assertEquals(queryId, queryInfo.getQueryIdStr()); } + + @Test + public void testGetDirectQueryResult() throws Exception { + String sessionId = generateNewSessionAndGetId(); + SubmitQueryRequest queryRequest = createNewQueryRequest("select 6"); + + GetDirectQueryResultResponse response = restClient.target(queriesURI) + .request().header(tajoSessionIdHeaderName, sessionId) + .post(Entity.entity(queryRequest, MediaType.APPLICATION_JSON), + new GenericType(GetDirectQueryResultResponse.class)); + + assertNotNull(response); + assertNotNull(response.getResultCode()); + assertEquals(ResultCode.OK, response.getResultCode()); + assertNotNull(response.getSchema()); + assertEquals(1, response.getSchema().getRootColumns().size()); + assertNotNull(response.getSerializedTupes()); + + List serializedTupes = response.getSerializedTupes(); + assertEquals(1, serializedTupes.size()); + + RowStoreUtil.RowStoreDecoder decoder = RowStoreUtil.createDecoder(response.getSchema()); + + for (String strTuple: serializedTupes) { + byte [] array = Base64.decodeBase64(strTuple); + ByteString bStr = ByteString.copyFrom(array); + Tuple tuple = decoder.toTuple(bStr.toByteArray()); + assertEquals(6, tuple.getInt4(0)); + } + } }