You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/04/27 08:48:16 UTC

[shardingsphere] branch master updated: refactor ShardingUnicastRoutingEngine (#10203)

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

panjuan 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 348d9a0  refactor ShardingUnicastRoutingEngine (#10203)
348d9a0 is described below

commit 348d9a0b6f0063df6111b32b2ce363000c3bce20
Author: MingxingLAI <80...@users.noreply.github.com>
AuthorDate: Tue Apr 27 16:47:38 2021 +0800

    refactor ShardingUnicastRoutingEngine (#10203)
    
    * Using stream replace for loop in ShardingUnicastRoutingEngine
    
    * Extracting multiple tables route in ShardingUnicastRoutingEngine to an independent function
    
    * Using stream to replace forloop for reducing the complexity of the function
    
    * Eliminating availableDatasourceNames may throw a NullPointerException warning
---
 .../type/unicast/ShardingUnicastRoutingEngine.java | 52 +++++++++++-----------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngine.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngine.java
index 882a10c..632d5ec 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngine.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-route/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/unicast/ShardingUnicastRoutingEngine.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.sharding.route.engine.type.unicast;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import java.util.stream.Collectors;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
 import org.apache.shardingsphere.infra.datanode.DataNode;
@@ -50,10 +51,7 @@ public final class ShardingUnicastRoutingEngine implements ShardingRouteEngine {
         String dataSourceName = getRandomDataSourceName(shardingRule.getDataSourceNames());
         RouteMapper dataSourceMapper = new RouteMapper(dataSourceName, dataSourceName);
         if (shardingRule.isAllBroadcastTables(logicTables)) {
-            List<RouteMapper> tableMappers = new ArrayList<>(logicTables.size());
-            for (String each : logicTables) {
-                tableMappers.add(new RouteMapper(each, each));
-            }
+            List<RouteMapper> tableMappers = logicTables.stream().map(each -> new RouteMapper(each, each)).collect(Collectors.toCollection(() -> new ArrayList<>(logicTables.size())));
             routeContext.getRouteUnits().add(new RouteUnit(dataSourceMapper, tableMappers));
         } else if (logicTables.isEmpty()) {
             routeContext.getRouteUnits().add(new RouteUnit(dataSourceMapper, Collections.emptyList()));
@@ -67,30 +65,32 @@ public final class ShardingUnicastRoutingEngine implements ShardingRouteEngine {
             routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper(dataNode.getDataSourceName(), dataNode.getDataSourceName()),
                     Collections.singletonList(new RouteMapper(logicTableName, dataNode.getTableName()))));
         } else {
-            List<RouteMapper> tableMappers = new ArrayList<>(logicTables.size());
-            Set<String> availableDatasourceNames = null;
-            boolean first = true;
-            for (String each : logicTables) {
-                TableRule tableRule = shardingRule.getTableRule(each);
-                DataNode dataNode = tableRule.getActualDataNodes().get(0);
-                tableMappers.add(new RouteMapper(each, dataNode.getTableName()));
-                Set<String> currentDataSourceNames = new HashSet<>(tableRule.getActualDatasourceNames().size());
-                for (DataNode eachDataNode : tableRule.getActualDataNodes()) {
-                    currentDataSourceNames.add(eachDataNode.getDataSourceName());
-                }
-                if (first) {
-                    availableDatasourceNames = currentDataSourceNames;
-                    first = false;
-                } else {
-                    availableDatasourceNames = Sets.intersection(availableDatasourceNames, currentDataSourceNames);
-                }
-            }
-            if (availableDatasourceNames.isEmpty()) {
-                throw new ShardingSphereConfigurationException("Cannot find actual datasource intersection for logic tables: %s", logicTables);
+            routeWithMultipleTables(routeContext, shardingRule);
+        }
+    }
+
+    private void routeWithMultipleTables(final RouteContext routeContext, final ShardingRule shardingRule) throws ShardingSphereConfigurationException {
+        List<RouteMapper> tableMappers = new ArrayList<>(logicTables.size());
+        Set<String> availableDatasourceNames = Collections.emptySet();
+        boolean first = true;
+        for (String each : logicTables) {
+            TableRule tableRule = shardingRule.getTableRule(each);
+            DataNode dataNode = tableRule.getActualDataNodes().get(0);
+            tableMappers.add(new RouteMapper(each, dataNode.getTableName()));
+            Set<String> currentDataSourceNames = tableRule.getActualDataNodes().stream().map(DataNode::getDataSourceName).collect(
+                    Collectors.toCollection(() -> new HashSet<>(tableRule.getActualDatasourceNames().size())));
+            if (first) {
+                availableDatasourceNames = currentDataSourceNames;
+                first = false;
+            } else {
+                availableDatasourceNames = Sets.intersection(availableDatasourceNames, currentDataSourceNames);
             }
-            dataSourceName = getRandomDataSourceName(availableDatasourceNames);
-            routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper(dataSourceName, dataSourceName), tableMappers));
         }
+        if (availableDatasourceNames.isEmpty()) {
+            throw new ShardingSphereConfigurationException("Cannot find actual datasource intersection for logic tables: %s", logicTables);
+        }
+        String dataSourceName = getRandomDataSourceName(availableDatasourceNames);
+        routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper(dataSourceName, dataSourceName), tableMappers));
     }
     
     private String getRandomDataSourceName(final Collection<String> dataSourceNames) {