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

panjuan 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 e9bf38f  Add LogicSQLContext to refactor JDBCExecutorWrapper (#7525)
e9bf38f is described below

commit e9bf38f6dc87be48c2925d93b97c50f84c3d496f
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Sep 20 22:16:52 2020 +0800

    Add LogicSQLContext to refactor JDBCExecutorWrapper (#7525)
    
    * For code format
    
    * Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
    
    * Add LogicSQLContext
    
    * Use LogicSQLContext on SQLExecuteEngine
    
    * Use LogicSQLContext on JDBCDatabaseCommunicationEngine
    
    * Use LogicSQLContext on ShardingCTLExplainBackendHandler
    
    * Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
    
    * Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
    
    * Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
    
    * Refactor StatementExecutorWrapper and PreparedStatementExecutorWrapper
    
    * Refactor JDBCExecutorWrapper
    
    * Refactor JDBCExecutorWrapper
---
 .../DatabaseCommunicationEngineFactory.java        | 12 +++--
 .../jdbc/JDBCDatabaseCommunicationEngine.java      | 34 +++++++------
 .../jdbc/execute/SQLExecuteEngine.java             |  5 +-
 .../execute/engine/jdbc/JDBCExecuteEngine.java     |  8 ++--
 .../jdbc/wrapper/JDBCExecutorWrapper.java          | 56 ++++++++++++++++++----
 .../LogicSQLContext.java}                          | 38 +++++++--------
 .../wrapper/PreparedStatementExecutorWrapper.java  | 49 +++----------------
 .../jdbc/wrapper/StatementExecutorWrapper.java     | 52 +++-----------------
 .../text/admin/ShowTablesBackendHandler.java       |  6 +--
 .../backend/text/query/QueryBackendHandler.java    |  6 +--
 .../explain/ShardingCTLExplainBackendHandler.java  | 12 +++--
 11 files changed, 123 insertions(+), 155 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngineFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngineFactory.java
index b6b7d68..a344bbb 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngineFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngineFactory.java
@@ -23,11 +23,13 @@ import 
org.apache.shardingsphere.infra.context.SchemaContext;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.JDBCDatabaseCommunicationEngine;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.execute.engine.jdbc.JDBCExecuteEngine;
+import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.PreparedStatementExecutorWrapper;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.StatementExecutorWrapper;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -53,11 +55,12 @@ public final class DatabaseCommunicationEngineFactory {
      * @param sqlStatement sql statement
      * @param sql SQL to be executed
      * @param backendConnection backend connection
-     * @return instance of text protocol backend handler
+     * @return text protocol backend handler
      */
     public DatabaseCommunicationEngine newTextProtocolInstance(final 
SQLStatement sqlStatement, final String sql, final BackendConnection 
backendConnection) {
         SchemaContext schemaContext = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
-        return new JDBCDatabaseCommunicationEngine(sql, backendConnection, new 
JDBCExecuteEngine(backendConnection, new 
StatementExecutorWrapper(schemaContext, sqlStatement)));
+        LogicSQLContext logicSQLContext = new LogicSQLContext(schemaContext, 
sql, Collections.emptyList(), sqlStatement); 
+        return new JDBCDatabaseCommunicationEngine(logicSQLContext, 
backendConnection, new JDBCExecuteEngine(backendConnection, new 
StatementExecutorWrapper()));
     }
     
     /**
@@ -67,10 +70,11 @@ public final class DatabaseCommunicationEngineFactory {
      * @param sql SQL to be executed
      * @param parameters SQL parameters
      * @param backendConnection backend connection
-     * @return instance of binary protocol backend handler
+     * @return binary protocol backend handler
      */
     public DatabaseCommunicationEngine newBinaryProtocolInstance(final 
SQLStatement sqlStatement, final String sql, final List<Object> parameters, 
final BackendConnection backendConnection) {
         SchemaContext schemaContext = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
-        return new JDBCDatabaseCommunicationEngine(sql, backendConnection, new 
JDBCExecuteEngine(backendConnection, new 
PreparedStatementExecutorWrapper(schemaContext, sqlStatement, parameters)));
+        LogicSQLContext logicSQLContext = new LogicSQLContext(schemaContext, 
sql, parameters, sqlStatement);
+        return new JDBCDatabaseCommunicationEngine(logicSQLContext, 
backendConnection, new JDBCExecuteEngine(backendConnection, new 
PreparedStatementExecutorWrapper()));
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
index cd59cab..3f8c808 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
@@ -17,11 +17,9 @@
 
 package org.apache.shardingsphere.proxy.backend.communication.jdbc;
 
-import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.governance.core.event.persist.MetaDataPersistEvent;
 import 
org.apache.shardingsphere.governance.core.eventbus.ShardingSphereEventBus;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
-import org.apache.shardingsphere.infra.context.SchemaContext;
 import org.apache.shardingsphere.infra.executor.sql.QueryResult;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
 import org.apache.shardingsphere.infra.executor.sql.log.SQLLogger;
@@ -35,6 +33,7 @@ import 
org.apache.shardingsphere.infra.rule.DataNodeRoutedRule;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngine;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.execute.SQLExecuteEngine;
+import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.exception.TableModifyInTransactionException;
 import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
@@ -56,38 +55,34 @@ import java.util.Optional;
 /**
  * Database access engine for JDBC.
  */
-@RequiredArgsConstructor
 public final class JDBCDatabaseCommunicationEngine implements 
DatabaseCommunicationEngine {
     
-    private final String sql;
+    private final LogicSQLContext logicSQLContext;
     
     private final BackendConnection connection;
     
     private final SQLExecuteEngine executeEngine;
     
-    private final SchemaContext schema;
-    
     private BackendResponse response;
     
     private MergedResult mergedResult;
     
-    public JDBCDatabaseCommunicationEngine(final String sql, final 
BackendConnection backendConnection, final SQLExecuteEngine sqlExecuteEngine) {
-        this.sql = sql;
+    public JDBCDatabaseCommunicationEngine(final LogicSQLContext 
logicSQLContext, final BackendConnection backendConnection, final 
SQLExecuteEngine sqlExecuteEngine) {
+        this.logicSQLContext = logicSQLContext;
         connection = backendConnection;
         executeEngine = sqlExecuteEngine;
-        schema = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
     }
     
     @Override
     public BackendResponse execute() throws SQLException {
-        ExecutionContext executionContext = 
executeEngine.generateExecutionContext(sql);
+        ExecutionContext executionContext = 
executeEngine.generateExecutionContext(logicSQLContext);
         logSQL(executionContext);
         return doExecute(executionContext);
     }
     
     private void logSQL(final ExecutionContext executionContext) {
         if 
(ProxyContext.getInstance().getSchemaContexts().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW))
 {
-            SQLLogger.logSQL(sql, 
ProxyContext.getInstance().getSchemaContexts().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SIMPLE),
 executionContext);
+            SQLLogger.logSQL(logicSQLContext.getSql(), 
ProxyContext.getInstance().getSchemaContexts().getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SIMPLE),
 executionContext);
         }
     }
     
@@ -122,16 +117,17 @@ public final class JDBCDatabaseCommunicationEngine 
implements DatabaseCommunicat
         }
         Optional<MetaDataRefreshStrategy> refreshStrategy = 
MetaDataRefreshStrategyFactory.newInstance(sqlStatementContext);
         if (refreshStrategy.isPresent()) {
-            
refreshStrategy.get().refreshMetaData(schema.getSchema().getMetaData(), 
ProxyContext.getInstance().getSchemaContexts().getDatabaseType(),
-                    schema.getSchema().getDataSources(), sqlStatementContext, 
this::loadTableMetaData);
-            ShardingSphereEventBus.getInstance().post(new 
MetaDataPersistEvent(schema.getName(), 
schema.getSchema().getMetaData().getRuleSchemaMetaData()));
+            
refreshStrategy.get().refreshMetaData(logicSQLContext.getSchemaContext().getSchema().getMetaData(),
 ProxyContext.getInstance().getSchemaContexts().getDatabaseType(),
+                    
logicSQLContext.getSchemaContext().getSchema().getDataSources(), 
sqlStatementContext, this::loadTableMetaData);
+            ShardingSphereEventBus.getInstance().post(
+                    new 
MetaDataPersistEvent(logicSQLContext.getSchemaContext().getName(), 
logicSQLContext.getSchemaContext().getSchema().getMetaData().getRuleSchemaMetaData()));
         }
     }
     
     private Optional<TableMetaData> loadTableMetaData(final String tableName) 
