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

sunnianjun 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 01305fceedf Refactor ShardingSpherePreparedStatement (#31671)
01305fceedf is described below

commit 01305fceedfeaf264038e104f374796c6d5262a8
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jun 12 19:03:58 2024 +0800

    Refactor ShardingSpherePreparedStatement (#31671)
---
 .../executor/engine/DriverExecutorFacade.java      |  5 ++-
 .../engine/batch/DriverExecuteBatchExecutor.java   |  9 ++---
 .../statement/ShardingSpherePreparedStatement.java | 43 ++++++++++------------
 .../core/statement/ShardingSphereStatement.java    | 14 +++----
 4 files changed, 32 insertions(+), 39 deletions(-)

diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecutorFacade.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecutorFacade.java
index 48663ead45c..6ed829641c6 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecutorFacade.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/DriverExecutorFacade.java
@@ -70,12 +70,13 @@ public final class DriverExecutorFacade implements 
AutoCloseable {
     
     private final DriverExecuteExecutor executeExecutor;
     
-    public DriverExecutorFacade(final ShardingSphereConnection connection, 
final StatementOption statementOption, final StatementManager statementManager,
-                                final JDBCExecutor jdbcExecutor, final String 
jdbcDriverType, final Grantee grantee) {
+    public DriverExecutorFacade(final ShardingSphereConnection connection,
+                                final StatementOption statementOption, final 
StatementManager statementManager, final String jdbcDriverType, final Grantee 
grantee) {
         this.connection = connection;
         this.statementOption = statementOption;
         this.statementManager = statementManager;
         this.jdbcDriverType = jdbcDriverType;
+        JDBCExecutor jdbcExecutor = new 
JDBCExecutor(connection.getContextManager().getExecutorEngine(), 
connection.getDatabaseConnectionManager().getConnectionContext());
         RawExecutor rawExecutor = new 
RawExecutor(connection.getContextManager().getExecutorEngine(), 
connection.getDatabaseConnectionManager().getConnectionContext());
         trafficExecutor = new TrafficExecutor();
         ShardingSphereMetaData metaData = 
connection.getContextManager().getMetaDataContexts().getMetaData();
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/DriverExecuteBatchExecutor.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/DriverExecuteBatchExecutor.java
index 8e7f2a7cc0e..121f2237216 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/DriverExecuteBatchExecutor.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/batch/DriverExecuteBatchExecutor.java
@@ -17,12 +17,11 @@
 
 package org.apache.shardingsphere.driver.executor.engine.batch;
 
-import lombok.Getter;
-import 
org.apache.shardingsphere.driver.executor.engine.batch.statement.BatchExecutionUnit;
-import 
org.apache.shardingsphere.driver.executor.engine.batch.statement.BatchPreparedStatementExecutor;
 import 
org.apache.shardingsphere.driver.executor.callback.add.StatementAddCallback;
 import 
org.apache.shardingsphere.driver.executor.callback.keygen.GeneratedKeyCallback;
 import 
org.apache.shardingsphere.driver.executor.callback.replay.PreparedStatementParametersReplayCallback;
+import 
org.apache.shardingsphere.driver.executor.engine.batch.statement.BatchExecutionUnit;
+import 
org.apache.shardingsphere.driver.executor.engine.batch.statement.BatchPreparedStatementExecutor;
 import 
org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
 import org.apache.shardingsphere.driver.jdbc.core.statement.StatementManager;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
@@ -65,7 +64,6 @@ public final class DriverExecuteBatchExecutor {
     
     private final ShardingSphereMetaData metaData;
     
-    @Getter
     private final BatchPreparedStatementExecutor 
batchPreparedStatementExecutor;
     
     private final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine;
@@ -73,9 +71,10 @@ public final class DriverExecuteBatchExecutor {
     private ExecutionContext executionContext;
     
     public DriverExecuteBatchExecutor(final ShardingSphereConnection 
connection, final ShardingSphereMetaData metaData, final StatementOption 
statementOption, final StatementManager statementManager,
-                                      final ShardingSphereDatabase database, 
final JDBCExecutor jdbcExecutor) {
+                                      final ShardingSphereDatabase database) {
         this.connection = connection;
         this.metaData = metaData;
+        JDBCExecutor jdbcExecutor = new 
JDBCExecutor(connection.getContextManager().getExecutorEngine(), 
connection.getDatabaseConnectionManager().getConnectionContext());
         batchPreparedStatementExecutor = new 
BatchPreparedStatementExecutor(database, jdbcExecutor, 
connection.getProcessId());
         prepareEngine = createDriverExecutionPrepareEngine(statementOption, 
statementManager, database);
     }
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 71177e0eb79..d7294fde494 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -32,7 +32,6 @@ import 
org.apache.shardingsphere.infra.binder.context.aware.ParameterAware;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.GeneratedKeyContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
-import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine;
 import 
org.apache.shardingsphere.infra.database.core.keygen.GeneratedKeyColumnProvider;
@@ -40,7 +39,6 @@ import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.dialect.SQLExceptionTransformEngine;
 import 
org.apache.shardingsphere.infra.exception.kernel.syntax.EmptySQLException;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriverType;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
 import org.apache.shardingsphere.infra.hint.HintManager;
@@ -50,7 +48,6 @@ import 
org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.metadata.user.Grantee;
-import org.apache.shardingsphere.infra.parser.SQLParserEngine;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttribute;
 import 
org.apache.shardingsphere.infra.rule.attribute.resoure.StorageConnectorReusableRuleAttribute;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
@@ -84,9 +81,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
     
     private final String sql;
     
-    private final List<PreparedStatement> statements = new ArrayList<>();
-    
-    private final List<List<Object>> parameterSets = new ArrayList<>();
+    private final HintValueContext hintValueContext;
     
     private final SQLStatementContext sqlStatementContext;
     
@@ -94,6 +89,9 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
     
     private final StatementOption statementOption;
     
+    @Getter(AccessLevel.PROTECTED)
+    private final StatementManager statementManager;
+    
     @Getter
     private final ParameterMetaData parameterMetaData;
     
@@ -101,22 +99,18 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
     
     private final DriverExecuteBatchExecutor executeBatchExecutor;
     
-    private final Collection<Comparable<?>> generatedValues = new 
LinkedList<>();
+    private final List<PreparedStatement> statements = new ArrayList<>();
     
-    private final boolean statementsCacheable;
+    private final List<List<Object>> parameterSets = new ArrayList<>();
     
-    @Getter(AccessLevel.PROTECTED)
-    private final StatementManager statementManager;
+    private final Collection<Comparable<?>> generatedValues = new 
LinkedList<>();
     
-    @Getter
-    private final boolean selectContainsEnhancedTable;
+    private final boolean statementsCacheable;
     
     private Map<String, Integer> columnLabelAndIndexMap;
     
     private ResultSet currentResultSet;
     
-    private final HintValueContext hintValueContext;
-    
     private ResultSet currentBatchGeneratedKeysResultSet;
     
     public ShardingSpherePreparedStatement(final ShardingSphereConnection 
connection, final String sql) throws SQLException {
@@ -145,25 +139,26 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
         ShardingSpherePreconditions.checkNotEmpty(sql, () -> new 
EmptySQLException().toSQLException());
         this.connection = connection;
         metaData = 
connection.getContextManager().getMetaDataContexts().getMetaData();
-        hintValueContext = SQLHintUtils.extractHint(sql);
         this.sql = SQLHintUtils.removeHint(sql);
-        SQLParserRule sqlParserRule = 
metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
-        SQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(metaData.getDatabase(connection.getDatabaseName()).getProtocolType());
-        SQLStatement sqlStatement = sqlParserEngine.parse(this.sql, true);
+        hintValueContext = SQLHintUtils.extractHint(sql);
+        SQLStatement sqlStatement = parseSQL(connection);
         sqlStatementContext = new SQLBindEngine(metaData, 
connection.getDatabaseName(), hintValueContext).bind(sqlStatement, 
Collections.emptyList());
         databaseName = sqlStatementContext instanceof TableAvailable
                 ? ((TableAvailable) 
sqlStatementContext).getTablesContext().getDatabaseName().orElse(connection.getDatabaseName())
                 : connection.getDatabaseName();
         
connection.getDatabaseConnectionManager().getConnectionContext().setCurrentDatabase(databaseName);
-        parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
         statementOption = returnGeneratedKeys ? new StatementOption(true, 
columns) : new StatementOption(resultSetType, resultSetConcurrency, 
resultSetHoldability);
-        ShardingSphereDatabase database = metaData.getDatabase(databaseName);
         statementManager = new StatementManager();
-        JDBCExecutor jdbcExecutor = new 
JDBCExecutor(connection.getContextManager().getExecutorEngine(), 
connection.getDatabaseConnectionManager().getConnectionContext());
-        driverExecutorFacade = new DriverExecutorFacade(connection, 
statementOption, statementManager, jdbcExecutor, 
JDBCDriverType.PREPARED_STATEMENT, new Grantee("", ""));
-        executeBatchExecutor = new DriverExecuteBatchExecutor(connection, 
metaData, statementOption, statementManager, database, jdbcExecutor);
+        parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
+        ShardingSphereDatabase database = metaData.getDatabase(databaseName);
+        driverExecutorFacade = new DriverExecutorFacade(connection, 
statementOption, statementManager, JDBCDriverType.PREPARED_STATEMENT, new 
Grantee("", ""));
+        executeBatchExecutor = new DriverExecuteBatchExecutor(connection, 
metaData, statementOption, statementManager, database);
         statementsCacheable = 
isStatementsCacheable(database.getRuleMetaData());
-        selectContainsEnhancedTable = sqlStatementContext instanceof 
SelectStatementContext && ((SelectStatementContext) 
sqlStatementContext).isContainsEnhancedTable();
+    }
+    
+    private SQLStatement parseSQL(final ShardingSphereConnection connection) {
+        SQLParserRule sqlParserRule = 
metaData.getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
+        return 
sqlParserRule.getSQLParserEngine(metaData.getDatabase(connection.getDatabaseName()).getProtocolType()).parse(sql,
 true);
     }
     
     private boolean isStatementsCacheable(final RuleMetaData 
databaseRuleMetaData) {
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 0578a51e0e9..baaf6895344 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -38,7 +38,6 @@ import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.dialect.SQLExceptionTransformEngine;
 import 
org.apache.shardingsphere.infra.exception.kernel.syntax.EmptySQLException;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriverType;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
@@ -72,17 +71,17 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     
     private final ShardingSphereMetaData metaData;
     
-    private final List<Statement> statements;
-    
     private final StatementOption statementOption;
     
-    private final DriverExecutorFacade driverExecutorFacade;
-    
     @Getter(AccessLevel.PROTECTED)
     private final StatementManager statementManager;
     
+    private final DriverExecutorFacade driverExecutorFacade;
+    
     private final BatchStatementExecutor batchStatementExecutor;
     
+    private final List<Statement> statements;
+    
     private String databaseName;
     
     private SQLStatementContext sqlStatementContext;
@@ -102,12 +101,11 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     public ShardingSphereStatement(final ShardingSphereConnection connection, 
final int resultSetType, final int resultSetConcurrency, final int 
resultSetHoldability) {
         this.connection = connection;
         metaData = 
connection.getContextManager().getMetaDataContexts().getMetaData();
-        statements = new LinkedList<>();
         statementOption = new StatementOption(resultSetType, 
resultSetConcurrency, resultSetHoldability);
         statementManager = new StatementManager();
-        JDBCExecutor jdbcExecutor = new 
JDBCExecutor(connection.getContextManager().getExecutorEngine(), 
connection.getDatabaseConnectionManager().getConnectionContext());
-        driverExecutorFacade = new DriverExecutorFacade(connection, 
statementOption, statementManager, jdbcExecutor, JDBCDriverType.STATEMENT, new 
Grantee("", ""));
+        driverExecutorFacade = new DriverExecutorFacade(connection, 
statementOption, statementManager, JDBCDriverType.STATEMENT, new Grantee("", 
""));
         batchStatementExecutor = new BatchStatementExecutor(this);
+        statements = new LinkedList<>();
         databaseName = connection.getDatabaseName();
     }
     

Reply via email to