Repository: asterixdb Updated Branches: refs/heads/master ef4b8c992 -> e25df7d7a
[ASTERIXDB-1973][OTR] Add Optional Parameters in Query Compilation - user model changes: no - storage format changes: no - interface changes: Introduce IRequestParameters to encapsulate request parameters and use it in IStatementExecutor#compileAndExecute and IExtensionStatement#handle. Details: - Introduce IRequestParameters and its default implementation. - Add optional parameters supplier in QueryServiceServlet. Change-Id: Ie918f4d3f8dae41d07536041c591c59946a077f4 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1867 Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Till Westmann <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/e25df7d7 Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/e25df7d7 Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/e25df7d7 Branch: refs/heads/master Commit: e25df7d7acc0888ee2d946b878ea1a5af21147c0 Parents: ef4b8c9 Author: Murtadha Hubail <[email protected]> Authored: Tue Sep 19 11:17:38 2017 -0700 Committer: Murtadha Hubail <[email protected]> Committed: Tue Sep 19 21:25:14 2017 -0700 ---------------------------------------------------------------------- .../algebra/extension/IExtensionStatement.java | 23 +++--- .../asterix/translator/IRequestParameters.java | 57 ++++++++++++++ .../asterix/translator/IStatementExecutor.java | 39 +--------- .../asterix/api/http/server/ApiServlet.java | 8 +- .../api/http/server/NCQueryServiceServlet.java | 18 +++-- .../api/http/server/QueryServiceServlet.java | 29 ++++++-- .../asterix/api/http/server/RestApiServlet.java | 6 +- .../asterix/api/java/AsterixJavaClient.java | 9 ++- .../message/ExecuteStatementRequestMessage.java | 13 +++- .../asterix/app/translator/QueryTranslator.java | 21 +++--- .../app/translator/RequestParameters.java | 78 ++++++++++++++++++++ .../hyracks/bootstrap/CCApplication.java | 4 +- asterixdb/asterix-external-data/pom.xml | 1 + asterixdb/asterix-metadata/pom.xml | 1 + .../hyracks/http/server/utils/HttpUtil.java | 9 +++ 15 files changed, 233 insertions(+), 83 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/IExtensionStatement.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/IExtensionStatement.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/IExtensionStatement.java index b0f863b..48441a3 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/IExtensionStatement.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/IExtensionStatement.java @@ -20,12 +20,10 @@ package org.apache.asterix.algebra.extension; import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.metadata.declared.MetadataProvider; +import org.apache.asterix.translator.IRequestParameters; import org.apache.asterix.translator.IStatementExecutor; -import org.apache.asterix.translator.IStatementExecutor.ResultDelivery; -import org.apache.asterix.translator.IStatementExecutor.Stats; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.api.client.IHyracksClientConnection; -import org.apache.hyracks.api.dataset.IHyracksDataset; import org.apache.hyracks.api.exceptions.HyracksDataException; /** @@ -42,14 +40,15 @@ public interface IExtensionStatement extends Statement { * Called when the {@code IStatementExecutor} encounters an extension statement. * An implementation class should implement the actual processing of the statement in this method. * - * @param queryTranslator - * @param metadataProvider - * @param statementExecutor * @param hcc - * @param resultSetIdCounter - * @throws Exception + * @param statementExecutor + * @param requestParameters + * @param metadataProvider + * @param resultSetId + * @throws HyracksDataException + * @throws AlgebricksException */ - void handle(IStatementExecutor statementExecutor, MetadataProvider metadataProvider, - IHyracksClientConnection hcc, IHyracksDataset hdc, ResultDelivery resultDelivery, Stats stats, - int resultSetIdCounter) throws HyracksDataException, AlgebricksException; -} + void handle(IHyracksClientConnection hcc, IStatementExecutor statementExecutor, + IRequestParameters requestParameters, MetadataProvider metadataProvider, int resultSetId) + throws HyracksDataException, AlgebricksException; +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java new file mode 100644 index 0000000..8d0f20b --- /dev/null +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java @@ -0,0 +1,57 @@ +/* + * 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.asterix.translator; + +import java.util.Map; + +import org.apache.asterix.translator.IStatementExecutor.Stats; +import org.apache.hyracks.api.dataset.IHyracksDataset; + +public interface IRequestParameters { + + /** + * @return A Hyracks dataset client object that is used to read the results. + */ + IHyracksDataset getHyracksDataset(); + + /** + * @return The {@code ResultDelivery} kind required for queries in the list of statements + */ + IStatementExecutor.ResultDelivery getResultDelivery(); + + /** + * @return a reference to write the stats of executed queries + */ + Stats getStats(); + + /** + * @return a reference to write the metadata of executed queries + */ + IStatementExecutor.ResultMetadata getOutMetadata(); + + /** + * @return the client context id for the query + */ + String getClientContextId(); + + /** + * @return Optional request parameters. Otherwise null. + */ + Map<String, String> getOptionalParameters(); +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java index 19f0dcc..57c4809 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IStatementExecutor.java @@ -33,7 +33,6 @@ import org.apache.commons.lang3.tuple.Triple; import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; import org.apache.hyracks.api.client.IClusterInfoCollector; import org.apache.hyracks.api.client.IHyracksClientConnection; -import org.apache.hyracks.api.dataset.IHyracksDataset; import org.apache.hyracks.api.dataset.ResultSetId; import org.apache.hyracks.api.job.JobId; import org.apache.hyracks.api.job.JobSpecification; @@ -94,45 +93,15 @@ public interface IStatementExecutor { } /** - * Compiles and execute a list of statements, without passing in client context id and context. + * Compiles and executes a list of statements * * @param hcc - * A Hyracks client connection that is used to submit a jobspec to Hyracks. - * @param hdc - * A Hyracks dataset client object that is used to read the results. - * @param resultDelivery - * The {@code ResultDelivery} kind required for queries in the list of statements - * @param outMetadata - * a reference to write the metadata of executed queries - * @param stats - * a reference to write the stats of executed queries - * @throws Exception - */ - void compileAndExecute(IHyracksClientConnection hcc, IHyracksDataset hdc, ResultDelivery resultDelivery, - ResultMetadata outMetadata, Stats stats) throws Exception; - - /** - * Compiles and execute a list of statements, with passing in client context id and context. - * - * @param hcc - * A Hyracks client connection that is used to submit a jobspec to Hyracks. - * @param hdc - * A Hyracks dataset client object that is used to read the results. - * @param resultDelivery - * The {@code ResultDelivery} kind required for queries in the list of statements - * @param outMetadata - * a reference to write the metadata of executed queries - * @param stats - * a reference to write the stats of executed queries - * @param clientContextId - * the client context id for the query * @param ctx - * the context that contains the meta information for all queries + * @param requestParameters * @throws Exception */ - void compileAndExecute(IHyracksClientConnection hcc, IHyracksDataset hdc, ResultDelivery resultDelivery, - ResultMetadata outMetadata, Stats stats, String clientContextId, IStatementExecutorContext ctx) - throws Exception; + void compileAndExecute(IHyracksClientConnection hcc, IStatementExecutorContext ctx, + IRequestParameters requestParameters) throws Exception; /** * rewrites and compiles query into a hyracks job specifications http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java index ba09d6c..fbe5852 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java @@ -36,6 +36,7 @@ import java.util.logging.Logger; import javax.imageio.ImageIO; import org.apache.asterix.app.result.ResultReader; +import org.apache.asterix.app.translator.RequestParameters; import org.apache.asterix.common.config.GlobalConfig; import org.apache.asterix.common.context.IStorageComponentProvider; import org.apache.asterix.common.dataflow.ICcApplicationContext; @@ -46,6 +47,7 @@ import org.apache.asterix.lang.common.base.IParser; import org.apache.asterix.lang.common.base.IParserFactory; import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.metadata.MetadataManager; +import org.apache.asterix.translator.IRequestParameters; import org.apache.asterix.translator.IStatementExecutor; import org.apache.asterix.translator.IStatementExecutorFactory; import org.apache.asterix.translator.SessionConfig; @@ -154,8 +156,10 @@ public class ApiServlet extends AbstractServlet { compilationProvider, componentProvider); double duration; long startTime = System.currentTimeMillis(); - translator.compileAndExecute(hcc, hds, IStatementExecutor.ResultDelivery.IMMEDIATE, - null, new IStatementExecutor.Stats()); + final IRequestParameters requestParameters = + new RequestParameters(hds, IStatementExecutor.ResultDelivery.IMMEDIATE, + new IStatementExecutor.Stats(), null, null, null); + translator.compileAndExecute(hcc, null, requestParameters); long endTime = System.currentTimeMillis(); duration = (endTime - startTime) / 1000.00; out.println(HTML_STATEMENT_SEPARATOR); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java index 8d355ef..ebc2db5 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java @@ -19,9 +19,11 @@ package org.apache.asterix.api.http.server; +import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeoutException; +import java.util.function.Function; import java.util.logging.Level; import org.apache.asterix.algebra.base.ILangExtension; @@ -43,6 +45,7 @@ import org.apache.commons.lang3.tuple.Triple; import org.apache.hyracks.api.application.INCServiceContext; import org.apache.hyracks.api.dataset.ResultSetId; import org.apache.hyracks.api.job.JobId; +import org.apache.hyracks.http.api.IServletRequest; import org.apache.hyracks.ipc.exceptions.IPCException; import io.netty.handler.codec.http.HttpResponseStatus; @@ -54,14 +57,15 @@ import io.netty.handler.codec.http.HttpResponseStatus; public class NCQueryServiceServlet extends QueryServiceServlet { public NCQueryServiceServlet(ConcurrentMap<String, Object> ctx, String[] paths, IApplicationContext appCtx, - ILangExtension.Language queryLanguage) { - super(ctx, paths, appCtx, queryLanguage, null, null, null); + ILangExtension.Language queryLanguage, + Function<IServletRequest, Map<String, String>> optionalParamProvider) { + super(ctx, paths, appCtx, queryLanguage, null, null, null, optionalParamProvider); } @Override - protected void executeStatement(String statementsText, SessionOutput sessionOutput, - IStatementExecutor.ResultDelivery delivery, IStatementExecutor.Stats stats, RequestParameters param, - String handleUrl, long[] outExecStartEnd) throws Exception { + protected void executeStatement(String statementsText, + SessionOutput sessionOutput, IStatementExecutor.ResultDelivery delivery, IStatementExecutor.Stats stats, + RequestParameters param, long[] outExecStartEnd, Map<String, String> optionalParameters) throws Exception { // Running on NC -> send 'execute' message to CC INCServiceContext ncCtx = (INCServiceContext) serviceCtx; INCMessageBroker ncMb = (INCMessageBroker) ncCtx.getMessageBroker(); @@ -69,6 +73,7 @@ public class NCQueryServiceServlet extends QueryServiceServlet { ? IStatementExecutor.ResultDelivery.DEFERRED : delivery; ExecuteStatementResponseMessage responseMsg; MessageFuture responseFuture = ncMb.registerMessageFuture(); + final String handleUrl = getHandleUrl(param.host, param.path, delivery); try { if (param.clientContextID == null) { param.clientContextID = UUID.randomUUID().toString(); @@ -80,7 +85,8 @@ public class NCQueryServiceServlet extends QueryServiceServlet { } ExecuteStatementRequestMessage requestMsg = new ExecuteStatementRequestMessage(ncCtx.getNodeId(), responseFuture.getFutureId(), queryLanguage, - statementsText, sessionOutput.config(), ccDelivery, param.clientContextID, handleUrl); + statementsText, sessionOutput.config(), ccDelivery, param.clientContextID, handleUrl, + optionalParameters); outExecStartEnd[0] = System.nanoTime(); ncMb.sendMessageToCC(requestMsg); try { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java index a35d191..ad34d96 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java @@ -22,7 +22,9 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentMap; +import java.util.function.Function; import java.util.logging.Level; import java.util.logging.Logger; @@ -39,6 +41,7 @@ import org.apache.asterix.lang.aql.parser.TokenMgrError; import org.apache.asterix.lang.common.base.IParser; import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.metadata.MetadataManager; +import org.apache.asterix.translator.IRequestParameters; import org.apache.asterix.translator.IStatementExecutor; import org.apache.asterix.translator.IStatementExecutor.ResultDelivery; import org.apache.asterix.translator.IStatementExecutor.Stats; @@ -72,10 +75,12 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { private final IStorageComponentProvider componentProvider; private final IStatementExecutorContext queryCtx; protected final IServiceContext serviceCtx; + protected final Function<IServletRequest, Map<String, String>> optionalParamProvider; public QueryServiceServlet(ConcurrentMap<String, Object> ctx, String[] paths, IApplicationContext appCtx, ILangExtension.Language queryLanguage, ILangCompilationProvider compilationProvider, - IStatementExecutorFactory statementExecutorFactory, IStorageComponentProvider componentProvider) { + IStatementExecutorFactory statementExecutorFactory, IStorageComponentProvider componentProvider, + Function<IServletRequest, Map<String, String>> optionalParamProvider) { super(appCtx, ctx, paths); this.queryLanguage = queryLanguage; this.compilationProvider = compilationProvider; @@ -83,12 +88,13 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { this.componentProvider = componentProvider; this.queryCtx = (IStatementExecutorContext) ctx.get(ServletConstants.RUNNING_QUERIES_ATTR); this.serviceCtx = (IServiceContext) ctx.get(ServletConstants.SERVICE_CONTEXT_ATTR); + this.optionalParamProvider = optionalParamProvider; } @Override protected void post(IServletRequest request, IServletResponse response) { try { - handleRequest(getRequestParameters(request), response); + handleRequest(request, response); } catch (IOException e) { // Servlet methods should not throw exceptions // http://cwe.mitre.org/data/definitions/600.html @@ -365,7 +371,8 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { return "http://" + host + path + handlePath(delivery); } - private void handleRequest(RequestParameters param, IServletResponse response) throws IOException { + private void handleRequest(IServletRequest request, IServletResponse response) throws IOException { + RequestParameters param = getRequestParameters(request); LOGGER.info(param.toString()); long elapsedStart = System.nanoTime(); final StringWriter stringWriter = new StringWriter(); @@ -393,7 +400,11 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { throw new AsterixException("Empty request, no statement provided"); } String statementsText = param.statement + ";"; - executeStatement(statementsText, sessionOutput, delivery, stats, param, handleUrl, execStartEnd); + Map<String, String> optionalParams = null; + if (optionalParamProvider != null) { + optionalParams = optionalParamProvider.apply(request); + } + executeStatement(statementsText, sessionOutput, delivery, stats, param, execStartEnd, optionalParams); if (ResultDelivery.IMMEDIATE == delivery || ResultDelivery.DEFERRED == delivery) { ResultUtil.printStatus(sessionOutput, ResultStatus.SUCCESS); } @@ -425,8 +436,8 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { } protected void executeStatement(String statementsText, SessionOutput sessionOutput, ResultDelivery delivery, - IStatementExecutor.Stats stats, RequestParameters param, String handleUrl, long[] outExecStartEnd) - throws Exception { + IStatementExecutor.Stats stats, RequestParameters param, long[] outExecStartEnd, + Map<String, String> optionalParameters) throws Exception { IClusterManagementWork.ClusterState clusterState = ((ICcApplicationContext) appCtx).getClusterStateManager().getState(); if (clusterState != IClusterManagementWork.ClusterState.ACTIVE) { @@ -439,8 +450,10 @@ public class QueryServiceServlet extends AbstractQueryApiServlet { IStatementExecutor translator = statementExecutorFactory.create((ICcApplicationContext) appCtx, statements, sessionOutput, compilationProvider, componentProvider); outExecStartEnd[0] = System.nanoTime(); - translator.compileAndExecute(getHyracksClientConnection(), getHyracksDataset(), delivery, null, stats, - param.clientContextID, queryCtx); + final IRequestParameters requestParameters = + new org.apache.asterix.app.translator.RequestParameters(getHyracksDataset(), delivery, stats, null, + param.clientContextID, optionalParameters); + translator.compileAndExecute(getHyracksClientConnection(), queryCtx, requestParameters); outExecStartEnd[1] = System.nanoTime(); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java index 1a7918c..ae5479d 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java @@ -29,6 +29,7 @@ import java.util.logging.Logger; import org.apache.asterix.app.result.ResultReader; import org.apache.asterix.app.translator.QueryTranslator; +import org.apache.asterix.app.translator.RequestParameters; import org.apache.asterix.common.config.GlobalConfig; import org.apache.asterix.common.context.IStorageComponentProvider; import org.apache.asterix.common.dataflow.ICcApplicationContext; @@ -39,6 +40,7 @@ import org.apache.asterix.lang.common.base.IParser; import org.apache.asterix.lang.common.base.IParserFactory; import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.metadata.MetadataManager; +import org.apache.asterix.translator.IRequestParameters; import org.apache.asterix.translator.IStatementExecutor; import org.apache.asterix.translator.IStatementExecutor.ResultDelivery; import org.apache.asterix.translator.IStatementExecutorFactory; @@ -203,7 +205,9 @@ public abstract class RestApiServlet extends AbstractServlet { MetadataManager.INSTANCE.init(); IStatementExecutor translator = statementExecutorFactory.create(appCtx, aqlStatements, sessionOutput, compilationProvider, componentProvider); - translator.compileAndExecute(hcc, hds, resultDelivery, null, new IStatementExecutor.Stats()); + final IRequestParameters requestParameters = + new RequestParameters(hds, resultDelivery, new IStatementExecutor.Stats(), null, null, null); + translator.compileAndExecute(hcc, null, requestParameters); } catch (AsterixException | TokenMgrError | org.apache.asterix.aqlplus.parser.TokenMgrError pe) { response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, pe.getMessage(), pe); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java index a9d24b9..675bb9b 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java @@ -23,7 +23,7 @@ import java.io.Reader; import java.util.List; import org.apache.asterix.api.common.APIFramework; -import org.apache.asterix.app.translator.QueryTranslator; +import org.apache.asterix.app.translator.RequestParameters; import org.apache.asterix.common.context.IStorageComponentProvider; import org.apache.asterix.common.dataflow.ICcApplicationContext; import org.apache.asterix.common.utils.Job; @@ -32,6 +32,7 @@ import org.apache.asterix.lang.common.base.IParser; import org.apache.asterix.lang.common.base.IParserFactory; import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.metadata.MetadataManager; +import org.apache.asterix.translator.IRequestParameters; import org.apache.asterix.translator.IStatementExecutor; import org.apache.asterix.translator.IStatementExecutorFactory; import org.apache.asterix.translator.SessionConfig; @@ -109,8 +110,10 @@ public class AsterixJavaClient { IStatementExecutor translator = statementExecutorFactory.create(appCtx, statements, output, compilationProvider, storageComponentProvider); - translator.compileAndExecute(hcc, null, QueryTranslator.ResultDelivery.IMMEDIATE, - null, new IStatementExecutor.Stats()); + final IRequestParameters requestParameters = + new RequestParameters(null, IStatementExecutor.ResultDelivery.IMMEDIATE, new IStatementExecutor.Stats(), + null, null, null); + translator.compileAndExecute(hcc, null, requestParameters); writer.flush(); } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java index 62dcede..ce57a0c 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java @@ -22,6 +22,7 @@ package org.apache.asterix.app.message; import java.io.PrintWriter; import java.io.StringWriter; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -29,6 +30,7 @@ import java.util.logging.Logger; import org.apache.asterix.algebra.base.ILangExtension; import org.apache.asterix.api.http.server.ResultUtil; import org.apache.asterix.app.cc.CCExtensionManager; +import org.apache.asterix.app.translator.RequestParameters; import org.apache.asterix.common.api.IClusterManagementWork; import org.apache.asterix.common.cluster.IClusterStateManager; import org.apache.asterix.common.config.GlobalConfig; @@ -42,6 +44,7 @@ import org.apache.asterix.lang.common.base.IParser; import org.apache.asterix.lang.common.base.Statement; import org.apache.asterix.messaging.CCMessageBroker; import org.apache.asterix.metadata.MetadataManager; +import org.apache.asterix.translator.IRequestParameters; import org.apache.asterix.translator.IStatementExecutor; import org.apache.asterix.translator.IStatementExecutorContext; import org.apache.asterix.translator.IStatementExecutorFactory; @@ -68,10 +71,11 @@ public final class ExecuteStatementRequestMessage implements ICcAddressedMessage private final IStatementExecutor.ResultDelivery delivery; private final String clientContextID; private final String handleUrl; + private final Map<String, String> optionalParameters; public ExecuteStatementRequestMessage(String requestNodeId, long requestMessageId, ILangExtension.Language lang, String statementsText, SessionConfig sessionConfig, IStatementExecutor.ResultDelivery delivery, - String clientContextID, String handleUrl) { + String clientContextID, String handleUrl, Map<String, String> optionalParameters) { this.requestNodeId = requestNodeId; this.requestMessageId = requestMessageId; this.lang = lang; @@ -80,6 +84,7 @@ public final class ExecuteStatementRequestMessage implements ICcAddressedMessage this.delivery = delivery; this.clientContextID = clientContextID; this.handleUrl = handleUrl; + this.optionalParameters = optionalParameters; } @Override @@ -114,8 +119,10 @@ public final class ExecuteStatementRequestMessage implements ICcAddressedMessage MetadataManager.INSTANCE.init(); IStatementExecutor translator = statementExecutorFactory.create(ccAppCtx, statements, sessionOutput, compilationProvider, storageComponentProvider); - translator.compileAndExecute(ccAppCtx.getHcc(), null, delivery, outMetadata, new IStatementExecutor.Stats(), - clientContextID, statementExecutorContext); + final IRequestParameters requestParameters = + new RequestParameters(null, delivery, new IStatementExecutor.Stats(), outMetadata, clientContextID, + optionalParameters); + translator.compileAndExecute(ccApp.getHcc(), statementExecutorContext, requestParameters); outPrinter.close(); responseMsg.setResult(outWriter.toString()); responseMsg.setMetadata(outMetadata); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java index 365e4a3..29135d3 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java @@ -160,6 +160,7 @@ import org.apache.asterix.translator.CompiledStatements.CompiledInsertStatement; import org.apache.asterix.translator.CompiledStatements.CompiledLoadFromFileStatement; import org.apache.asterix.translator.CompiledStatements.CompiledUpsertStatement; import org.apache.asterix.translator.CompiledStatements.ICompiledDmlStatement; +import org.apache.asterix.translator.IRequestParameters; import org.apache.asterix.translator.IStatementExecutor; import org.apache.asterix.translator.IStatementExecutorContext; import org.apache.asterix.translator.NoOpStatementExecutorContext; @@ -249,15 +250,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen } @Override - public void compileAndExecute(IHyracksClientConnection hcc, IHyracksDataset hdc, ResultDelivery resultDelivery, - ResultMetadata outMetadata, Stats stats) throws Exception { - compileAndExecute(hcc, hdc, resultDelivery, outMetadata, stats, null, null); - } - - @Override - public void compileAndExecute(IHyracksClientConnection hcc, IHyracksDataset hdc, ResultDelivery resultDelivery, - ResultMetadata outMetadata, Stats stats, String clientContextId, IStatementExecutorContext ctx) - throws Exception { + public void compileAndExecute(IHyracksClientConnection hcc, IStatementExecutorContext ctx, + IRequestParameters requestParameters) throws Exception { int resultSetIdCounter = 0; FileSplit outputFile = null; IAWriterFactory writerFactory = PrinterBasedWriterFactory.INSTANCE; @@ -269,6 +263,11 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen String threadName = Thread.currentThread().getName(); Thread.currentThread().setName(QueryTranslator.class.getSimpleName()); Map<String, String> config = new HashMap<>(); + final IHyracksDataset hdc = requestParameters.getHyracksDataset(); + final ResultDelivery resultDelivery = requestParameters.getResultDelivery(); + final Stats stats = requestParameters.getStats(); + final ResultMetadata outMetadata = requestParameters.getOutMetadata(); + final String clientContextId = requestParameters.getClientContextId(); try { for (Statement stmt : statements) { if (sessionConfig.is(SessionConfig.FORMAT_HTML)) { @@ -389,8 +388,8 @@ public class QueryTranslator extends AbstractLangTranslator implements IStatemen // No op break; case Statement.Kind.EXTENSION: - ((IExtensionStatement) stmt).handle(this, metadataProvider, hcc, hdc, resultDelivery, stats, - resultSetIdCounter); + ((IExtensionStatement) stmt) + .handle(hcc, this, requestParameters, metadataProvider, resultSetIdCounter); break; default: throw new CompilationException("Unknown function"); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java new file mode 100644 index 0000000..5b8da8b --- /dev/null +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java @@ -0,0 +1,78 @@ +/* + * 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.asterix.app.translator; + +import java.util.Map; + +import org.apache.asterix.translator.IRequestParameters; +import org.apache.asterix.translator.IStatementExecutor; +import org.apache.asterix.translator.IStatementExecutor.ResultDelivery; +import org.apache.asterix.translator.IStatementExecutor.Stats; +import org.apache.hyracks.api.dataset.IHyracksDataset; + +public class RequestParameters implements IRequestParameters { + + private final IHyracksDataset hdc; + private final ResultDelivery resultDelivery; + private final Stats stats; + private final Map<String, String> optionalParameters; + private final IStatementExecutor.ResultMetadata outMetadata; + private final String clientContextId; + + public RequestParameters(IHyracksDataset hdc, ResultDelivery resultDelivery, Stats stats, + IStatementExecutor.ResultMetadata outMetadata, String clientContextId, + Map<String, String> optionalParameters) { + this.hdc = hdc; + this.resultDelivery = resultDelivery; + this.stats = stats; + this.outMetadata = outMetadata; + this.clientContextId = clientContextId; + this.optionalParameters = optionalParameters; + } + + @Override + public IHyracksDataset getHyracksDataset() { + return hdc; + } + + @Override + public IStatementExecutor.ResultDelivery getResultDelivery() { + return resultDelivery; + } + + @Override + public IStatementExecutor.Stats getStats() { + return stats; + } + + @Override + public Map<String, String> getOptionalParameters() { + return optionalParameters; + } + + @Override + public IStatementExecutor.ResultMetadata getOutMetadata() { + return outMetadata; + } + + @Override + public String getClientContextId() { + return clientContextId; + } +} http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java index ef3800c..3870065 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java @@ -298,10 +298,10 @@ public class CCApplication extends BaseCCApplication { case Servlets.QUERY_SERVICE: return new QueryServiceServlet(ctx, paths, appCtx, SQLPP, ccExtensionManager.getCompilationProvider(SQLPP), getStatementExecutorFactory(), - componentProvider); + componentProvider, null); case Servlets.QUERY_AQL: return new QueryServiceServlet(ctx, paths, appCtx, AQL, ccExtensionManager.getCompilationProvider(AQL), - getStatementExecutorFactory(), componentProvider); + getStatementExecutorFactory(), componentProvider, null); case Servlets.CONNECTOR: return new ConnectorApiServlet(ctx, paths, appCtx); case Servlets.REBALANCE: http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-external-data/pom.xml ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-external-data/pom.xml b/asterixdb/asterix-external-data/pom.xml index d1e1459..37f91ce 100644 --- a/asterixdb/asterix-external-data/pom.xml +++ b/asterixdb/asterix-external-data/pom.xml @@ -381,6 +381,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> + <scope>test</scope> </dependency> <dependency> <groupId>org.apache.hyracks</groupId> http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/asterixdb/asterix-metadata/pom.xml ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-metadata/pom.xml b/asterixdb/asterix-metadata/pom.xml index bcea637..9784c5e 100644 --- a/asterixdb/asterix-metadata/pom.xml +++ b/asterixdb/asterix-metadata/pom.xml @@ -128,6 +128,7 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> + <scope>test</scope> </dependency> <dependency> <groupId>org.apache.hyracks</groupId> http://git-wip-us.apache.org/repos/asf/asterixdb/blob/e25df7d7/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java index 8240bce..99e334c 100644 --- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java +++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java @@ -24,6 +24,7 @@ import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryType; import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; @@ -112,6 +113,14 @@ public class HttpUtil { response.setHeader(HttpHeaderNames.CONTENT_TYPE, type); } + public static Map<String, String> getRequestHeaders(IServletRequest request) { + Map<String, String> headers = new HashMap<>(); + request.getHttpRequest().headers().forEach(entry -> { + headers.put(entry.getKey(), entry.getValue()); + }); + return headers; + } + /** * Get the mime string representation from the extension *
