This is an automated email from the ASF dual-hosted git repository.
zhangyonglun 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 78582d7 Refactor SingleTableRoutingEngine (#8898)
78582d7 is described below
commit 78582d7e020ec742f7d5f1dc71146d1bb06bfc40
Author: Juan Pan(Trista) <[email protected]>
AuthorDate: Fri Jan 8 14:07:03 2021 +0800
Refactor SingleTableRoutingEngine (#8898)
* Refactor SingleTableRoutingEngine
* add unit test
---
.../type/single/SingleTableRoutingEngine.java | 44 +++++++++++++++-------
.../type/single/SingleTableRoutingEngineTest.java | 32 +++++++++++++---
2 files changed, 58 insertions(+), 18 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/single/SingleTableRoutingEngine.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/single/SingleTableRoutingEngine.java
index 8ff8178..b562af4 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/single/SingleTableRoutingEngine.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/single/SingleTableRoutingEngine.java
@@ -29,8 +29,10 @@ import
org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
@@ -46,25 +48,41 @@ public final class SingleTableRoutingEngine implements
ShardingRouteEngine {
@Override
public void route(final RouteContext routeContext, final ShardingRule
shardingRule) {
- Optional<String> dataSourceName = sqlStatement instanceof
CreateTableStatement ?
getRandomDataSourceName(shardingRule.getDataSourceNames()) :
findDataSourceNameOfSingleTable(shardingRule);
- if (!dataSourceName.isPresent()) {
- throw new ShardingSphereException("Can not route tables for `%s`,
please make sure the tables are in same schema.", logicTables);
+ if (sqlStatement instanceof CreateTableStatement) {
+ routeContext.getRouteUnits().add(getRandomRouteUnit(shardingRule));
+ } else {
+ Collection<RouteUnit> routeUnits =
getTargetRouteUnits(shardingRule);
+ routeContext.getRouteUnits().addAll(routeUnits);
+ if (1 < routeUnits.size()) {
+ routeContext.setToCalcite(true);
+ }
}
- List<RouteMapper> routingTables = logicTables.stream().map(table ->
new RouteMapper(table, table)).collect(Collectors.toList());
- routeContext.getRouteUnits().add(new RouteUnit(new
RouteMapper(dataSourceName.get(), dataSourceName.get()), routingTables));
}
- private Optional<String> getRandomDataSourceName(final Collection<String>
dataSourceNames) {
- String dataSourceName =
Lists.newArrayList(dataSourceNames).get(ThreadLocalRandom.current().nextInt(dataSourceNames.size()));
- return Optional.of(dataSourceName);
+ private RouteUnit getRandomRouteUnit(final ShardingRule shardingRule) {
+ Collection<String> dataSourceNames = shardingRule.getDataSourceNames();
+ String dataSource =
Lists.newArrayList(dataSourceNames).get(ThreadLocalRandom.current().nextInt(dataSourceNames.size()));
+ String table = logicTables.iterator().next();
+ return new RouteUnit(new RouteMapper(dataSource, dataSource),
Collections.singletonList(new RouteMapper(table, table)));
}
- private Optional<String> findDataSourceNameOfSingleTable(final
ShardingRule shardingRule) {
+ private Collection<RouteUnit> getTargetRouteUnits(final ShardingRule
shardingRule) {
+ Map<RouteMapper, Collection<RouteMapper>> result = new
LinkedHashMap<>();
for (String each : logicTables) {
if (shardingRule.getSingleTableRules().containsKey(each)) {
- return
Optional.of(shardingRule.getSingleTableRules().get(each).getDataSourceName());
+ fillRouteUnits(each,
shardingRule.getSingleTableRules().get(each).getDataSourceName(), result);
+ } else {
+ throw new ShardingSphereException("`%s` single table does not
exist.", each);
}
}
- return Optional.empty();
+ return result.entrySet().stream().map(entry -> new
RouteUnit(entry.getKey(), entry.getValue())).collect(Collectors.toList());
+ }
+
+ private void fillRouteUnits(final String each, final String dataSource,
final Map<RouteMapper, Collection<RouteMapper>> routeMappers) {
+ RouteMapper dataSourceMapper = new RouteMapper(dataSource, dataSource);
+ if (!routeMappers.containsKey(dataSourceMapper)) {
+ routeMappers.put(dataSourceMapper, new LinkedHashSet<>());
+ }
+ routeMappers.get(dataSourceMapper).add(new RouteMapper(each, each));
}
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/single/SingleTableRoutingEngineTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/single/SingleTableRoutingEngineTest.java
index cffbce3..d1169a9 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/single/SingleTableRoutingEngineTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/single/SingleTableRoutingEngineTest.java
@@ -43,7 +43,7 @@ import static org.mockito.Mockito.mock;
public final class SingleTableRoutingEngineTest {
@Test
- public void assertRoute() {
+ public void assertRouteInSameDataSource() {
SingleTableRoutingEngine singleTableRoutingEngine = new
SingleTableRoutingEngine(Arrays.asList("t_order", "t_order_item"), null);
ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
ShardingRule shardingRule = new ShardingRule(shardingRuleConfig,
mock(DatabaseType.class), createDataSourceMap());
@@ -62,6 +62,31 @@ public final class SingleTableRoutingEngineTest {
RouteMapper tableMapper1 = tableMappers.next();
assertThat(tableMapper1.getActualName(), is("t_order_item"));
assertThat(tableMapper1.getLogicName(), is("t_order_item"));
+ assertThat(routeContext.isToCalcite(), is(false));
+ }
+
+ @Test
+ public void assertRouteInDifferentDataSource() {
+ SingleTableRoutingEngine singleTableRoutingEngine = new
SingleTableRoutingEngine(Arrays.asList("t_order", "t_order_item"), null);
+ ShardingRuleConfiguration shardingRuleConfig = new
ShardingRuleConfiguration();
+ ShardingRule shardingRule = new ShardingRule(shardingRuleConfig,
mock(DatabaseType.class), createDataSourceMap());
+ shardingRule.getSingleTableRules().put("t_order", new
SingleTableRule("t_order", "ds_0"));
+ shardingRule.getSingleTableRules().put("t_order_item", new
SingleTableRule("t_order_item", "ds_1"));
+ RouteContext routeContext = new RouteContext();
+ singleTableRoutingEngine.route(routeContext, shardingRule);
+ List<RouteUnit> routeUnits = new
ArrayList<>(routeContext.getRouteUnits());
+ assertThat(routeContext.getRouteUnits().size(), is(2));
+ assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(),
is("ds_0"));
+ assertThat(routeUnits.get(0).getTableMappers().size(), is(1));
+ RouteMapper tableMapper0 =
routeUnits.get(0).getTableMappers().iterator().next();
+ assertThat(tableMapper0.getActualName(), is("t_order"));
+ assertThat(tableMapper0.getLogicName(), is("t_order"));
+ assertThat(routeUnits.get(1).getDataSourceMapper().getActualName(),
is("ds_1"));
+ assertThat(routeUnits.get(1).getTableMappers().size(), is(1));
+ RouteMapper tableMapper1 =
routeUnits.get(1).getTableMappers().iterator().next();
+ assertThat(tableMapper1.getActualName(), is("t_order_item"));
+ assertThat(tableMapper1.getLogicName(), is("t_order_item"));
+ assertThat(routeContext.isToCalcite(), is(true));
}
@Test
@@ -73,14 +98,11 @@ public final class SingleTableRoutingEngineTest {
singleTableRoutingEngine.route(routeContext, shardingRule);
List<RouteUnit> routeUnits = new
ArrayList<>(routeContext.getRouteUnits());
assertThat(routeContext.getRouteUnits().size(), is(1));
- assertThat(routeUnits.get(0).getTableMappers().size(), is(2));
+ assertThat(routeUnits.get(0).getTableMappers().size(), is(1));
Iterator<RouteMapper> tableMappers =
routeUnits.get(0).getTableMappers().iterator();
RouteMapper tableMapper0 = tableMappers.next();
assertThat(tableMapper0.getActualName(), is("t_order"));
assertThat(tableMapper0.getLogicName(), is("t_order"));
- RouteMapper tableMapper1 = tableMappers.next();
- assertThat(tableMapper1.getActualName(), is("t_order_item"));
- assertThat(tableMapper1.getLogicName(), is("t_order_item"));
}
private Map<String, DataSource> createDataSourceMap() {