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

duanzhengqiang 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 767190437bf Add ShardingSphereResultSetFactory (#31640)
767190437bf is described below

commit 767190437bf67cb0e3cc3e14ecbcc9613ee0efe5
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Jun 9 17:05:31 2024 +0800

    Add ShardingSphereResultSetFactory (#31640)
---
 .../DriverPushDownExecuteQueryExecutor.java        | 36 ++-------
 .../resultset/ShardingSphereResultSetFactory.java  | 86 ++++++++++++++++++++++
 2 files changed, 91 insertions(+), 31 deletions(-)

diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/DriverPushDownExecuteQueryExecutor.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/DriverPushDownExecuteQueryExecutor.java
index e04785bc486..3b13ef7deda 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/DriverPushDownExecuteQueryExecutor.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/DriverPushDownExecuteQueryExecutor.java
@@ -22,8 +22,7 @@ import 
org.apache.shardingsphere.driver.executor.callback.execute.ExecuteQueryCa
 import 
org.apache.shardingsphere.driver.executor.callback.replay.StatementReplayCallback;
 import 
org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
 import 
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet;
-import 
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSetUtils;
-import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSetFactory;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
@@ -42,8 +41,6 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecuti
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriverType;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.raw.RawExecutionPrepareEngine;
 import org.apache.shardingsphere.infra.executor.sql.process.ProcessEngine;
-import org.apache.shardingsphere.infra.merge.MergeEngine;
-import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
@@ -53,10 +50,8 @@ import 
org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 
 import java.sql.Connection;
-import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -111,23 +106,18 @@ public final class DriverPushDownExecuteQueryExecutor {
                                                 final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
final Statement statement,
                                                 final Map<String, Integer> 
columnLabelAndIndexMap,
                                                 final StatementAddCallback 
addCallback, final StatementReplayCallback replayCallback) throws SQLException {
-        statements.clear();
         List<QueryResult> queryResults = getQueryResults(database, 
queryContext, prepareEngine, addCallback, replayCallback);
-        MergedResult mergedResult = mergeQuery(database, queryResults, 
queryContext.getSqlStatementContext());
         boolean isContainsEnhancedTable = 
queryContext.getSqlStatementContext() instanceof SelectStatementContext
                 && ((SelectStatementContext) 
queryContext.getSqlStatementContext()).isContainsEnhancedTable();
-        List<ResultSet> resultSets = getResultSets();
-        return new ShardingSphereResultSet(resultSets, mergedResult, 
statement, isContainsEnhancedTable, queryContext.getSqlStatementContext(),
-                null == columnLabelAndIndexMap
-                        ? 
ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(queryContext.getSqlStatementContext(),
 isContainsEnhancedTable, resultSets.get(0).getMetaData())
-                        : columnLabelAndIndexMap);
+        return new ShardingSphereResultSetFactory(connectionContext, 
globalRuleMetaData, props, statements)
+                .newInstance(database, queryContext, queryResults, statement, 
columnLabelAndIndexMap, isContainsEnhancedTable);
     }
     
     @SuppressWarnings("rawtypes")
     private List<QueryResult> getQueryResults(final ShardingSphereDatabase 
database, final QueryContext queryContext, final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
                                               final StatementAddCallback 
addCallback, final StatementReplayCallback replayCallback) throws SQLException {
-        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(
-                queryContext, database, globalRuleMetaData, props, 
connectionContext);
+        statements.clear();
+        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(queryContext, database, 
globalRuleMetaData, props, connectionContext);
         return 
database.getRuleMetaData().getAttributes(RawExecutionRuleAttribute.class).isEmpty()
                 ? getJDBCQueryResults(database, queryContext, prepareEngine, 
addCallback, replayCallback, executionContext)
                 : getRawQueryResults(database, queryContext, executionContext);
@@ -181,20 +171,4 @@ public final class DriverPushDownExecuteQueryExecutor {
         return new RawExecutionPrepareEngine(maxConnectionsSizePerQuery, 
database.getRuleMetaData().getRules()).prepare(
                 executionContext.getRouteContext(), 
executionContext.getExecutionUnits(), new 
ExecutionGroupReportContext(processId, database.getName(), new Grantee("", 
"")));
     }
-    
-    private MergedResult mergeQuery(final ShardingSphereDatabase database, 
final List<QueryResult> queryResults, final SQLStatementContext 
sqlStatementContext) throws SQLException {
-        MergeEngine mergeEngine = new MergeEngine(globalRuleMetaData, 
database, props, connectionContext);
-        return mergeEngine.merge(queryResults, sqlStatementContext);
-    }
-    
-    @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
-    private List<ResultSet> getResultSets() throws SQLException {
-        List<ResultSet> result = new ArrayList<>(statements.size());
-        for (Statement each : statements) {
-            if (null != each.getResultSet()) {
-                result.add(each.getResultSet());
-            }
-        }
-        return result;
-    }
 }
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java
new file mode 100644
index 00000000000..b3ded021ae3
--- /dev/null
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java
@@ -0,0 +1,86 @@
+/*
+ * 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.driver.jdbc.core.resultset;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
+import org.apache.shardingsphere.infra.merge.MergeEngine;
+import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * ShardingSphere result set factory.
+ */
+@HighFrequencyInvocation
+@RequiredArgsConstructor
+public final class ShardingSphereResultSetFactory {
+    
+    private final ConnectionContext connectionContext;
+    
+    private final RuleMetaData globalRuleMetaData;
+    
+    private final ConfigurationProperties props;
+    
+    private final Collection<Statement> statements;
+    
+    /**
+     * Create new instance of shardingSphere result set.
+     * 
+     * @param database database
+     * @param queryContext query context
+     * @param queryResults query results
+     * @param statement statement
+     * @param columnLabelAndIndexMap column label and index map
+     * @param isContainsEnhancedTable is contains enhanced table
+     * @return created instance
+     * @throws SQLException SQL exception
+     */
+    public ShardingSphereResultSet newInstance(final ShardingSphereDatabase 
database, final QueryContext queryContext, final List<QueryResult> 
queryResults, final Statement statement,
+                                               final Map<String, Integer> 
columnLabelAndIndexMap, final boolean isContainsEnhancedTable) throws 
SQLException {
+        List<ResultSet> resultSets = getResultSets();
+        MergedResult mergedResult = new MergeEngine(globalRuleMetaData, 
database, props, connectionContext).merge(queryResults, 
queryContext.getSqlStatementContext());
+        return new ShardingSphereResultSet(resultSets, mergedResult, 
statement, isContainsEnhancedTable, queryContext.getSqlStatementContext(),
+                null == columnLabelAndIndexMap
+                        ? 
ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(queryContext.getSqlStatementContext(),
 isContainsEnhancedTable, resultSets.get(0).getMetaData())
+                        : columnLabelAndIndexMap);
+    }
+    
+    @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed")
+    private List<ResultSet> getResultSets() throws SQLException {
+        List<ResultSet> result = new ArrayList<>(statements.size());
+        for (Statement each : statements) {
+            if (null != each.getResultSet()) {
+                result.add(each.getResultSet());
+            }
+        }
+        return result;
+    }
+}

Reply via email to