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

duanzhengqiang 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 3454e0a  improve load single table performance (#14031)
3454e0a is described below

commit 3454e0af088f742092b0a7b0ffe2452f1fe55aca
Author: tuichenchuxin <[email protected]>
AuthorDate: Mon Dec 13 10:13:17 2021 +0800

    improve load single table performance (#14031)
    
    * improve load single table performance
    
    * Revert "improve load single table performance"
    
    This reverts commit 62dc927b
    
    * improve load single table performance
    
    * Revert "improve load single table performance"
    
    This reverts commit 8d225001
    
    * Revert "Revert "improve load single table performance""
    
    This reverts commit a5bf33cb
    
    * improve load single table performance
    
    * improve load single table performance
---
 .../singletable/route/SingleTableRouteEngine.java  |  9 +++---
 .../singletable/rule/SingleTableDataNode.java      | 35 ----------------------
 .../rule/SingleTableDataNodeLoader.java            | 18 ++++++-----
 .../singletable/rule/SingleTableRule.java          | 28 ++++++++++-------
 .../route/SingleTableRouteEngineTest.java          | 10 +++----
 .../rule/SingleTableDataNodeLoaderTest.java        | 31 +++++++++----------
 .../singletable/rule/SingleTableRuleTest.java      |  5 ++--
 .../rql/rule/SingleTableQueryResultSet.java        | 12 ++++----
 .../distsql/rql/SingleTableQueryResultSetTest.java | 17 ++++++-----
 9 files changed, 71 insertions(+), 94 deletions(-)

diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableRouteEngine.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableRouteEngine.java
index a377e40..098a5ce 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableRouteEngine.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableRouteEngine.java
@@ -18,11 +18,11 @@
 package org.apache.shardingsphere.singletable.route;
 
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
-import org.apache.shardingsphere.singletable.rule.SingleTableDataNode;
 import org.apache.shardingsphere.singletable.rule.SingleTableRule;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTableStatement;
@@ -121,12 +121,13 @@ public final class SingleTableRouteEngine {
     }
     
     private void fillRouteContext(final SingleTableRule singleTableRule, final 
RouteContext routeContext, final Collection<String> logicTables) {
-        Map<String, SingleTableDataNode> singleTableDataNodes = 
singleTableRule.getSingleTableDataNodes();
+        Map<String, Collection<DataNode>> singleTableDataNodes = 
singleTableRule.getSingleTableDataNodes();
         for (String each : logicTables) {
-            if (!singleTableDataNodes.containsKey(each)) {
+            Collection<DataNode> dataNodes = singleTableDataNodes.get(each);
+            if (null == dataNodes || dataNodes.isEmpty()) {
                 throw new ShardingSphereException("`%s` single table does not 
exist.", each);
             }
-            String dataSource = 
singleTableDataNodes.get(each).getDataSourceName();
+            String dataSource = 
dataNodes.iterator().next().getDataSourceName();
             routeContext.putRouteUnit(new RouteMapper(dataSource, dataSource), 
Collections.singletonList(new RouteMapper(each, each)));
         }
     }
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNode.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNode.java
deleted file mode 100644
index 35b75db..0000000
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNode.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.singletable.rule;
-
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-/**
- * Single table data node.
- */
-@RequiredArgsConstructor
-@Getter
-@EqualsAndHashCode
-public final class SingleTableDataNode {
-    
-    private final String tableName;
-    
-    private final String dataSourceName;
-}
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoader.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoader.java
index 28ae298..42ce68d 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoader.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoader.java
@@ -24,11 +24,13 @@ import 
org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurat
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.loader.SchemaMetaDataLoader;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -49,14 +51,14 @@ public final class SingleTableDataNodeLoader {
      * @param props configuration properties
      * @return single table data node map
      */
-    public static Map<String, SingleTableDataNode> load(final DatabaseType 
databaseType, final Map<String, DataSource> dataSourceMap, 
-                                                        final 
Collection<String> excludedTables, final ConfigurationProperties props) {
-        Map<String, SingleTableDataNode> result = new ConcurrentHashMap<>();
+    public static Map<String, Collection<DataNode>> load(final DatabaseType 
databaseType, final Map<String, DataSource> dataSourceMap,
+                                                         final 
Collection<String> excludedTables, final ConfigurationProperties props) {
+        Map<String, Collection<DataNode>> result = new ConcurrentHashMap<>();
         boolean checkDuplicateTable = 
props.getValue(ConfigurationPropertyKey.CHECK_DUPLICATE_TABLE_ENABLED);
         for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
-            Map<String, SingleTableDataNode> dataNodeMap = load(databaseType, 
entry.getKey(), entry.getValue(), excludedTables);
+            Map<String, DataNode> dataNodeMap = load(databaseType, 
entry.getKey(), entry.getValue(), excludedTables);
             for (String each : dataNodeMap.keySet()) {
-                SingleTableDataNode existDataNode = 
result.putIfAbsent(each.toLowerCase(), dataNodeMap.get(each));
+                Collection<DataNode> existDataNode = 
result.putIfAbsent(each.toLowerCase(), 
Collections.singletonList(dataNodeMap.get(each)));
                 if (checkDuplicateTable) {
                     Preconditions.checkState(null == existDataNode, "Single 
table conflict, there are multiple tables `%s` existed.", each);
                 }
@@ -65,12 +67,12 @@ public final class SingleTableDataNodeLoader {
         return result;
     }
     
-    private static Map<String, SingleTableDataNode> load(final DatabaseType 
databaseType, final String dataSourceName, final DataSource dataSource, final 
Collection<String> excludedTables) {
+    private static Map<String, DataNode> load(final DatabaseType databaseType, 
final String dataSourceName, final DataSource dataSource, final 
Collection<String> excludedTables) {
         Collection<String> tables = loadAllTableNames(databaseType, 
dataSource);
-        Map<String, SingleTableDataNode> result = new HashMap<>(tables.size(), 
1);
+        Map<String, DataNode> result = new HashMap<>(tables.size(), 1);
         for (String each : tables) {
             if (!excludedTables.contains(each)) {
-                result.put(each, new SingleTableDataNode(each, 
dataSourceName));
+                result.put(each, new DataNode(dataSourceName, each));
             }
         }
         return result;
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
index 81e3032..6922c84 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
@@ -54,13 +54,16 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
     
     private final Collection<String> dataSourceNames;
     
-    private final Map<String, SingleTableDataNode> singleTableDataNodes;
+    private final Map<String, Collection<DataNode>> singleTableDataNodes;
+    
+    private final Map<String, String> tableNames;
     
     public SingleTableRule(final SingleTableRuleConfiguration config, final 
DatabaseType databaseType, 
                            final Map<String, DataSource> dataSourceMap, final 
Collection<ShardingSphereRule> builtRules, final ConfigurationProperties props) 
{
         Map<String, DataSource> aggregateDataSourceMap = 
getAggregateDataSourceMap(dataSourceMap, builtRules);
         dataSourceNames = aggregateDataSourceMap.keySet();
         singleTableDataNodes = SingleTableDataNodeLoader.load(databaseType, 
aggregateDataSourceMap, getExcludedTables(builtRules), props);
+        tableNames = 
singleTableDataNodes.entrySet().stream().collect(Collectors.toConcurrentMap(Entry::getKey,
 entry -> entry.getValue().iterator().next().getTableName()));
         config.getDefaultDataSource().ifPresent(op -> defaultDataSource = op);
     }
     
@@ -95,7 +98,7 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
      */
     public boolean isSingleTablesInSameDataSource(final Collection<String> 
singleTableNames) {
         Set<String> dataSourceNames = singleTableNames.stream().map(each -> 
singleTableDataNodes.get(each.toLowerCase()))
-                
.filter(Objects::nonNull).map(SingleTableDataNode::getDataSourceName).collect(Collectors.toSet());
+                .filter(Objects::nonNull).flatMap(each -> 
each.stream().map(DataNode::getDataSourceName)).collect(Collectors.toSet());
         return dataSourceNames.size() <= 1;
     }
     
@@ -110,10 +113,12 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
         if (!isSingleTablesInSameDataSource(singleTableNames)) {
             return false;
         }
-        SingleTableDataNode dataNode = 
singleTableDataNodes.get(singleTableNames.iterator().next().toLowerCase());
-        for (RouteUnit each : routeContext.getRouteUnits()) {
-            if 
(!each.getDataSourceMapper().getLogicName().equals(dataNode.getDataSourceName()))
 {
-                return false;
+        Collection<DataNode> dataNodes = 
singleTableDataNodes.get(singleTableNames.iterator().next().toLowerCase());
+        if (null != dataNodes && !dataNodes.isEmpty()) {
+            for (RouteUnit each : routeContext.getRouteUnits()) {
+                if 
(!each.getDataSourceMapper().getLogicName().equals(dataNodes.iterator().next().getDataSourceName()))
 {
+                    return false;
+                }
             }
         }
         return true;
@@ -147,13 +152,15 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
     @Override
     public void put(final String tableName, final String dataSourceName) {
         if (dataSourceNames.contains(dataSourceName)) {
-            singleTableDataNodes.put(tableName.toLowerCase(), new 
SingleTableDataNode(tableName, dataSourceName));
+            singleTableDataNodes.put(tableName.toLowerCase(), 
Collections.singletonList(new DataNode(dataSourceName, tableName)));
+            tableNames.put(tableName.toLowerCase(), tableName);
         }
     }
     
     @Override
     public void remove(final String tableName) {
         singleTableDataNodes.remove(tableName.toLowerCase());
+        tableNames.remove(tableName.toLowerCase());
     }
     
     private Collection<String> getExcludedTables(final 
Collection<ShardingSphereRule> rules) {
@@ -163,8 +170,7 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
     
     @Override
     public Map<String, Collection<DataNode>> getAllDataNodes() {
-        return singleTableDataNodes.values().stream().map(each -> new 
DataNode(each.getDataSourceName(), each.getTableName()))
-                .collect(Collectors.groupingBy(DataNode::getTableName, 
LinkedHashMap::new, Collectors.toCollection(LinkedList::new)));
+        return singleTableDataNodes;
     }
     
     @Override
@@ -194,12 +200,12 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
     
     @Override
     public Collection<String> getAllTables() {
-        return 
singleTableDataNodes.values().stream().map(SingleTableDataNode::getTableName).collect(Collectors.toList());
+        return tableNames.values();
     }
     
     @Override
     public Collection<String> getTables() {
-        return 
singleTableDataNodes.values().stream().map(SingleTableDataNode::getTableName).collect(Collectors.toList());
+        return tableNames.values();
     }
     
     @Override
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableRouteEngineTest.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableRouteEngineTest.java
index 74103c6..2da47e8 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableRouteEngineTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableRouteEngineTest.java
@@ -19,11 +19,11 @@ package org.apache.shardingsphere.singletable.route;
 
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
 import 
org.apache.shardingsphere.singletable.config.SingleTableRuleConfiguration;
-import org.apache.shardingsphere.singletable.rule.SingleTableDataNode;
 import org.apache.shardingsphere.singletable.rule.SingleTableRule;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl.MySQLCreateTableStatement;
 import org.junit.Test;
@@ -52,8 +52,8 @@ public final class SingleTableRouteEngineTest {
         SingleTableRouteEngine singleTableRouteEngine = new 
SingleTableRouteEngine(Arrays.asList("t_order", "t_order_item"), null);
         SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class),
                 createDataSourceMap(), Collections.emptyList(), new 
ConfigurationProperties(new Properties()));
-        singleTableRule.getSingleTableDataNodes().put("t_order", new 
SingleTableDataNode("t_order", "ds_0"));
-        singleTableRule.getSingleTableDataNodes().put("t_order_item", new 
SingleTableDataNode("t_order_item", "ds_0"));
+        singleTableRule.getSingleTableDataNodes().put("t_order", 
Collections.singletonList(new DataNode("ds_0", "t_order")));
+        singleTableRule.getSingleTableDataNodes().put("t_order_item", 
Collections.singletonList(new DataNode("ds_0", "t_order_item")));
         RouteContext routeContext = new RouteContext();
         singleTableRouteEngine.route(routeContext, singleTableRule);
         List<RouteUnit> routeUnits = new 
ArrayList<>(routeContext.getRouteUnits());
@@ -75,8 +75,8 @@ public final class SingleTableRouteEngineTest {
         SingleTableRouteEngine singleTableRouteEngine = new 
SingleTableRouteEngine(Arrays.asList("t_order", "t_order_item"), null);
         SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class), 
                 createDataSourceMap(), Collections.emptyList(), new 
ConfigurationProperties(new Properties()));
-        singleTableRule.getSingleTableDataNodes().put("t_order", new 
SingleTableDataNode("t_order", "ds_0"));
-        singleTableRule.getSingleTableDataNodes().put("t_order_item", new 
SingleTableDataNode("t_order_item", "ds_1"));
+        singleTableRule.getSingleTableDataNodes().put("t_order", 
Collections.singletonList(new DataNode("ds_0", "t_order")));
+        singleTableRule.getSingleTableDataNodes().put("t_order_item", 
Collections.singletonList(new DataNode("ds_1", "t_order_item")));
         RouteContext routeContext = new RouteContext();
         singleTableRouteEngine.route(routeContext, singleTableRule);
         List<RouteUnit> routeUnits = new 
ArrayList<>(routeContext.getRouteUnits());
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoaderTest.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoaderTest.java
index 3d383f1..700a7e6 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoaderTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableDataNodeLoaderTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.singletable.rule;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -85,35 +86,35 @@ public final class SingleTableDataNodeLoaderTest {
     @Test
     public void assertLoad() {
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
-        Map<String, SingleTableDataNode> dataNodeMap = 
SingleTableDataNodeLoader.load(mock(DatabaseType.class), dataSourceMap, 
Collections.emptyList(), props);
+        Map<String, Collection<DataNode>> dataNodeMap = 
SingleTableDataNodeLoader.load(mock(DatabaseType.class), dataSourceMap, 
Collections.emptyList(), props);
         assertTrue(dataNodeMap.containsKey("employee"));
         assertTrue(dataNodeMap.containsKey("dept"));
         assertTrue(dataNodeMap.containsKey("salary"));
         assertTrue(dataNodeMap.containsKey("student"));
         assertTrue(dataNodeMap.containsKey("teacher"));
         assertTrue(dataNodeMap.containsKey("class"));
-        assertThat(dataNodeMap.get("employee").getDataSourceName(), is("ds0"));
-        assertThat(dataNodeMap.get("dept").getDataSourceName(), is("ds0"));
-        assertThat(dataNodeMap.get("salary").getDataSourceName(), is("ds0"));
-        assertThat(dataNodeMap.get("student").getDataSourceName(), is("ds1"));
-        assertThat(dataNodeMap.get("teacher").getDataSourceName(), is("ds1"));
-        assertThat(dataNodeMap.get("class").getDataSourceName(), is("ds1"));
+        
assertThat(dataNodeMap.get("employee").iterator().next().getDataSourceName(), 
is("ds0"));
+        
assertThat(dataNodeMap.get("dept").iterator().next().getDataSourceName(), 
is("ds0"));
+        
assertThat(dataNodeMap.get("salary").iterator().next().getDataSourceName(), 
is("ds0"));
+        
assertThat(dataNodeMap.get("student").iterator().next().getDataSourceName(), 
is("ds1"));
+        
assertThat(dataNodeMap.get("teacher").iterator().next().getDataSourceName(), 
is("ds1"));
+        
assertThat(dataNodeMap.get("class").iterator().next().getDataSourceName(), 
is("ds1"));
     }
     
     @Test
     public void assertLoadWithExcludeTables() {
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
         Collection<String> excludedTables = Arrays.asList("salary", 
"employee", "student");
-        Map<String, SingleTableDataNode> dataNodeMap = 
SingleTableDataNodeLoader.load(mock(DatabaseType.class), dataSourceMap, 
excludedTables, props);
+        Map<String, Collection<DataNode>> dataNodeMap = 
SingleTableDataNodeLoader.load(mock(DatabaseType.class), dataSourceMap, 
excludedTables, props);
         assertFalse(dataNodeMap.containsKey("employee"));
         assertFalse(dataNodeMap.containsKey("salary"));
         assertFalse(dataNodeMap.containsKey("student"));
         assertTrue(dataNodeMap.containsKey("dept"));
         assertTrue(dataNodeMap.containsKey("teacher"));
         assertTrue(dataNodeMap.containsKey("class"));
-        assertThat(dataNodeMap.get("dept").getDataSourceName(), is("ds0"));
-        assertThat(dataNodeMap.get("teacher").getDataSourceName(), is("ds1"));
-        assertThat(dataNodeMap.get("class").getDataSourceName(), is("ds1"));
+        
assertThat(dataNodeMap.get("dept").iterator().next().getDataSourceName(), 
is("ds0"));
+        
assertThat(dataNodeMap.get("teacher").iterator().next().getDataSourceName(), 
is("ds1"));
+        
assertThat(dataNodeMap.get("class").iterator().next().getDataSourceName(), 
is("ds1"));
     }
     
     @Test(expected = IllegalStateException.class)
@@ -130,15 +131,15 @@ public final class SingleTableDataNodeLoaderTest {
         
properties.setProperty(ConfigurationPropertyKey.CHECK_DUPLICATE_TABLE_ENABLED.getKey(),
 "true");
         Collection<String> excludedTables = Arrays.asList("salary", 
"employee", "student");
         ConfigurationProperties props = new 
ConfigurationProperties(properties);
-        Map<String, SingleTableDataNode> dataNodeMap = 
SingleTableDataNodeLoader.load(mock(DatabaseType.class), dataSourceMap, 
excludedTables, props);
+        Map<String, Collection<DataNode>> dataNodeMap = 
SingleTableDataNodeLoader.load(mock(DatabaseType.class), dataSourceMap, 
excludedTables, props);
         assertFalse(dataNodeMap.containsKey("employee"));
         assertFalse(dataNodeMap.containsKey("salary"));
         assertFalse(dataNodeMap.containsKey("student"));
         assertTrue(dataNodeMap.containsKey("dept"));
         assertTrue(dataNodeMap.containsKey("teacher"));
         assertTrue(dataNodeMap.containsKey("class"));
-        assertThat(dataNodeMap.get("dept").getDataSourceName(), is("ds0"));
-        assertThat(dataNodeMap.get("teacher").getDataSourceName(), is("ds1"));
-        assertThat(dataNodeMap.get("class").getDataSourceName(), is("ds1"));
+        
assertThat(dataNodeMap.get("dept").iterator().next().getDataSourceName(), 
is("ds0"));
+        
assertThat(dataNodeMap.get("teacher").iterator().next().getDataSourceName(), 
is("ds1"));
+        
assertThat(dataNodeMap.get("class").iterator().next().getDataSourceName(), 
is("ds1"));
     }
 }
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableRuleTest.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableRuleTest.java
index 9cd1881..a8a55b1 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableRuleTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/rule/SingleTableRuleTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.singletable.rule;
 
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import 
org.apache.shardingsphere.singletable.config.SingleTableRuleConfiguration;
 import org.junit.Before;
@@ -92,7 +93,7 @@ public final class SingleTableRuleTest {
         
when(dataNodeContainedRule.getAllTables()).thenReturn(Arrays.asList("t_order", 
"t_order_0", "t_order_1"));
         SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class), dataSourceMap, 
                 Collections.singletonList(dataNodeContainedRule), new 
ConfigurationProperties(new Properties()));
-        Map<String, SingleTableDataNode> actual = 
singleTableRule.getSingleTableDataNodes();
+        Map<String, Collection<DataNode>> actual = 
singleTableRule.getSingleTableDataNodes();
         assertThat(actual.size(), is(2));
         assertTrue(actual.containsKey("employee"));
         assertTrue(actual.containsKey("student"));
@@ -104,7 +105,7 @@ public final class SingleTableRuleTest {
         
when(dataNodeContainedRule.getAllTables()).thenReturn(Arrays.asList("T_ORDER", 
"T_ORDER_0", "T_ORDER_1"));
         SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class), dataSourceMap,
                 Collections.singletonList(dataNodeContainedRule), new 
ConfigurationProperties(new Properties()));
-        Map<String, SingleTableDataNode> actual = 
singleTableRule.getSingleTableDataNodes();
+        Map<String, Collection<DataNode>> actual = 
singleTableRule.getSingleTableDataNodes();
         assertThat(actual.size(), is(2));
         assertTrue(actual.containsKey("employee"));
         assertTrue(actual.containsKey("student"));
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/rule/SingleTableQueryResultSet.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/rule/SingleTableQueryResultSet.java
index b7f5cc7..f57bbba 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/rule/SingleTableQueryResultSet.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/rule/SingleTableQueryResultSet.java
@@ -18,9 +18,9 @@
 package org.apache.shardingsphere.proxy.backend.text.distsql.rql.rule;
 
 import 
org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowSingleTableStatement;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.distsql.query.DistSQLResultSet;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import org.apache.shardingsphere.singletable.rule.SingleTableDataNode;
 import org.apache.shardingsphere.singletable.rule.SingleTableRule;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
@@ -29,7 +29,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
-import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -38,13 +38,13 @@ import java.util.stream.Stream;
  */
 public final class SingleTableQueryResultSet implements DistSQLResultSet {
     
-    private Iterator<SingleTableDataNode> data = Collections.emptyIterator();
+    private Iterator<DataNode> data = Collections.emptyIterator();
     
     @Override
     public void init(final ShardingSphereMetaData metaData, final SQLStatement 
sqlStatement) {
         ShowSingleTableStatement showSingleTableStatement = 
(ShowSingleTableStatement) sqlStatement;
-        Stream<SingleTableDataNode> singleTableRules = 
metaData.getRuleMetaData().getRules().stream().filter(each -> each instanceof 
SingleTableRule)
-                .map(each -> (SingleTableRule) each).map(each -> 
each.getSingleTableDataNodes().entrySet()).flatMap(Collection::stream).map(Entry::getValue);
+        Stream<DataNode> singleTableRules = 
metaData.getRuleMetaData().getRules().stream().filter(each -> each instanceof 
SingleTableRule)
+                .map(each -> (SingleTableRule) each).map(each -> 
each.getSingleTableDataNodes().values()).flatMap(Collection::stream).filter(Objects::nonNull).map(each
 -> each.iterator().next());
         if (null != showSingleTableStatement.getTableName()) {
             singleTableRules = singleTableRules.filter(each -> 
showSingleTableStatement.getTableName().equals(each.getTableName()));
         }
@@ -63,7 +63,7 @@ public final class SingleTableQueryResultSet implements 
DistSQLResultSet {
     
     @Override
     public Collection<Object> getRowData() {
-        SingleTableDataNode next = data.next();
+        DataNode next = data.next();
         return Arrays.asList(next.getTableName(), next.getDataSourceName());
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/SingleTableQueryResultSetTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/SingleTableQueryResultSetTest.java
index 7c00df0..a0cfb79 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/SingleTableQueryResultSetTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rql/SingleTableQueryResultSetTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.text.distsql.rql;
 
 import 
org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowSingleTableStatement;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.distsql.query.DistSQLResultSet;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
@@ -25,7 +26,6 @@ import 
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.proxy.backend.text.distsql.rql.rule.SingleTableQueryResultSet;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
-import org.apache.shardingsphere.singletable.rule.SingleTableDataNode;
 import org.apache.shardingsphere.singletable.rule.SingleTableRule;
 import org.junit.Before;
 import org.junit.Test;
@@ -35,6 +35,7 @@ import org.mockito.junit.MockitoJUnitRunner;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -53,9 +54,9 @@ public final class SingleTableQueryResultSetTest {
     
     @Before
     public void before() {
-        Map<String, SingleTableDataNode> singleTableDataNodeMap = new 
HashMap<>();
-        singleTableDataNodeMap.put("t_order", new 
SingleTableDataNode("t_order", "ds_1"));
-        singleTableDataNodeMap.put("t_order_item", new 
SingleTableDataNode("t_order_item", "ds_2"));
+        Map<String, Collection<DataNode>> singleTableDataNodeMap = new 
HashMap<>();
+        singleTableDataNodeMap.put("t_order", Collections.singletonList(new 
DataNode("ds_1", "t_order")));
+        singleTableDataNodeMap.put("t_order_item", 
Collections.singletonList(new DataNode("ds_2", "t_order_item")));
         Collection<ShardingSphereRule> rules = new LinkedList<>();
         rules.add(mockSingleTableRule(singleTableDataNodeMap));
         ShardingSphereRuleMetaData ruleMetaData = 
mock(ShardingSphereRuleMetaData.class);
@@ -81,9 +82,9 @@ public final class SingleTableQueryResultSetTest {
     
     @Test
     public void assertGetRowDataMultipleRules() {
-        Map<String, SingleTableDataNode> singleTableDataNodeMap = new 
HashMap<>();
-        singleTableDataNodeMap.put("t_order_multiple", new 
SingleTableDataNode("t_order_multiple", "ds_1_multiple"));
-        singleTableDataNodeMap.put("t_order_item_multiple", new 
SingleTableDataNode("t_order_item_multiple", "ds_2_multiple"));
+        Map<String, Collection<DataNode>> singleTableDataNodeMap = new 
HashMap<>();
+        singleTableDataNodeMap.put("t_order_multiple", 
Collections.singletonList(new DataNode("ds_1_multiple", "t_order_multiple")));
+        singleTableDataNodeMap.put("t_order_item_multiple", 
Collections.singletonList(new DataNode("ds_2_multiple", 
"t_order_item_multiple")));
         addShardingSphereRule(mockSingleTableRule(singleTableDataNodeMap));
         DistSQLResultSet resultSet = new SingleTableQueryResultSet();
         resultSet.init(shardingSphereMetaData, 
mock(ShowSingleTableStatement.class));
@@ -126,7 +127,7 @@ public final class SingleTableQueryResultSetTest {
         assertThat(rowData.next(), is("ds_1"));
     }
     
-    private SingleTableRule mockSingleTableRule(final Map<String, 
SingleTableDataNode> singleTableDataNodeMap) {
+    private SingleTableRule mockSingleTableRule(final Map<String, 
Collection<DataNode>> singleTableDataNodeMap) {
         SingleTableRule singleTableRule = mock(SingleTableRule.class);
         
when(singleTableRule.getSingleTableDataNodes()).thenReturn(singleTableDataNodeMap);
         return singleTableRule;

Reply via email to