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 f643907  support case-insensitive for single table (#14097)
f643907 is described below

commit f643907c44816f21a78572e7dec7f5b2f71e4321
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Dec 15 21:05:17 2021 +0800

    support case-insensitive for single table (#14097)
---
 .../singletable/route/SingleTableRouteEngine.java  |  8 +++---
 .../singletable/rule/SingleTableRule.java          | 32 ++++++++++++++--------
 .../singletable/rule/SingleTableRuleTest.java      | 23 ++++++++++++++++
 3 files changed, 48 insertions(+), 15 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 098a5ce..f2ac264 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
@@ -35,6 +35,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -121,13 +122,12 @@ public final class SingleTableRouteEngine {
     }
     
     private void fillRouteContext(final SingleTableRule singleTableRule, final 
RouteContext routeContext, final Collection<String> logicTables) {
-        Map<String, Collection<DataNode>> singleTableDataNodes = 
singleTableRule.getSingleTableDataNodes();
         for (String each : logicTables) {
-            Collection<DataNode> dataNodes = singleTableDataNodes.get(each);
-            if (null == dataNodes || dataNodes.isEmpty()) {
+            Optional<DataNode> dataNode = 
singleTableRule.findSingleTableDataNode(each);
+            if (!dataNode.isPresent()) {
                 throw new ShardingSphereException("`%s` single table does not 
exist.", each);
             }
-            String dataSource = 
dataNodes.iterator().next().getDataSourceName();
+            String dataSource = dataNode.get().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/SingleTableRule.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/rule/SingleTableRule.java
index 6922c84..aa773c3 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
@@ -64,7 +64,7 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
         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);
+        config.getDefaultDataSource().ifPresent(optional -> defaultDataSource 
= optional);
     }
     
     private Map<String, DataSource> getAggregateDataSourceMap(final 
Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> 
builtRules) {
@@ -97,8 +97,8 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
      * @return whether single tables are in same data source or not
      */
     public boolean isSingleTablesInSameDataSource(final Collection<String> 
singleTableNames) {
-        Set<String> dataSourceNames = singleTableNames.stream().map(each -> 
singleTableDataNodes.get(each.toLowerCase()))
-                .filter(Objects::nonNull).flatMap(each -> 
each.stream().map(DataNode::getDataSourceName)).collect(Collectors.toSet());
+        Set<String> dataSourceNames = singleTableNames.stream().map(each -> 
findSingleTableDataNode(each)
+                
.orElse(null)).filter(Objects::nonNull).map(DataNode::getDataSourceName).collect(Collectors.toSet());
         return dataSourceNames.size() <= 1;
     }
     
@@ -113,10 +113,10 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
         if (!isSingleTablesInSameDataSource(singleTableNames)) {
             return false;
         }
-        Collection<DataNode> dataNodes = 
singleTableDataNodes.get(singleTableNames.iterator().next().toLowerCase());
-        if (null != dataNodes && !dataNodes.isEmpty()) {
+        Optional<DataNode> dataNode = 
findSingleTableDataNode(singleTableNames.iterator().next());
+        if (dataNode.isPresent()) {
             for (RouteUnit each : routeContext.getRouteUnits()) {
-                if 
(!each.getDataSourceMapper().getLogicName().equals(dataNodes.iterator().next().getDataSourceName()))
 {
+                if 
(!each.getDataSourceMapper().getLogicName().equals(dataNode.get().getDataSourceName()))
 {
                     return false;
                 }
             }
@@ -134,14 +134,14 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
     }
     
     /**
-     * Get sharding logic table names.
+     * Get single table names.
      *
-     * @param logicTableNames logic table names
-     * @return sharding logic table names
+     * @param tableNames table names
+     * @return single table names
      */
-    public Collection<String> getSingleTableNames(final Collection<String> 
logicTableNames) {
+    public Collection<String> getSingleTableNames(final Collection<String> 
tableNames) {
         Collection<String> result = new LinkedList<>();
-        for (String each : logicTableNames) {
+        for (String each : tableNames) {
             if (singleTableDataNodes.containsKey(each.toLowerCase())) {
                 result.add(each);
             }
@@ -168,6 +168,16 @@ public final class SingleTableRule implements SchemaRule, 
DataNodeContainedRule,
                 .flatMap(each -> ((DataNodeContainedRule) 
each).getAllTables().stream()).collect(Collectors.toCollection(() -> new 
TreeSet<>(String.CASE_INSENSITIVE_ORDER)));
     }
     
+    /**
+     * Find single table data node.
+     * 
+     * @param tableName table name
+     * @return data node
+     */
+    public Optional<DataNode> findSingleTableDataNode(final String tableName) {
+        return 
Optional.ofNullable(singleTableDataNodes.get(tableName.toLowerCase())).map(optional
 -> optional.iterator().next());
+    }
+    
     @Override
     public Map<String, Collection<DataNode>> getAllDataNodes() {
         return singleTableDataNodes;
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 a8a55b1..50a2eb9 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
@@ -34,6 +34,7 @@ import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
@@ -110,4 +111,26 @@ public final class SingleTableRuleTest {
         assertTrue(actual.containsKey("employee"));
         assertTrue(actual.containsKey("student"));
     }
+    
+    @Test
+    public void assertFindSingleTableDataNode() {
+        DataNodeContainedRule dataNodeContainedRule = 
mock(DataNodeContainedRule.class);
+        SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class), dataSourceMap,
+                Collections.singletonList(dataNodeContainedRule), new 
ConfigurationProperties(new Properties()));
+        Optional<DataNode> actual = 
singleTableRule.findSingleTableDataNode("employee");
+        assertTrue(actual.isPresent());
+        assertThat(actual.get().getDataSourceName(), is("ds_0"));
+        assertThat(actual.get().getTableName(), is("employee"));
+    }
+    
+    @Test
+    public void assertFindSingleTableDataNodeWithUpperCase() {
+        DataNodeContainedRule dataNodeContainedRule = 
mock(DataNodeContainedRule.class);
+        SingleTableRule singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), mock(DatabaseType.class), dataSourceMap,
+                Collections.singletonList(dataNodeContainedRule), new 
ConfigurationProperties(new Properties()));
+        Optional<DataNode> actual = 
singleTableRule.findSingleTableDataNode("EMPLOYEE");
+        assertTrue(actual.isPresent());
+        assertThat(actual.get().getDataSourceName(), is("ds_0"));
+        assertThat(actual.get().getTableName(), is("employee"));
+    }
 }

Reply via email to