throws SQLException {
-        RuleSchemaMetaDataLoader loader = new 
RuleSchemaMetaDataLoader(schema.getSchema().getRules());
+        RuleSchemaMetaDataLoader loader = new 
RuleSchemaMetaDataLoader(logicSQLContext.getSchemaContext().getSchema().getRules());
         return 
loader.load(ProxyContext.getInstance().getSchemaContexts().getDatabaseType(),
-                schema.getSchema().getDataSources(), tableName, 
ProxyContext.getInstance().getSchemaContexts().getProps());
+                
logicSQLContext.getSchemaContext().getSchema().getDataSources(), tableName, 
ProxyContext.getInstance().getSchemaContexts().getProps());
     }
     
     private BackendResponse merge(final SQLStatementContext<?> 
sqlStatementContext) throws SQLException {
@@ -150,13 +146,15 @@ public final class JDBCDatabaseCommunicationEngine 
implements DatabaseCommunicat
     }
     
     private boolean isNeedAccumulate(final SQLStatementContext<?> 
sqlStatementContext) {
-        Optional<DataNodeRoutedRule> dataNodeRoutedRule = 
schema.getSchema().getRules().stream().filter(each -> each instanceof 
DataNodeRoutedRule).findFirst().map(rule -> (DataNodeRoutedRule) rule);
+        Optional<DataNodeRoutedRule> dataNodeRoutedRule =
+                
logicSQLContext.getSchemaContext().getSchema().getRules().stream().filter(each 
-> each instanceof DataNodeRoutedRule).findFirst().map(rule -> 
(DataNodeRoutedRule) rule);
         return dataNodeRoutedRule.isPresent() && 
dataNodeRoutedRule.get().isNeedAccumulate(sqlStatementContext.getTablesContext().getTableNames());
     }
     
     private MergedResult mergeQuery(final SQLStatementContext<?> 
sqlStatementContext, final List<QueryResult> queryResults) throws SQLException {
         MergeEngine mergeEngine = new 
MergeEngine(ProxyContext.getInstance().getSchemaContexts().getDatabaseType(),
-                
schema.getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
 ProxyContext.getInstance().getSchemaContexts().getProps(), 
schema.getSchema().getRules());
+                
logicSQLContext.getSchemaContext().getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
 
+                ProxyContext.getInstance().getSchemaContexts().getProps(), 
logicSQLContext.getSchemaContext().getSchema().getRules());
         return mergeEngine.merge(queryResults, sqlStatementContext);
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
index a0b203c..55b7ba9 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.communication.jdbc.execute;
 
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
+import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
 import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
 
 import java.sql.SQLException;
