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

Reply via email to