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() {

Reply via email to