This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 5d13926  Add FilterableTableScanContext (#12662)
5d13926 is described below

commit 5d139268b1c916292bb3175e05f6d2205cee14ce
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Sep 23 22:10:56 2021 +0800

    Add FilterableTableScanContext (#12662)
    
    * Fix javadoc
    
    * Refactor FederateExecutionContextGenerator
    
    * Rename FederationSQLGenerator
    
    * Refactor FederationSQLGenerator
    
    * For javadoc
    
    * Refactor FederateExecutionContextGenerator
    
    * Refactor FederateExecutionContextGenerator
    
    * Add RelNodeScanContext
    
    * Refactor FederateExecutionContextGenerator
    
    * Refactor FederationSQLGenerator
    
    * Rename FederationRowEnumerator
    
    * For code style
    
    * Adjust param order
    
    * For javadoc
    
    * For javadoc
    
    * Rename FilterableTableScanContext
---
 .../sql/federate/execute/FederationExecutor.java   | 12 ++---
 .../FilterableTableScanContext.java}               | 32 ++---------
 .../customized/CustomizedFederationExecutor.java   |  4 +-
 .../original/OriginalFederationExecutor.java       | 24 ++++-----
 .../federate/schema/row/FederateRowExecutor.java   | 38 ++++++-------
 ...numerator.java => FederationRowEnumerator.java} |  7 ++-
 .../schema/table/AbstractFederationTable.java      |  2 +-
 .../schema/table/FederationFilterableTable.java    |  8 ++-
 .../FederateExecutionContextGenerator.java         | 44 ++++++++-------
 .../table/generator/FederationSQLGenerator.java    | 63 ++++++++++++++++++++++
 .../statement/ShardingSpherePreparedStatement.java |  2 +-
 .../core/statement/ShardingSphereStatement.java    |  2 +-
 .../statement/FederatePrepareStatementTest.java    |  7 ++-
 .../backend/communication/ProxySQLExecutor.java    |  2 +-
 14 files changed, 146 insertions(+), 101 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederationExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederationExecutor.java
