This is an automated email from the ASF dual-hosted git repository.
zhaojinchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new c07c4ca9fdd Support PreparedStatement for AdvancedFederationExecutor
(#20055)
c07c4ca9fdd is described below
commit c07c4ca9fdd756435a3317f911184469014d8c31
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Aug 10 17:30:03 2022 +0800
Support PreparedStatement for AdvancedFederationExecutor (#20055)
---
.../advanced/AdvancedExecuteDataContext.java | 6 +++++-
.../advanced/AdvancedFederationExecutor.java | 23 +++++++++++++++++-----
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedExecuteDataContext.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedExecuteDataContext.java
index f0e879f275a..731a12171b5 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedExecuteDataContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedExecuteDataContext.java
@@ -25,6 +25,8 @@ import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.sql.validate.SqlValidator;
import org.apache.calcite.sql2rel.SqlToRelConverter;
+import java.util.Map;
+
/**
* Advanced execute data context.
*/
@@ -35,6 +37,8 @@ public final class AdvancedExecuteDataContext implements
DataContext {
private final SqlToRelConverter converter;
+ private final Map<String, Object> parameters;
+
@Override
public SchemaPlus getRootSchema() {
return validator.getCatalogReader().getRootSchema().plus();
@@ -52,6 +56,6 @@ public final class AdvancedExecuteDataContext implements
DataContext {
@Override
public Object get(final String name) {
- return null;
+ return parameters.get(name);
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
index cdb671630a5..72b3cdcf206 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
@@ -34,7 +34,6 @@ import org.apache.calcite.sql2rel.SqlToRelConverter;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
@@ -43,21 +42,25 @@ import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecuti
import org.apache.shardingsphere.infra.federation.executor.FederationContext;
import org.apache.shardingsphere.infra.federation.executor.FederationExecutor;
import
org.apache.shardingsphere.infra.federation.executor.advanced.resultset.FederationResultSet;
-import
org.apache.shardingsphere.infra.federation.optimizer.metadata.filter.FilterableSchema;
import
org.apache.shardingsphere.infra.federation.executor.original.table.FilterableTableScanExecutor;
import
org.apache.shardingsphere.infra.federation.executor.original.table.FilterableTableScanExecutorContext;
import
org.apache.shardingsphere.infra.federation.optimizer.ShardingSphereOptimizer;
import
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
import
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
+import
org.apache.shardingsphere.infra.federation.optimizer.metadata.filter.FilterableSchema;
import
org.apache.shardingsphere.infra.federation.optimizer.planner.QueryOptimizePlannerFactory;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* Advanced federation executor.
@@ -99,11 +102,21 @@ public final class AdvancedFederationExecutor implements
FederationExecutor {
Preconditions.checkArgument(sqlStatementContext instanceof
SelectStatementContext, "SQL statement context must be select statement
context.");
ShardingSphereSchema schema =
federationContext.getDatabases().get(databaseName.toLowerCase()).getSchema(schemaName);
FilterableSchema filterableSchema =
createFilterableSchema(prepareEngine, schema, callback, federationContext);
- Enumerator<Object[]> enumerator =
execute(sqlStatementContext.getSqlStatement(), filterableSchema).enumerator();
+ Map<String, Object> parameters =
createParameters(federationContext.getLogicSQL().getParameters());
+ Enumerator<Object[]> enumerator =
execute(sqlStatementContext.getSqlStatement(), filterableSchema,
parameters).enumerator();
resultSet = new FederationResultSet(enumerator, schema,
filterableSchema, sqlStatementContext);
return resultSet;
}
+ private Map<String, Object> createParameters(final List<Object>
parameters) {
+ Map<String, Object> result = new HashMap<>(parameters.size(), 1);
+ int index = 0;
+ for (Object each : parameters) {
+ result.put("?" + index++, each);
+ }
+ return result;
+ }
+
private FilterableSchema createFilterableSchema(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
final ShardingSphereSchema schema,
final
JDBCExecutorCallback<? extends ExecuteResult> callback, final FederationContext
federationContext) {
FilterableTableScanExecutorContext executorContext = new
FilterableTableScanExecutorContext(databaseName, schemaName, props,
federationContext);
@@ -112,7 +125,7 @@ public final class AdvancedFederationExecutor implements
FederationExecutor {
}
@SuppressWarnings("unchecked")
- private Enumerable<Object[]> execute(final SQLStatement sqlStatement,
final FilterableSchema filterableSchema) {
+ private Enumerable<Object[]> execute(final SQLStatement sqlStatement,
final FilterableSchema filterableSchema, final Map<String, Object> parameters) {
// TODO remove OptimizerPlannerContextFactory call and use setup
executor to handle this logic
CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
@@ -121,7 +134,7 @@ public final class AdvancedFederationExecutor implements
FederationExecutor {
SqlToRelConverter converter =
OptimizerPlannerContextFactory.createConverter(catalogReader, validator,
relDataTypeFactory);
RelNode bestPlan = new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlanner()).optimize(sqlStatement);
Bindable<Object[]> executablePlan =
EnumerableInterpretable.toBindable(Collections.emptyMap(), null,
(EnumerableRel) bestPlan, EnumerableRel.Prefer.ARRAY);
- return executablePlan.bind(new AdvancedExecuteDataContext(validator,
converter));
+ return executablePlan.bind(new AdvancedExecuteDataContext(validator,
converter, parameters));
}
@Override