@@ -30,11 +31,11 @@ public interface SQLExecuteEngine {
     /**
      * Generate execution context.
      *
-     * @param sql SQL
+     * @param logicSQLContext logic SQL context
      * @return execution context
      * @throws SQLException SQL exception
      */
-    ExecutionContext generateExecutionContext(String sql) throws SQLException;
+    ExecutionContext generateExecutionContext(LogicSQLContext logicSQLContext) 
throws SQLException;
     
     /**
      * Execute SQL.
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/engine/jdbc/JDBCExecuteEngine.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/engine/jdbc/JDBCExecuteEngine.java
index a319da1..a422393 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/engine/jdbc/JDBCExecuteEngine.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/engine/jdbc/JDBCExecuteEngine.java
@@ -40,6 +40,7 @@ import 
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.execute.SQLExecuteEngine;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.JDBCExecutorWrapper;
+import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
 import org.apache.shardingsphere.proxy.backend.context.BackendExecutorContext;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
@@ -76,8 +77,8 @@ public final class JDBCExecuteEngine implements 
SQLExecuteEngine {
     }
     
     @Override
-    public ExecutionContext generateExecutionContext(final String sql) throws 
SQLException {
-        return jdbcExecutorWrapper.generateExecutionContext(sql);
+    public ExecutionContext generateExecutionContext(final LogicSQLContext 
logicSQLContext) {
+        return jdbcExecutorWrapper.generateExecutionContext(logicSQLContext);
     }
     
     @Override
@@ -117,7 +118,8 @@ public final class JDBCExecuteEngine implements 
SQLExecuteEngine {
     @SuppressWarnings({"unchecked", "rawtypes"})
     private Collection<InputGroup<StatementExecuteUnit>> 
generateInputGroups(final Collection<ExecutionUnit> executionUnits, final int 
maxConnectionsSizePerQuery, final boolean isReturnGeneratedKeys,
                                                                              
final RouteContext routeContext) throws SQLException {
-        ExecuteGroupEngine executeGroupEngine = 
jdbcExecutorWrapper.getExecuteGroupEngine(backendConnection, 
maxConnectionsSizePerQuery, new StatementOption(isReturnGeneratedKeys));
+        Collection<ShardingSphereRule> rules = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName()).getSchema().getRules();
+        ExecuteGroupEngine executeGroupEngine = 
jdbcExecutorWrapper.getExecuteGroupEngine(backendConnection, 
maxConnectionsSizePerQuery, new StatementOption(isReturnGeneratedKeys), rules);
         return (Collection<InputGroup<StatementExecuteUnit>>) 
executeGroupEngine.generate(routeContext, executionUnits);
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/JDBCExecutorWrapper.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/JDBCExecutorWrapper.java
index b2c2984..f79de38 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/JDBCExecutorWrapper.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/JDBCExecutorWrapper.java
@@ -18,25 +18,64 @@
 package org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper;
 
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
+import 
org.apache.shardingsphere.infra.executor.sql.context.ExecutionContextBuilder;
+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.group.ExecuteGroupEngine;
 import 
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.StatementOption;
+import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
+import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
+import org.apache.shardingsphere.infra.route.DataNodeRouter;
+import org.apache.shardingsphere.infra.route.context.RouteContext;
+import org.apache.shardingsphere.infra.route.context.RouteResult;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import 
org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
+import 
org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
 
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.Collection;
+import java.util.List;
 
 /**
- * JDBC executor wrapper.
+ * JDBC Executor wrapper.
  */
-public interface JDBCExecutorWrapper {
+public abstract class JDBCExecutorWrapper {
     
     /**
      * Generate execution context.
-     * 
-     * @param sql SQL
+     *
+     * @param logicSQLContext logic SQL context
      * @return execution context
      */
-    ExecutionContext generateExecutionContext(String sql);
+    public final ExecutionContext generateExecutionContext(final 
LogicSQLContext logicSQLContext) {
+        Collection<ShardingSphereRule> rules = 
logicSQLContext.getSchemaContext().getSchema().getRules();
+        if (rules.isEmpty()) {
+            return createDefaultExecutionContext(logicSQLContext);
+        }
+        DataNodeRouter router = new 
DataNodeRouter(logicSQLContext.getSchemaContext().getSchema().getMetaData(), 
ProxyContext.getInstance().getSchemaContexts().getProps(), rules);
+        RouteContext routeContext = 
router.route(logicSQLContext.getSqlStatement(), logicSQLContext.getSql(), 
logicSQLContext.getParameters());
+        SQLRewriteEntry rewriteEntry = new 
SQLRewriteEntry(logicSQLContext.getSchemaContext().getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
+                ProxyContext.getInstance().getSchemaContexts().getProps(), 
rules);
+        SQLRewriteResult sqlRewriteResult = 
rewriteEntry.rewrite(logicSQLContext.getSql(), 
cloneParameters(logicSQLContext.getParameters()), routeContext);
+        SQLStatementContext<?> sqlStatementContext = 
routeContext.getSqlStatementContext();
+        Collection<ExecutionUnit> executionUnits = 
ExecutionContextBuilder.build(logicSQLContext.getSchemaContext().getSchema().getMetaData(),
 sqlRewriteResult, sqlStatementContext);
+        return new ExecutionContext(sqlStatementContext, executionUnits, 
routeContext);
+    }
+    
+    @SuppressWarnings("unchecked")
+    private ExecutionContext createDefaultExecutionContext(final 
LogicSQLContext logicSQLContext) {
+        String dataSourceName = 
logicSQLContext.getSchemaContext().getSchema().getDataSources().isEmpty()
+                ? "" : 
logicSQLContext.getSchemaContext().getSchema().getDataSources().keySet().iterator().next();
+        SQLStatementContext<?> sqlStatementContext = new 
CommonSQLStatementContext(logicSQLContext.getSqlStatement());
+        ExecutionUnit executionUnit = new ExecutionUnit(dataSourceName, new 
SQLUnit(logicSQLContext.getSql(), logicSQLContext.getParameters()));
+        RouteContext routeContext = new RouteContext(sqlStatementContext, 
logicSQLContext.getParameters(), new RouteResult());
+        return new ExecutionContext(sqlStatementContext, executionUnit, 
routeContext);
+    }
+    
+    protected abstract List<Object> cloneParameters(List<Object> parameters);
     
     /**
      * Get execute group engine.
@@ -44,18 +83,19 @@ public interface JDBCExecutorWrapper {
      * @param backendConnection backend connection
      * @param maxConnectionsSizePerQuery max connections size per query
      * @param option statement option
+     * @param rules rules
      * @return execute group engine
      */
-    ExecuteGroupEngine<?> getExecuteGroupEngine(BackendConnection 
backendConnection, int maxConnectionsSizePerQuery, StatementOption option);
+    public abstract ExecuteGroupEngine<?> 
getExecuteGroupEngine(BackendConnection backendConnection, int 
maxConnectionsSizePerQuery, StatementOption option, 
Collection<ShardingSphereRule> rules);
     
     /**
      * Execute SQL.
-     * 
+     *
      * @param statement statement
      * @param sql SQL to be executed
      * @param isReturnGeneratedKeys is return generated keys
      * @return {@code true} is for query, {@code false} is for update
      * @throws SQLException SQL exception
      */
-    boolean execute(Statement statement, String sql, boolean 
isReturnGeneratedKeys) throws SQLException;
+    public abstract boolean execute(Statement statement, String sql, boolean 
isReturnGeneratedKeys) throws SQLException;
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/LogicSQLContext.java
similarity index 54%
copy from 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
copy to 
shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/LogicSQLContext.java
index a0b203c..245bce4 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/execute/SQLExecuteEngine.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/LogicSQLContext.java
@@ -15,33 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.communication.jdbc.execute;
+package org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper;
 
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
-import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.context.SchemaContext;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
-import java.sql.SQLException;
+import java.util.List;
 
 /**
- * SQL Execute engine.
+ * Logic SQL context.
  */
-public interface SQLExecuteEngine {
+@RequiredArgsConstructor
+@Getter
+public final class LogicSQLContext {
     
-    /**
-     * Generate execution context.
-     *
-     * @param sql SQL
-     * @return execution context
-     * @throws SQLException SQL exception
-     */
-    ExecutionContext generateExecutionContext(String sql) throws SQLException;
+    private final SchemaContext schemaContext;
     
-    /**
-     * Execute SQL.
-     *
-     * @param executionContext execution context
-     * @return execute response
-     * @throws SQLException SQL exception
-     */
-    BackendResponse execute(ExecutionContext executionContext) throws 
SQLException;
+    private final String sql;
+    
+    private final List<Object> parameters;
+    
+    private final SQLStatement sqlStatement;
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
index d1aa221..7a94687 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/PreparedStatementExecutorWrapper.java
@@ -17,26 +17,11 @@
 
 package org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper;
 
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.context.SchemaContext;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
-import 
org.apache.shardingsphere.infra.executor.sql.context.ExecutionContextBuilder;
-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.group.ExecuteGroupEngine;
 import 
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.PreparedStatementExecuteGroupEngine;
 import 
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.StatementOption;
-import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
-import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
-import org.apache.shardingsphere.infra.route.DataNodeRouter;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteResult;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import 
org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
-import 
org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
@@ -48,39 +33,17 @@ import java.util.List;
 /**
  * Executor wrapper for prepared statement.
  */
-@RequiredArgsConstructor
-public final class PreparedStatementExecutorWrapper implements 
JDBCExecutorWrapper {
+public final class PreparedStatementExecutorWrapper extends 
JDBCExecutorWrapper {
     
-    private static final ProxyContext PROXY_SCHEMA_CONTEXTS = 
ProxyContext.getInstance();
-    
-    private final SchemaContext schema;
-    
-    private final SQLStatement sqlStatement;
-    
-    private final List<Object> parameters;
-    
-    @SuppressWarnings("unchecked")
     @Override
-    public ExecutionContext generateExecutionContext(final String sql) {
-        Collection<ShardingSphereRule> rules = schema.getSchema().getRules();
-        if (rules.isEmpty()) {
-            SQLStatementContext<?> sqlStatementContext = new 
CommonSQLStatementContext(sqlStatement);
-            return new ExecutionContext(sqlStatementContext, new 
ExecutionUnit(schema.getSchema().getDataSources().keySet().iterator().next(), 
new SQLUnit(sql, parameters)),
-                    new RouteContext(sqlStatementContext, parameters, new 
RouteResult()));
-        }
-        DataNodeRouter dataNodeRouter = new 
DataNodeRouter(schema.getSchema().getMetaData(), 
PROXY_SCHEMA_CONTEXTS.getSchemaContexts().getProps(), rules);
-        RouteContext routeContext = dataNodeRouter.route(sqlStatement, sql, 
parameters);
-        SQLRewriteEntry sqlRewriteEntry = new 
SQLRewriteEntry(schema.getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
-                PROXY_SCHEMA_CONTEXTS.getSchemaContexts().getProps(), rules);
-        SQLRewriteResult sqlRewriteResult = sqlRewriteEntry.rewrite(sql, new 
ArrayList<>(parameters), routeContext);
-        SQLStatementContext<?> sqlStatementContext = 
routeContext.getSqlStatementContext();
-        Collection<ExecutionUnit> executionUnits = 
ExecutionContextBuilder.build(schema.getSchema().getMetaData(), 
sqlRewriteResult, sqlStatementContext);
-        return new ExecutionContext(sqlStatementContext, executionUnits, 
routeContext);
+    protected List<Object> cloneParameters(final List<Object> parameters) {
+        return new ArrayList<>(parameters);
     }
     
     @Override
-    public ExecuteGroupEngine<?> getExecuteGroupEngine(final BackendConnection 
backendConnection, final int maxConnectionsSizePerQuery, final StatementOption 
option) {
-        return new 
PreparedStatementExecuteGroupEngine(maxConnectionsSizePerQuery, 
backendConnection, option, schema.getSchema().getRules());
+    public ExecuteGroupEngine<?> getExecuteGroupEngine(final BackendConnection 
backendConnection, 
+                                                       final int 
maxConnectionsSizePerQuery, final StatementOption option, final 
Collection<ShardingSphereRule> rules) {
+        return new 
PreparedStatementExecuteGroupEngine(maxConnectionsSizePerQuery, 
backendConnection, option, rules);
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
index 51054a1..7dea87b 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/wrapper/StatementExecutorWrapper.java
@@ -17,73 +17,35 @@
 
 package org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper;
 
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.context.SchemaContext;
-import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
-import 
org.apache.shardingsphere.infra.executor.sql.context.ExecutionContextBuilder;
-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.resourced.jdbc.group.StatementExecuteGroupEngine;
 import 
org.apache.shardingsphere.infra.executor.sql.resourced.jdbc.group.StatementOption;
-import org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry;
-import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
-import org.apache.shardingsphere.infra.route.DataNodeRouter;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteResult;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import 
org.apache.shardingsphere.sql.parser.binder.statement.CommonSQLStatementContext;
-import 
org.apache.shardingsphere.sql.parser.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 
 /**
  * Executor wrapper for statement.
  */
-@RequiredArgsConstructor
-public final class StatementExecutorWrapper implements JDBCExecutorWrapper {
-    
-    private static final ProxyContext PROXY_SCHEMA_CONTEXTS = 
ProxyContext.getInstance();
-    
-    private final SchemaContext schema;
-    
-    private final SQLStatement sqlStatement;
+public final class StatementExecutorWrapper extends JDBCExecutorWrapper {
     
     @Override
-    public ExecutionContext generateExecutionContext(final String sql) {
-        Collection<ShardingSphereRule> rules = schema.getSchema().getRules();
-        if (rules.isEmpty()) {
-            return createExecutionContext(sql);
-        }
-        DataNodeRouter router = new 
DataNodeRouter(schema.getSchema().getMetaData(), 
PROXY_SCHEMA_CONTEXTS.getSchemaContexts().getProps(), rules);
-        RouteContext routeContext = router.route(sqlStatement, sql, 
Collections.emptyList());
-        SQLRewriteResult sqlRewriteResult = new 
SQLRewriteEntry(schema.getSchema().getMetaData().getRuleSchemaMetaData().getConfiguredSchemaMetaData(),
-                PROXY_SCHEMA_CONTEXTS.getSchemaContexts().getProps(), 
rules).rewrite(sql, Collections.emptyList(), routeContext);
-        SQLStatementContext<?> sqlStatementContext = 
routeContext.getSqlStatementContext();
-        Collection<ExecutionUnit> executionUnits = 
ExecutionContextBuilder.build(schema.getSchema().getMetaData(), 
sqlRewriteResult, sqlStatementContext);
-        return new ExecutionContext(sqlStatementContext, executionUnits, 
routeContext);
+    protected List<Object> cloneParameters(final List<Object> parameters) {
+        return Collections.emptyList();
     }
     
     @Override
-    public StatementExecuteGroupEngine getExecuteGroupEngine(final 
BackendConnection backendConnection, final int maxConnectionsSizePerQuery, 
final StatementOption option) {
-        return new StatementExecuteGroupEngine(maxConnectionsSizePerQuery, 
backendConnection, option, schema.getSchema().getRules());
+    public StatementExecuteGroupEngine getExecuteGroupEngine(final 
BackendConnection backendConnection, 
+                                                             final int 
maxConnectionsSizePerQuery, final StatementOption option, final 
Collection<ShardingSphereRule> rules) {
+        return new StatementExecuteGroupEngine(maxConnectionsSizePerQuery, 
backendConnection, option, rules);
     }
     
     @Override
     public boolean execute(final Statement statement, final String sql, final 
boolean isReturnGeneratedKeys) throws SQLException {
         return statement.execute(sql, isReturnGeneratedKeys ? 
Statement.RETURN_GENERATED_KEYS : Statement.NO_GENERATED_KEYS);
     }
-    
-    @SuppressWarnings("unchecked")
-    private ExecutionContext createExecutionContext(final String sql) {
-        String dataSource = schema.getSchema().getDataSources().isEmpty() ? "" 
: schema.getSchema().getDataSources().keySet().iterator().next();
-        SQLStatementContext<?> sqlStatementContext = new 
CommonSQLStatementContext(sqlStatement);
-        ExecutionUnit executionUnit = new ExecutionUnit(dataSource, new 
SQLUnit(sql, Collections.emptyList()));
-        return new ExecutionContext(sqlStatementContext, executionUnit, new 
RouteContext(sqlStatementContext, Collections.emptyList(), new RouteResult()));
-    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/ShowTablesBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/ShowTablesBackendHandler.java
index c41955b..1aef71e 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/ShowTablesBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/ShowTablesBackendHandler.java
@@ -53,11 +53,11 @@ public final class ShowTablesBackendHandler implements 
TextProtocolBackendHandle
     
     @Override
     public BackendResponse execute() throws SQLException {
-        SchemaContext context = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
-        if (null == context) {
+        SchemaContext schemaContext = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
+        if (null == schemaContext) {
             throw new NoDatabaseSelectedException();
         }
-        if (!context.isComplete()) {
+        if (!schemaContext.isComplete()) {
             return getDefaultQueryResponse(backendConnection.getSchemaName());
         }
         // TODO Get all tables from meta data.
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/query/QueryBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/query/QueryBackendHandler.java
index e33c6cc..6edd029 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/query/QueryBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/query/QueryBackendHandler.java
@@ -53,11 +53,11 @@ public final class QueryBackendHandler implements 
TextProtocolBackendHandler {
     
     @Override
     public BackendResponse execute() throws SQLException {
-        SchemaContext context = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
-        if (null == context) {
+        SchemaContext schemaContext = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
+        if (null == schemaContext) {
             throw new NoDatabaseSelectedException();
         }
-        if (!context.isComplete()) {
+        if (!schemaContext.isComplete()) {
             return getDefaultQueryResponse(backendConnection.getSchemaName());
         }
         databaseCommunicationEngine = 
databaseCommunicationEngineFactory.newTextProtocolInstance(sqlStatement, sql, 
backendConnection);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandler.java
index 28cfcb0..0196816 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/sctl/explain/ShardingCTLExplainBackendHandler.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.context.SchemaContext;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.raw.execute.result.query.QueryHeader;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.LogicSQLContext;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.wrapper.StatementExecutorWrapper;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
@@ -29,9 +30,11 @@ import 
org.apache.shardingsphere.proxy.backend.response.query.QueryData;
 import org.apache.shardingsphere.proxy.backend.response.query.QueryResponse;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.sctl.exception.InvalidShardingCTLFormatException;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.sql.Types;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
@@ -56,10 +59,11 @@ public final class ShardingCTLExplainBackendHandler 
implements TextProtocolBacke
         if (!explainStatement.isPresent()) {
             throw new InvalidShardingCTLFormatException(sql);
         }
-        SchemaContext schema = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
-        StatementExecutorWrapper statementExecutorWrapper =
-                new StatementExecutorWrapper(schema, 
schema.getRuntimeContext().getSqlParserEngine().parse(explainStatement.get().getSql(),
 false));
-        executionUnits = 
statementExecutorWrapper.generateExecutionContext(explainStatement.get().getSql()).getExecutionUnits().iterator();
+        SchemaContext schemaContext = 
ProxyContext.getInstance().getSchema(backendConnection.getSchemaName());
+        StatementExecutorWrapper statementExecutorWrapper = new 
StatementExecutorWrapper();
+        SQLStatement sqlStatement = 
schemaContext.getRuntimeContext().getSqlParserEngine().parse(explainStatement.get().getSql(),
 false);
+        executionUnits = statementExecutorWrapper.generateExecutionContext(
+                new LogicSQLContext(schemaContext, 
explainStatement.get().getSql(), Collections.emptyList(), 
sqlStatement)).getExecutionUnits().iterator();
         queryHeaders = new ArrayList<>(2);
         queryHeaders.add(new QueryHeader("", "", "datasource_name", "", 255, 
Types.CHAR, 0, false, false, false, false));
         queryHeaders.add(new QueryHeader("", "", "sql", "", 255, Types.CHAR, 
0, false, false, false, false));

Reply via email to