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

tuichenchuxin 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 4175bfeb3a0 Optimize broadcast tables route when execute cursor 
statement (#18407)
4175bfeb3a0 is described below

commit 4175bfeb3a0e848a5e24b0645c703ddd17e87f4e
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Jun 17 14:24:24 2022 +0800

    Optimize broadcast tables route when execute cursor statement (#18407)
---
 .../engine/type/ShardingRouteEngineFactory.java    | 11 +++++++----
 .../type/unicast/ShardingUnicastRoutingEngine.java |  8 +++++++-
 .../unicast/ShardingUnicastRoutingEngineTest.java  | 23 ++++++++++++++++------
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
index 3ef2c4f450c..0d141b0c000 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
@@ -121,7 +121,8 @@ public final class ShardingRouteEngineFactory {
             return new ShardingIgnoreRoutingEngine();
         }
         if (sqlStatementContext instanceof CursorAvailable) {
-            return new 
ShardingStandardRoutingEngine(tableNames.iterator().next(), shardingConditions, 
props);
+            return shardingRule.isAllBroadcastTables(shardingRuleTableNames) ? 
new ShardingUnicastRoutingEngine(sqlStatementContext, shardingRuleTableNames)
+                    : new 
ShardingStandardRoutingEngine(shardingRuleTableNames.iterator().next(), 
shardingConditions, props);
         }
         return new ShardingTableBroadcastRoutingEngine(database, 
sqlStatementContext, shardingRuleTableNames);
     }
@@ -151,7 +152,7 @@ public final class ShardingRouteEngineFactory {
                     : new ShardingTableBroadcastRoutingEngine(database, 
sqlStatementContext, shardingRuleTableNames);
         }
         if (!shardingRuleTableNames.isEmpty()) {
-            return new ShardingUnicastRoutingEngine(shardingRuleTableNames);
+            return new ShardingUnicastRoutingEngine(sqlStatementContext, 
shardingRuleTableNames);
         }
         return new ShardingDataSourceGroupBroadcastRoutingEngine();
     }