index fd0d030..053efd5 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederationExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FederationExecutor.java
@@ -37,20 +37,20 @@ public interface FederationExecutor {
     /**
      * Execute query.
      *
-     * @param executionContext execution context
-     * @param callback callback
      * @param prepareEngine prepare engine
-     * @return execute result
+     * @param callback callback
+     * @param executionContext execution context
+     * @return query results
      * @throws SQLException SQL exception
      */
-    List<QueryResult> executeQuery(ExecutionContext executionContext, 
JDBCExecutorCallback<? extends ExecuteResult> callback, 
-                                   
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) 
throws SQLException;
+    List<QueryResult> 
executeQuery(DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine, 
+                                   JDBCExecutorCallback<? extends 
ExecuteResult> callback, ExecutionContext executionContext) throws SQLException;
     
     /**
      * Get result set.
      *
      * @return result set
-     * @throws SQLException sql exception
+     * @throws SQLException SQL exception
      */
     ResultSet getResultSet() throws SQLException;
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionSQLGenerator.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FilterableTableScanContext.java
similarity index 51%
rename from 
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionSQLGenerator.java
rename to 
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FilterableTableScanContext.java
index 7e42717..3fea691 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionSQLGenerator.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/FilterableTableScanContext.java
@@ -15,47 +15,25 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.infra.executor.sql.federate.schema.table.generator;
+package org.apache.shardingsphere.infra.executor.sql.federate.execute;
 
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.calcite.DataContext;
 import org.apache.calcite.rex.RexNode;
-import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
 
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
- * Federate execution sql generator.
+ * Filterable table scan context.
  */
 @RequiredArgsConstructor
-public final class FederateExecutionSQLGenerator {
+@Getter
+public final class FilterableTableScanContext {
     
     private final DataContext root;
     
     private final List<RexNode> filters;
     
     private final int[] projects;
-    
-    private final List<String> columnNames;
-    
-    private final QuoteCharacter quoteCharacter;
-    
-    /**
-     * Generate sql.
-     *
-     * @param table table
-     * @return sql
-     */
-    public String generate(final String table) {
-        // TODO generate sql with filters
-        return String.format("SELECT %s FROM %s", getQuotedColumnNames(), 
quoteCharacter.wrap(table));
-    }
-    
-    private String getQuotedColumnNames() {
-        Collection<String> actualColumnNames = null == projects ? columnNames 
: 
Arrays.stream(projects).mapToObj(columnNames::get).collect(Collectors.toList());
-        return 
actualColumnNames.stream().map(quoteCharacter::wrap).collect(Collectors.joining(",
 "));
-    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/customized/CustomizedFederationExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/customized/CustomizedFederationExecutor.java
index a1954c3..6dd5753 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/customized/CustomizedFederationExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/customized/CustomizedFederationExecutor.java
@@ -51,8 +51,8 @@ public final class CustomizedFederationExecutor implements 
FederationExecutor {
     }
     
     @Override
-    public List<QueryResult> executeQuery(final ExecutionContext 
executionContext, final JDBCExecutorCallback<? extends ExecuteResult> callback, 
-                                          final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) 
throws SQLException {
+    public List<QueryResult> executeQuery(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
+                                          final JDBCExecutorCallback<? extends 
ExecuteResult> callback, final ExecutionContext executionContext) throws 
SQLException {
         // TODO
         return Collections.emptyList();
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/original/OriginalFederationExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/original/OriginalFederationExecutor.java
index d1712c4..9c05e18 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/original/OriginalFederationExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/execute/original/OriginalFederationExecutor.java
@@ -73,31 +73,31 @@ public final class OriginalFederationExecutor implements 
FederationExecutor {
     }
     
     @Override
-    public List<QueryResult> executeQuery(final ExecutionContext 
executionContext, final JDBCExecutorCallback<? extends ExecuteResult> callback, 
-                                          final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) 
throws SQLException {
-        ResultSet resultSet = execute(executionContext, callback, 
prepareEngine);
+    public List<QueryResult> executeQuery(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
+                                          final JDBCExecutorCallback<? extends 
ExecuteResult> callback, final ExecutionContext executionContext) throws 
SQLException {
+        ResultSet resultSet = execute(prepareEngine, callback, 
executionContext);
         return Collections.singletonList(new JDBCStreamQueryResult(resultSet));
     }
     
-    private ResultSet execute(final ExecutionContext executionContext, final 
JDBCExecutorCallback<? extends ExecuteResult> callback, 
-                              final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) 
throws SQLException {
+    private ResultSet execute(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
+                              final JDBCExecutorCallback<? extends 
ExecuteResult> callback, final ExecutionContext executionContext) throws 
SQLException {
         SQLUnit sqlUnit = 
executionContext.getExecutionUnits().iterator().next().getSqlUnit();
-        PreparedStatement preparedStatement = 
createConnection(executionContext, callback, 
prepareEngine).prepareStatement(SQLUtil.trimSemicolon(sqlUnit.getSql()));
+        PreparedStatement preparedStatement = createConnection(prepareEngine, 
callback, 
executionContext).prepareStatement(SQLUtil.trimSemicolon(sqlUnit.getSql()));
         setParameters(preparedStatement, sqlUnit.getParameters());
         this.statement = preparedStatement;
         return preparedStatement.executeQuery();
     }
     
-    private Connection createConnection(final ExecutionContext 
executionContext, final JDBCExecutorCallback<? extends ExecuteResult> callback,
-                                        final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) 
throws SQLException {
+    private Connection createConnection(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
+                                        final JDBCExecutorCallback<? extends 
ExecuteResult> callback, final ExecutionContext executionContext) throws 
SQLException {
         Connection result = DriverManager.getConnection(CONNECTION_URL, 
optimizerContext.getProps());
-        addSchema(result.unwrap(CalciteConnection.class), executionContext, 
callback, prepareEngine);
+        addSchema(result.unwrap(CalciteConnection.class), prepareEngine, 
callback, executionContext);
         return result;
     }
     
-    private void addSchema(final CalciteConnection connection, final 
ExecutionContext executionContext, final JDBCExecutorCallback<? extends 
ExecuteResult> callback, 
-                           final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine) 
throws SQLException {
-        FederateRowExecutor executor = new FederateRowExecutor(jdbcExecutor, 
executionContext, callback, prepareEngine, props, 
optimizerContext.getDatabaseType().getQuoteCharacter());
+    private void addSchema(final CalciteConnection connection, final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
+                           final JDBCExecutorCallback<? extends ExecuteResult> 
callback, final ExecutionContext executionContext) throws SQLException {
+        FederateRowExecutor executor = new FederateRowExecutor(prepareEngine, 
jdbcExecutor, callback, props, executionContext, 
optimizerContext.getDatabaseType().getQuoteCharacter());
         FederateLogicSchema logicSchema = new 
FederateLogicSchema(optimizerContext.getMetaData().getSchemas().get(schema), 
executor);
         connection.getRootSchema().add(schema, logicSchema);
         connection.setSchema(schema);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowExecutor.java
index ee3b932..dd15dbc 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowExecutor.java
@@ -17,9 +17,6 @@
 
 package org.apache.shardingsphere.infra.executor.sql.federate.schema.row;
 
-import lombok.RequiredArgsConstructor;
-import org.apache.calcite.DataContext;
-import org.apache.calcite.rex.RexNode;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import 
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupContext;
@@ -29,8 +26,8 @@ import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.J
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.ExecuteResult;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
+import 
org.apache.shardingsphere.infra.executor.sql.federate.execute.FilterableTableScanContext;
 import 
org.apache.shardingsphere.infra.executor.sql.federate.schema.table.generator.FederateExecutionContextGenerator;
-import 
org.apache.shardingsphere.infra.executor.sql.federate.schema.table.generator.FederateExecutionSQLGenerator;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine;
 import 
org.apache.shardingsphere.infra.executor.sql.process.ExecuteProcessEngine;
 import 
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
@@ -39,43 +36,42 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Collection;
-import java.util.List;
 import java.util.stream.Collectors;
 
 /**
  * Federate row executor.
  */
-@RequiredArgsConstructor
 public final class FederateRowExecutor {
     
-    private final JDBCExecutor jdbcExecutor;
+    private final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine;
     
-    private final ExecutionContext routeExecutionContext;
+    private final JDBCExecutor jdbcExecutor;
     
     private final JDBCExecutorCallback<? extends ExecuteResult> callback;
     
-    private final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine;
-    
     private final ConfigurationProperties props;
     
-    private final QuoteCharacter quoteCharacter;
+    private final FederateExecutionContextGenerator executionContextGenerator;
+    
+    public FederateRowExecutor(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
+                               final JDBCExecutor jdbcExecutor, final 
JDBCExecutorCallback<? extends ExecuteResult> callback, 
+                               final ConfigurationProperties props, final 
ExecutionContext routeExecutionContext, final QuoteCharacter quoteCharacter) {
+        this.jdbcExecutor = jdbcExecutor;
+        this.callback = callback;
+        this.prepareEngine = prepareEngine;
+        this.props = props;
+        executionContextGenerator = new 
FederateExecutionContextGenerator(routeExecutionContext, quoteCharacter);
+    }
     
     /**
      * Execute.
      *
      * @param tableMetaData federation table meta data
-     * @param root root
-     * @param filters filters
-     * @param projects projects
+     * @param scanContext rel node scan context
      * @return query results
      */
-    public Collection<QueryResult> execute(final FederationTableMetaData 
tableMetaData, final DataContext root, final List<RexNode> filters, final int[] 
projects) {
-        FederateExecutionContextGenerator generator = new 
FederateExecutionContextGenerator(tableMetaData.getName(), 
-                routeExecutionContext, new FederateExecutionSQLGenerator(root, 
filters, projects, tableMetaData.getColumnNames(), quoteCharacter));
-        return execute(generator.generate());
-    }
-    
-    private Collection<QueryResult> execute(final ExecutionContext context) {
+    public Collection<QueryResult> execute(final FederationTableMetaData 
tableMetaData, final FilterableTableScanContext scanContext) {
+        ExecutionContext context = 
executionContextGenerator.generate(tableMetaData, scanContext);
         try {
             ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
prepareEngine.prepare(context.getRouteContext(), context.getExecutionUnits());
             ExecuteProcessEngine.initialize(context.getLogicSQL(), 
executionGroupContext, props);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowEnumerator.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederationRowEnumerator.java
similarity index 93%
rename from 
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowEnumerator.java
rename to 
shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederationRowEnumerator.java
index 20ef504..e544604 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederateRowEnumerator.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/row/FederationRowEnumerator.java
@@ -27,10 +27,9 @@ import java.util.Iterator;
 import java.util.LinkedList;
 
 /**
- * Federate row enumerator.
- *
+ * Federation row enumerator.
  */
-public final class FederateRowEnumerator implements Enumerator<Object[]> {
+public final class FederationRowEnumerator implements Enumerator<Object[]> {
     
     private final Collection<QueryResult> queryResults = new LinkedList<>();
     
@@ -40,7 +39,7 @@ public final class FederateRowEnumerator implements 
Enumerator<Object[]> {
     
     private Object[] currentRow;
     
-    public FederateRowEnumerator(final Collection<QueryResult> queryResults) {
+    public FederationRowEnumerator(final Collection<QueryResult> queryResults) 
{
         this.queryResults.addAll(queryResults);
         iterator = this.queryResults.iterator();
         currentResultSet = iterator.next();
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederationTable.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederationTable.java
index 44fcade..db11b86 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederationTable.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederationTable.java
@@ -27,7 +27,7 @@ import 
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.Federate
 import 
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
 
 /**
- * Abstract Federation table.
+ * Abstract federation table.
  */
 @RequiredArgsConstructor
 @Getter(AccessLevel.PROTECTED)
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederationFilterableTable.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederationFilterableTable.java
index b09b29b..315e280 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederationFilterableTable.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederationFilterableTable.java
@@ -23,10 +23,13 @@ import org.apache.calcite.linq4j.Enumerable;
 import org.apache.calcite.linq4j.Enumerator;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.schema.ProjectableFilterableTable;
-import 
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederateRowEnumerator;
+import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
+import 
org.apache.shardingsphere.infra.executor.sql.federate.execute.FilterableTableScanContext;
 import 
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederateRowExecutor;
+import 
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederationRowEnumerator;
 import 
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -40,11 +43,12 @@ public final class FederationFilterableTable extends 
AbstractFederationTable imp
     
     @Override
     public Enumerable<Object[]> scan(final DataContext root, final 
List<RexNode> filters, final int[] projects) {
+        Collection<QueryResult> queryResults = 
getExecutor().execute(getMetaData(), new FilterableTableScanContext(root, 
filters, projects));
         return new AbstractEnumerable<Object[]>() {
             
             @Override
             public Enumerator<Object[]> enumerator() {
-                return new 
FederateRowEnumerator(getExecutor().execute(getMetaData(), root, filters, 
projects));
+                return new FederationRowEnumerator(queryResults);
             }
         };
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionContextGenerator.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionContextGenerator.java
index 4bb9526..3b23847 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionContextGenerator.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederateExecutionContextGenerator.java
@@ -21,50 +21,56 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
 import org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
+import 
org.apache.shardingsphere.infra.executor.sql.federate.execute.FilterableTableScanContext;
+import 
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
+import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
 
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.stream.Collectors;
 
 /**
- * Federate table execution context generator.
+ * Federate execution context generator.
  */
 @RequiredArgsConstructor
 public final class FederateExecutionContextGenerator {
     
-    private final String tableName;
-    
     private final ExecutionContext routeExecutionContext;
     
-    private final FederateExecutionSQLGenerator generator;
+    private final QuoteCharacter quoteCharacter;
     
     /**
-     * Create execution context.
-     *
-     * @return execution context
+     * Generate execution context.
+     * 
+     * @param tableMetaData table meta data
+     * @param scanContext filterable table scan context
+     * @return generated execution context
      */
-    public ExecutionContext generate() {
-        RouteContext filteredRouteContext = new 
RouteContextFilter().filter(tableName, routeExecutionContext.getRouteContext());
-        return new ExecutionContext(routeExecutionContext.getLogicSQL(), 
getExecutionUnits(filteredRouteContext.getRouteUnits()), filteredRouteContext);
+    public ExecutionContext generate(final FederationTableMetaData 
tableMetaData, final FilterableTableScanContext scanContext) {
+        RouteContext filteredRouteContext = new 
RouteContextFilter().filter(tableMetaData.getName(), 
routeExecutionContext.getRouteContext());
+        return new ExecutionContext(routeExecutionContext.getLogicSQL(), 
generate(filteredRouteContext.getRouteUnits(), tableMetaData, scanContext, 
quoteCharacter), filteredRouteContext);
     }
     
-    private Collection<ExecutionUnit> getExecutionUnits(final 
Collection<RouteUnit> routeUnits) {
+    private Collection<ExecutionUnit> generate(final Collection<RouteUnit> 
routeUnits,
+                                               final FederationTableMetaData 
tableMetaData, final FilterableTableScanContext scanContext, final 
QuoteCharacter quoteCharacter) {
         Collection<ExecutionUnit> result = new LinkedHashSet<>();
+        FederationSQLGenerator sqlGenerator = new 
FederationSQLGenerator(tableMetaData, scanContext, quoteCharacter);
         for (RouteUnit each: routeUnits) {
-            fillExecutionUnits(result, each);
+            result.addAll(generate(each, sqlGenerator));
         }
         return result;
     }
     
-    private void fillExecutionUnits(final Collection<ExecutionUnit> 
executionUnits, final RouteUnit routeUnit) {
-        for (RouteMapper each : routeUnit.getTableMappers()) {
-            if (each.getLogicName().equalsIgnoreCase(tableName)) {
-                executionUnits.add(new 
ExecutionUnit(routeUnit.getDataSourceMapper().getActualName(),
-                        new SQLUnit(generator.generate(each.getActualName()), 
Collections.emptyList(), Collections.singletonList(each))));
-            }
-        }
+    private Collection<ExecutionUnit> generate(final RouteUnit routeUnit, 
final FederationSQLGenerator sqlGenerator) {
+        return routeUnit.getTableMappers().stream().map(each -> 
generate(routeUnit, each, sqlGenerator)).collect(Collectors.toList());
+    }
+    
+    private ExecutionUnit generate(final RouteUnit routeUnit, final 
RouteMapper tableMapper, final FederationSQLGenerator sqlGenerator) {
+        String sql = sqlGenerator.generate(tableMapper.getActualName());
+        return new 
ExecutionUnit(routeUnit.getDataSourceMapper().getActualName(), new SQLUnit(sql, 
Collections.emptyList(), Collections.singletonList(tableMapper)));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederationSQLGenerator.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederationSQLGenerator.java
new file mode 100644
index 0000000..af5feac
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/generator/FederationSQLGenerator.java
@@ -0,0 +1,63 @@
+/*
+ * 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.shardingsphere.infra.executor.sql.federate.schema.table.generator;
+
+import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.infra.executor.sql.federate.execute.FilterableTableScanContext;
+import 
org.apache.shardingsphere.infra.optimize.core.metadata.FederationTableMetaData;
+import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/**
+ * Federation SQL generator.
+ */
+@RequiredArgsConstructor
+public final class FederationSQLGenerator {
+    
+    private final FederationTableMetaData tableMetaData;
+    
+    private final FilterableTableScanContext scanContext;
+    
+    private final QuoteCharacter quoteCharacter;
+    
+    /**
+     * Generate SQL.
+     * 
+     * @param actualTableName actual table name
+     * @return generated SQL
+     */
+    public String generate(final String actualTableName) {
+        String projections = getQuotedProjections(tableMetaData, scanContext, 
quoteCharacter);
+        String table = getQuotedTable(actualTableName, quoteCharacter);
+        // TODO generate SQL with filters
+        return String.format("SELECT %s FROM %s", projections, table);
+    }
+    
+    private String getQuotedProjections(final FederationTableMetaData 
tableMetaData, final FilterableTableScanContext scanContext, final 
QuoteCharacter quoteCharacter) {
+        Collection<String> actualColumnNames = null == 
scanContext.getProjects()
+                ? tableMetaData.getColumnNames() : 
Arrays.stream(scanContext.getProjects()).mapToObj(tableMetaData.getColumnNames()::get).collect(Collectors.toList());
+        return 
actualColumnNames.stream().map(quoteCharacter::wrap).collect(Collectors.joining(",
 "));
+    }
+    
+    private String getQuotedTable(final String actualTableName, final 
QuoteCharacter quoteCharacter) {
+        return quoteCharacter.wrap(actualTableName);
+    }
+}
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index fc9fac5..c468d86 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -229,7 +229,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         }
         PreparedStatementExecuteQueryCallback callback = new 
PreparedStatementExecuteQueryCallback(metaDataContexts.getMetaData(connection.getSchemaName()).getResource().getDatabaseType(),
                  sqlStatement, 
SQLExecutorExceptionHandler.isExceptionThrown());
-        return federationExecutor.executeQuery(executionContext, callback, 
createDriverExecutionPrepareEngine());
+        return 
federationExecutor.executeQuery(createDriverExecutionPrepareEngine(), callback, 
executionContext);
     }
     
     private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
createDriverExecutionPrepareEngine() {
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index f819c2b..d84e7a7 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -180,7 +180,7 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         }
         StatementExecuteQueryCallback callback = new 
StatementExecuteQueryCallback(metaDataContexts.getMetaData(connection.getSchemaName()).getResource().getDatabaseType(),
                 executionContext.getSqlStatementContext().getSqlStatement(), 
SQLExecutorExceptionHandler.isExceptionThrown());
-        return federationExecutor.executeQuery(executionContext, callback, 
createDriverExecutionPrepareEngine());
+        return 
federationExecutor.executeQuery(createDriverExecutionPrepareEngine(), callback, 
executionContext);
     }
     
     private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
createDriverExecutionPrepareEngine() {
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/FederatePrepareStatementTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/FederatePrepareStatementTest.java
index 39e6689..aeaebf1 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/FederatePrepareStatementTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/FederatePrepareStatementTest.java
@@ -30,18 +30,18 @@ import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 public final class FederatePrepareStatementTest extends 
AbstractShardingSphereDataSourceForFederateTest {
-
+    
     private static final String 
SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES_ALIAS =
             "select o.*, i.* from t_order_federate o, 
t_order_item_federate_sharding i "
                     + "where o.order_id = i.item_id AND i.order_id = ?";
-
+    
     private static final String 
SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES_REWRITE =
             "select t_order_federate.*, t_order_item_federate_sharding.* "
                     + "from t_order_federate, t_order_item_federate_sharding "
                     + "where t_order_federate.order_id = 
t_order_item_federate_sharding.item_id "
                     + "AND t_order_item_federate_sharding.remarks = 
't_order_item_federate_sharding' "
                     + "AND t_order_item_federate_sharding.user_id = ?";
-
+    
     @Test
     public void 
assertQueryWithFederateInSingleAndShardingTableWithAliasByExecuteQuery() throws 
SQLException {
         assertQueryWithFederateInSingleAndShardingTableWithAlias(true);
@@ -101,5 +101,4 @@ public final class FederatePrepareStatementTest extends 
AbstractShardingSphereDa
         assertThat(resultSet1.getInt(5), is(10000));
         assertFalse(resultSet1.next());
     }
-
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
index e5ca404..e738321 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
@@ -159,7 +159,7 @@ public final class ProxySQLExecutor {
                 executionContext.getSqlStatementContext().getSqlStatement(), 
databaseCommunicationEngine, isReturnGeneratedKeys, isExceptionThrown, true);
         backendConnection.setFederationExecutor(federationExecutor);
         DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = createDriverExecutionPrepareEngine(isReturnGeneratedKeys, 
metaData);
-        return federationExecutor.executeQuery(executionContext, callback, 
prepareEngine).stream().map(each -> (ExecuteResult) 
each).collect(Collectors.toList());
+        return federationExecutor.executeQuery(prepareEngine, callback, 
executionContext).stream().map(each -> (ExecuteResult) 
each).collect(Collectors.toList());
     }
     
     private DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
createDriverExecutionPrepareEngine(final boolean isReturnGeneratedKeys, final 
MetaDataContexts metaData) {

Reply via email to