[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 <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
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 @@
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 @@
* 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
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();
+}
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.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 @@
}
/**
- * 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
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 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.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 @@
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);
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.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 @@
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 @@
? 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 @@
}
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 {
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.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.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 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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();
}
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 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.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 @@
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);
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.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.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 @@
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();
}
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 @@
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 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.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 @@
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 @@
this.delivery = delivery;
this.clientContextID = clientContextID;
this.handleUrl = handleUrl;
+ this.optionalParameters = optionalParameters;
}
@Override
@@ -114,8 +119,10 @@
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);
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.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 @@
}
@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 @@
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 @@
// 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");
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;
+ }
+}
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 @@
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:
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>
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>
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.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 @@
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
*