You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by tu...@apache.org on 2022/06/17 06:24:31 UTC

[shardingsphere] branch master updated: Optimize broadcast tables route when execute cursor statement (#18407)

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 <du...@apache.org>
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"));
+    }
 }