This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 448a4336cce Refactor DriverExecutor (#31446)
448a4336cce is described below
commit 448a4336ccef6b2f47bf2c95ad3f63de4dfdd009
Author: Liang Zhang <[email protected]>
AuthorDate: Thu May 30 13:49:06 2024 +0800
Refactor DriverExecutor (#31446)
---
.../driver/executor/DriverExecutor.java | 47 +++++++++-------------
.../statement/ShardingSpherePreparedStatement.java | 2 +-
.../core/statement/ShardingSphereStatement.java | 2 +-
3 files changed, 22 insertions(+), 29 deletions(-)
diff --git
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
index 09c30d141a8..10878e41d36 100644
---
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
+++
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
@@ -115,7 +115,7 @@ public final class DriverExecutor implements AutoCloseable {
}
/**
- * Execute advance query.
+ * Execute query.
*
* @param metaData meta data
* @param database database
@@ -128,9 +128,9 @@ public final class DriverExecutor implements AutoCloseable {
* @throws SQLException SQL exception
*/
@SuppressWarnings("rawtypes")
- public ResultSet executeAdvanceQuery(final ShardingSphereMetaData
metaData, final ShardingSphereDatabase database, final QueryContext
queryContext,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
final Statement statement,
- final Map<String, Integer>
columnLabelAndIndexMap, final StatementReplayCallback statementReplayCallback)
throws SQLException {
+ public ResultSet executeQuery(final ShardingSphereMetaData metaData, final
ShardingSphereDatabase database, final QueryContext queryContext,
+ final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
final Statement statement,
+ final Map<String, Integer>
columnLabelAndIndexMap, final StatementReplayCallback statementReplayCallback)
throws SQLException {
Optional<String> trafficInstanceId =
connection.getTrafficInstanceId(metaData.getGlobalRuleMetaData().getSingleRule(TrafficRule.class),
queryContext);
if (trafficInstanceId.isPresent()) {
return trafficExecutor.execute(
@@ -140,7 +140,15 @@ public final class DriverExecutor implements AutoCloseable
{
return sqlFederationEngine.executeQuery(
prepareEngine, getExecuteQueryCallback(database,
queryContext, prepareEngine.getType()), new SQLFederationContext(false,
queryContext, metaData, connection.getProcessId()));
}
- return doExecuteQuery(metaData, database, queryContext, prepareEngine,
statement, columnLabelAndIndexMap, statementReplayCallback);
+ List<QueryResult> queryResults = executePushDownQuery(metaData,
database, queryContext, prepareEngine, statementReplayCallback);
+ MergedResult mergedResult = mergeQuery(metaData, database,
queryResults, queryContext.getSqlStatementContext());
+ boolean selectContainsEnhancedTable =
queryContext.getSqlStatementContext() instanceof SelectStatementContext
+ && ((SelectStatementContext)
queryContext.getSqlStatementContext()).isContainsEnhancedTable();
+ List<ResultSet> resultSets = getResultSets();
+ return new ShardingSphereResultSet(resultSets, mergedResult,
statement, selectContainsEnhancedTable, queryContext.getSqlStatementContext(),
+ null == columnLabelAndIndexMap
+ ?
ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(queryContext.getSqlStatementContext(),
selectContainsEnhancedTable, resultSets.get(0).getMetaData())
+ : columnLabelAndIndexMap);
}
private TrafficExecutorCallback<ResultSet>
getTrafficExecuteQueryCallback(final String jdbcDriverType) {
@@ -155,25 +163,10 @@ public final class DriverExecutor implements
AutoCloseable {
queryContext.getSqlStatementContext().getSqlStatement(),
SQLExecutorExceptionHandler.isExceptionThrown());
}
- @SuppressWarnings("rawtypes")
- private ShardingSphereResultSet doExecuteQuery(final
ShardingSphereMetaData metaData, final ShardingSphereDatabase database, final
QueryContext queryContext,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
final Statement statement,
- final Map<String, Integer>
columnLabelAndIndexMap, final StatementReplayCallback statementReplayCallback)
throws SQLException {
- List<QueryResult> queryResults = executeQuery0(metaData, database,
queryContext, prepareEngine, statementReplayCallback);
- MergedResult mergedResult = mergeQuery(metaData, database,
queryResults, queryContext.getSqlStatementContext());
- boolean selectContainsEnhancedTable =
queryContext.getSqlStatementContext() instanceof SelectStatementContext
- && ((SelectStatementContext)
queryContext.getSqlStatementContext()).isContainsEnhancedTable();
- List<ResultSet> resultSets = getResultSets();
- return new ShardingSphereResultSet(resultSets, mergedResult,
statement, selectContainsEnhancedTable, queryContext.getSqlStatementContext(),
- null == columnLabelAndIndexMap
- ?
ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(queryContext.getSqlStatementContext(),
selectContainsEnhancedTable, resultSets.get(0).getMetaData())
- : columnLabelAndIndexMap);
- }
-
@SuppressWarnings({"rawtypes", "unchecked"})
- private List<QueryResult> executeQuery0(final ShardingSphereMetaData
metaData, final ShardingSphereDatabase database, final QueryContext
queryContext,
- final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
- final StatementReplayCallback
statementReplayCallback) throws SQLException {
+ private List<QueryResult> executePushDownQuery(final
ShardingSphereMetaData metaData, final ShardingSphereDatabase database, final
QueryContext queryContext,
+ final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
+ final
StatementReplayCallback statementReplayCallback) throws SQLException {
ExecutionContext executionContext = createExecutionContext(metaData,
database, queryContext);
if (hasRawExecutionRule(database)) {
return
rawExecutor.execute(createRawExecutionGroupContext(metaData, database,
executionContext),
@@ -191,6 +184,10 @@ public final class DriverExecutor implements AutoCloseable
{
return regularExecutor.executeQuery(executionGroupContext,
queryContext, getExecuteQueryCallback(database, queryContext,
prepareEngine.getType()));
}
+ private boolean hasRawExecutionRule(final ShardingSphereDatabase database)
{
+ return
!database.getRuleMetaData().getAttributes(RawExecutionRuleAttribute.class).isEmpty();
+ }
+
private Collection<Statement> getStatements(final
ExecutionGroup<JDBCExecutionUnit> executionGroup) {
Collection<Statement> result = new LinkedList<>();
for (JDBCExecutionUnit each : executionGroup.getInputs()) {
@@ -221,10 +218,6 @@ public final class DriverExecutor implements AutoCloseable
{
statements.clear();
}
- private boolean hasRawExecutionRule(final ShardingSphereDatabase database)
{
- return
!database.getRuleMetaData().getAttributes(RawExecutionRuleAttribute.class).isEmpty();
- }
-
private ExecutionGroupContext<RawSQLExecutionUnit>
createRawExecutionGroupContext(final ShardingSphereMetaData metaData,
final ShardingSphereDatabase database, final ExecutionContext
executionContext) throws SQLException {
int maxConnectionsSizePerQuery =
metaData.getProps().<Integer>getValue(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY);
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 5f5d9d8443f..f029ee03fd1 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
@@ -223,7 +223,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
handleAutoCommit(queryContext.getSqlStatementContext().getSqlStatement());
ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseName);
findGeneratedKey().ifPresent(optional ->
generatedValues.addAll(optional.getGeneratedValues()));
- currentResultSet =
executor.executeAdvanceQuery(metaDataContexts.getMetaData(), database,
queryContext, createDriverExecutionPrepareEngine(database), this,
columnLabelAndIndexMap,
+ currentResultSet =
executor.executeQuery(metaDataContexts.getMetaData(), database, queryContext,
createDriverExecutionPrepareEngine(database), this, columnLabelAndIndexMap,
(StatementReplayCallback<PreparedStatement>) this::replay);
if (currentResultSet instanceof ShardingSphereResultSet) {
columnLabelAndIndexMap = ((ShardingSphereResultSet)
currentResultSet).getColumnLabelAndIndexMap();
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 bda16fec1d4..1065c068557 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
@@ -151,7 +151,7 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
connection.getDatabaseConnectionManager().getConnectionContext().setCurrentDatabase(databaseName);
ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseName);
sqlStatementContext = queryContext.getSqlStatementContext();
- currentResultSet =
executor.executeAdvanceQuery(metaDataContexts.getMetaData(), database,
queryContext, createDriverExecutionPrepareEngine(database), this, null,
+ currentResultSet =
executor.executeQuery(metaDataContexts.getMetaData(), database, queryContext,
createDriverExecutionPrepareEngine(database), this, null,
(StatementReplayCallback<Statement>) (statements,
parameterSets) -> replay(statements));
statements.addAll(executor.getStatements());
return currentResultSet;