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"));
+ }
}