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"));
+ }
}