@@ -184,10 +185,12 @@ public final class ShardingRouteEngineFactory {
                                                            final 
ShardingConditions shardingConditions, final ConfigurationProperties props) {
         Collection<String> tableNames = 
sqlStatementContext.getTablesContext().getTableNames();
         if (shardingRule.isAllBroadcastTables(tableNames)) {
-            return sqlStatementContext.getSqlStatement() instanceof 
SelectStatement ? new ShardingUnicastRoutingEngine(tableNames) : new 
ShardingDatabaseBroadcastRoutingEngine();
+            return sqlStatementContext.getSqlStatement() instanceof 
SelectStatement
+                    ? new ShardingUnicastRoutingEngine(sqlStatementContext, 
tableNames)
+                    : new ShardingDatabaseBroadcastRoutingEngine();
         }
         if (sqlStatementContext.getSqlStatement() instanceof DMLStatement && 
shardingConditions.isAlwaysFalse() || tableNames.isEmpty()) {
-            return new ShardingUnicastRoutingEngine(tableNames);
+            return new ShardingUnicastRoutingEngine(sqlStatementContext, 
tableNames);
         }
         Collection<String> shardingLogicTableNames = 
shardingRule.getShardingLogicTableNames(tableNames);
         if (shardingLogicTableNames.isEmpty()) {
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngine.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngine.java
index dc14fac3e46..8a437495bdb 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngine.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngine.java
@@ -19,6 +19,8 @@ package 
org.apache.shardingsphere.sharding.route.engine.type.unicast;
 
 import com.google.common.collect.Sets;
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.binder.type.CursorAvailable;
 import 
org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
@@ -43,12 +45,16 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 public final class ShardingUnicastRoutingEngine implements ShardingRouteEngine 
{
     
+    private final SQLStatementContext<?> sqlStatementContext;
+    
     private final Collection<String> logicTables;
     
     @Override
     public RouteContext route(final ShardingRule shardingRule) {
         RouteContext result = new RouteContext();
-        String dataSourceName = 
getRandomDataSourceName(shardingRule.getDataSourceNames());
+        String dataSourceName = sqlStatementContext instanceof CursorAvailable
+                ? shardingRule.getDataSourceNames().iterator().next()
+                : getRandomDataSourceName(shardingRule.getDataSourceNames());
         RouteMapper dataSourceMapper = new RouteMapper(dataSourceName, 
dataSourceName);
         if (shardingRule.isAllBroadcastTables(logicTables)) {
             List<RouteMapper> tableMappers = new 
ArrayList<>(logicTables.size());
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngineTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngineTest.java
index 247b94f552d..19e59e4a826 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngineTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngineTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.sharding.route.engine.type.unicast;
 
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.statement.ddl.CursorStatementContext;
 import 
org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
@@ -33,6 +35,7 @@ import java.util.Set;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
 
 public final class ShardingUnicastRoutingEngineTest {
     
@@ -48,7 +51,7 @@ public final class ShardingUnicastRoutingEngineTest {
     
     @Test
     public void assertRoutingForShardingTable() {
-        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(Collections.singleton("t_order"));
+        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(mock(SQLStatementContext.class), 
Collections.singleton("t_order"));
         RouteContext routeContext = unicastRoutingEngine.route(shardingRule);
         assertThat(routeContext.getRouteUnits().size(), is(1));
         
assertFalse("ds_2".equalsIgnoreCase(routeContext.getRouteUnits().iterator().next().getDataSourceMapper().getLogicName()));
@@ -56,14 +59,14 @@ public final class ShardingUnicastRoutingEngineTest {
     
     @Test
     public void assertRoutingForBroadcastTable() {
-        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(Collections.singleton("t_config"));
+        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(mock(SQLStatementContext.class), 
Collections.singleton("t_config"));
         RouteContext routeContext = unicastRoutingEngine.route(shardingRule);
         assertThat(routeContext.getRouteUnits().size(), is(1));
     }
     
     @Test
     public void assertRoutingForNoTable() {
-        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(Collections.emptyList());
+        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(mock(SQLStatementContext.class), 
Collections.emptyList());
         RouteContext routeContext = unicastRoutingEngine.route(shardingRule);
         assertThat(routeContext.getRouteUnits().size(), is(1));
     }
@@ -73,7 +76,7 @@ public final class ShardingUnicastRoutingEngineTest {
         Set<String> sets = new HashSet<>();
         sets.add("t_order");
         sets.add("t_config");
-        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(sets);
+        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(mock(SQLStatementContext.class), sets);
         RouteContext routeContext = unicastRoutingEngine.route(shardingRule);
         assertThat(routeContext.getRouteUnits().size(), is(1));
     }
@@ -84,14 +87,22 @@ public final class ShardingUnicastRoutingEngineTest {
         sets.add("t_order");
         sets.add("t_config");
         sets.add("t_product");
-        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(sets);
+        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(mock(SQLStatementContext.class), sets);
         RouteContext routeContext = unicastRoutingEngine.route(shardingRule);
     }
     
     @Test
     public void assertRoutingForTableWithoutTableRule() {
-        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(Collections.singleton("t_other"));
+        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(mock(SQLStatementContext.class), 
Collections.singleton("t_other"));
         RouteContext routeContext = unicastRoutingEngine.route(shardingRule);
         assertThat(routeContext.getRouteUnits().size(), is(1));
     }
+    
+    @Test
+    public void assertRoutingForBroadcastTableWithCursorStatement() {
+        ShardingUnicastRoutingEngine unicastRoutingEngine = new 
ShardingUnicastRoutingEngine(mock(CursorStatementContext.class), 
Collections.singleton("t_config"));
+        RouteContext actual = unicastRoutingEngine.route(shardingRule);
+        assertThat(actual.getRouteUnits().size(), is(1));
+        
assertThat(actual.getRouteUnits().iterator().next().getDataSourceMapper().getActualName(),
 is("ds_0"));
+    }
 }

Reply via email to