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

azexin 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 d719c4e74a7 Refactor ShardingTableNodesResultSet to depend on 
ShardingRule (#23179)
d719c4e74a7 is described below

commit d719c4e74a79bde49141a796c693cf1af8360b4a
Author: Hongsheng Zhong <[email protected]>
AuthorDate: Fri Dec 30 11:02:05 2022 +0800

    Refactor ShardingTableNodesResultSet to depend on ShardingRule (#23179)
---
 .../handler/query/ShardingTableNodesResultSet.java | 89 ++++-----------------
 .../query/ShardingTableNodesResultSetTest.java     | 92 +++++++++-------------
 .../yaml/config_sharding_for_table_nodes.yaml      | 54 +++++++++++++
 3 files changed, 105 insertions(+), 130 deletions(-)

diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/query/ShardingTableNodesResultSet.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/query/ShardingTableNodesResultSet.java
index 5fbf9c77569..1b3855bb58b 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/query/ShardingTableNodesResultSet.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/query/ShardingTableNodesResultSet.java
@@ -17,21 +17,12 @@
 
 package org.apache.shardingsphere.sharding.distsql.handler.query;
 
-import com.google.common.base.Strings;
 import 
org.apache.shardingsphere.distsql.handler.resultset.DatabaseDistSQLResultSet;
-import 
org.apache.shardingsphere.infra.algorithm.ShardingSphereAlgorithmFactory;
-import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
+import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.util.expr.InlineExpressionParser;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPIRegistry;
-import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
-import 
org.apache.shardingsphere.sharding.api.sharding.ShardingAutoTableAlgorithm;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingTableNodesStatement;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
+import org.apache.shardingsphere.sharding.rule.TableRule;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Arrays;
@@ -39,11 +30,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -59,71 +47,24 @@ public final class ShardingTableNodesResultSet implements 
DatabaseDistSQLResultS
     
     @Override
     public void init(final ShardingSphereDatabase database, final SQLStatement 
sqlStatement) {
-        Optional<ShardingRule> rule = 
database.getRuleMetaData().findSingleRule(ShardingRule.class);
-        rule.ifPresent(optional -> data = getData((ShardingRuleConfiguration) 
optional.getConfiguration(), (ShowShardingTableNodesStatement) 
sqlStatement).entrySet().iterator());
-    }
-    
-    private Map<String, String> getData(final ShardingRuleConfiguration 
config, final ShowShardingTableNodesStatement sqlStatement) {
-        String tableName = sqlStatement.getTableName();
-        Map<String, String> dataNodes = 
config.getTables().stream().filter(each -> null == tableName || 
each.getLogicTable().equals(tableName))
-                
.collect(Collectors.toMap(ShardingTableRuleConfiguration::getLogicTable, 
this::getDataNodes, (x, y) -> x, LinkedHashMap::new));
-        Map<String, String> autoTables = 
config.getAutoTables().stream().filter(each -> null == tableName || 
each.getLogicTable().equals(tableName))
-                
.collect(Collectors.toMap(ShardingAutoTableRuleConfiguration::getLogicTable, 
each -> getDataNodes(each, getTotalShardingCount(config, each)), (x, y) -> x, 
LinkedHashMap::new));
-        Map<String, String> result = new LinkedHashMap<>();
-        result.putAll(dataNodes);
-        result.putAll(autoTables);
-        return result;
-    }
-    
-    private int getTotalShardingCount(final ShardingRuleConfiguration 
ruleConfig, final ShardingAutoTableRuleConfiguration 
shardingAutoTableRuleConfig) {
-        Map<String, AlgorithmConfiguration> shardingAlgorithms = 
ruleConfig.getShardingAlgorithms();
-        ShardingStrategyConfiguration shardingStrategy = 
shardingAutoTableRuleConfig.getShardingStrategy();
-        if (useDefaultStrategy(shardingStrategy, ruleConfig)) {
-            int tableCount = 
getShardingCount(shardingAlgorithms.get(ruleConfig.getDefaultTableShardingStrategy().getShardingAlgorithmName()));
-            int databaseCount = 
getShardingCount(shardingAlgorithms.get(ruleConfig.getDefaultDatabaseShardingStrategy().getShardingAlgorithmName()));
-            return tableCount * databaseCount;
+        ShardingRule shardingRule = (ShardingRule) 
database.getRuleMetaData().getRules().stream().filter(each -> each instanceof 
ShardingRule).findFirst().orElse(null);
+        if (null == shardingRule) {
+            return;
         }
-        return 
getShardingCount(shardingAlgorithms.get(shardingStrategy.getShardingAlgorithmName()));
-    }
-    
-    private boolean useDefaultStrategy(final ShardingStrategyConfiguration 
currentShardingStrategy, final ShardingRuleConfiguration ruleConfig) {
-        return (null == currentShardingStrategy || 
Strings.isNullOrEmpty(currentShardingStrategy.getShardingAlgorithmName()))
-                && null != ruleConfig.getDefaultDatabaseShardingStrategy() && 
null != ruleConfig.getDefaultTableShardingStrategy();
-    }
-    
-    private int getShardingCount(final AlgorithmConfiguration algorithmConfig) 
{
-        if (null == algorithmConfig) {
-            return 0;
-        }
-        if (TypedSPIRegistry.findRegisteredService(ShardingAlgorithm.class, 
algorithmConfig.getType()).isPresent()) {
-            ShardingAlgorithm shardingAlgorithm = 
ShardingSphereAlgorithmFactory.createAlgorithm(algorithmConfig, 
ShardingAlgorithm.class);
-            if (shardingAlgorithm instanceof ShardingAutoTableAlgorithm) {
-                shardingAlgorithm.init(algorithmConfig.getProps());
-                return ((ShardingAutoTableAlgorithm) 
shardingAlgorithm).getAutoTablesAmount();
+        Map<String, String> result = new LinkedHashMap<>();
+        String tableName = ((ShowShardingTableNodesStatement) 
sqlStatement).getTableName();
+        if (null == tableName) {
+            for (Entry<String, TableRule> entry : 
shardingRule.getTableRules().entrySet()) {
+                result.put(entry.getKey(), getTableNodes(entry.getValue()));
             }
+        } else {
+            result.put(tableName, 
getTableNodes(shardingRule.getTableRule(tableName)));
         }
-        return 0;
-    }
-    
-    private String getDataNodes(final ShardingAutoTableRuleConfiguration 
shardingAutoTableRuleConfig, final int shardingCount) {
-        List<String> dataSources = new 
InlineExpressionParser(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate();
-        return 
fillDataSourceNames(shardingAutoTableRuleConfig.getLogicTable(), shardingCount, 
dataSources);
+        data = result.entrySet().iterator();
     }
     
-    private String getDataNodes(final ShardingTableRuleConfiguration 
shardingTableRuleConfig) {
-        return String.join(", ", new 
InlineExpressionParser(shardingTableRuleConfig.getActualDataNodes()).splitAndEvaluate());
-    }
-    
-    private String fillDataSourceNames(final String logicTable, final int 
amount, final List<String> dataSources) {
-        List<String> result = new LinkedList<>();
-        Iterator<String> iterator = dataSources.iterator();
-        for (int i = 0; i < amount; i++) {
-            if (!iterator.hasNext()) {
-                iterator = dataSources.iterator();
-            }
-            result.add(String.format("%s.%s_%s", iterator.next(), logicTable, 
i));
-        }
-        return String.join(", ", result);
+    private String getTableNodes(final TableRule tableRule) {
+        return 
tableRule.getActualDataNodes().stream().map(DataNode::format).collect(Collectors.joining(",
 "));
     }
     
     @Override
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/query/ShardingTableNodesResultSetTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/query/ShardingTableNodesResultSetTest.java
index 114ec1c5d00..f4d658fdf6d 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/query/ShardingTableNodesResultSetTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/query/ShardingTableNodesResultSetTest.java
@@ -17,26 +17,29 @@
 
 package org.apache.shardingsphere.sharding.distsql.query;
 
-import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.distsql.handler.resultset.DatabaseDistSQLResultSet;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
+import org.apache.shardingsphere.infra.yaml.config.pojo.YamlRootConfiguration;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.distsql.handler.query.ShardingTableNodesResultSet;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.ShowShardingTableNodesStatement;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import 
org.apache.shardingsphere.sharding.yaml.swapper.ShardingRuleConfigurationConverter;
 import org.junit.Test;
 
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
-import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertNotNull;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -45,60 +48,37 @@ public final class ShardingTableNodesResultSetTest {
     
     @Test
     public void assertGetRowData() {
-        DatabaseDistSQLResultSet resultSet = new ShardingTableNodesResultSet();
-        resultSet.init(mockDatabase(), 
mock(ShowShardingTableNodesStatement.class));
-        List<Object> actual = new ArrayList<>(resultSet.getRowData());
-        assertThat(actual.size(), is(2));
-        assertThat(actual.get(0), is("t_order"));
-        assertThat(actual.get(1), is("ds_0.t_order_0, ds_0.t_order_1, 
ds_1.t_order_0, ds_1.t_order_1"));
-        resultSet.next();
-        actual = new ArrayList<>(resultSet.getRowData());
-        assertThat(actual.get(0), is("t_product"));
-        assertThat(actual.get(1), is("ds_2.t_product_0, ds_3.t_product_1"));
-        actual = new ArrayList<>(resultSet.getRowData());
-        assertThat(actual.get(0), is("t_user"));
-        assertThat(actual.get(1), is("ds_2.t_user_0, ds_3.t_user_1, 
ds_2.t_user_2, ds_3.t_user_3"));
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        ShardingRule shardingRule = createShardingRule();
+        
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(shardingRule));
+        assertOrder(database);
+        assertOrderItem(database);
     }
     
-    private ShardingSphereDatabase mockDatabase() {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        ShardingRule rule = mock(ShardingRule.class);
-        when(rule.getConfiguration()).thenReturn(createRuleConfiguration());
-        
when(result.getRuleMetaData().findSingleRule(ShardingRule.class)).thenReturn(Optional.of(rule));
-        return result;
+    @SneakyThrows(IOException.class)
+    private ShardingRule createShardingRule() {
+        URL url = 
getClass().getClassLoader().getResource("yaml/config_sharding_for_table_nodes.yaml");
+        assertNotNull(url);
+        YamlRootConfiguration yamlRootConfig = YamlEngine.unmarshal(new 
File(url.getFile()), YamlRootConfiguration.class);
+        ShardingRuleConfiguration shardingRuleConfig = 
ShardingRuleConfigurationConverter.findAndConvertShardingRuleConfiguration(yamlRootConfig.getRules());
+        return new ShardingRule(shardingRuleConfig, Arrays.asList("ds_1", 
"ds_2", "ds_3"), null);
     }
     
-    private RuleConfiguration createRuleConfiguration() {
-        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
-        result.getTables().add(createShardingTableRuleConfiguration());
-        result.getAutoTables().add(createProductAutoTableConfiguration());
-        result.getAutoTables().add(createUserAutoTableConfiguration());
-        result.getShardingAlgorithms().put("t_product_algorithm", new 
AlgorithmConfiguration("FOO.DISTSQL.FIXTURE", newProperties("sharding-count", 
2)));
-        result.getShardingAlgorithms().put("t_user_algorithm", new 
AlgorithmConfiguration("BAR.DISTSQL.FIXTURE", newProperties("sharding-ranges", 
"10,20,30")));
-        result.setDefaultTableShardingStrategy(new 
StandardShardingStrategyConfiguration("user_id", "t_product_algorithm"));
-        result.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("user_id", "t_product_algorithm"));
-        return result;
-    }
-    
-    private ShardingTableRuleConfiguration 
createShardingTableRuleConfiguration() {
-        return new ShardingTableRuleConfiguration("t_order", 
"ds_${0..1}.t_order_${0..1}");
-    }
-    
-    private ShardingAutoTableRuleConfiguration 
createProductAutoTableConfiguration() {
-        ShardingAutoTableRuleConfiguration result = new 
ShardingAutoTableRuleConfiguration("t_product", "ds_2,ds_3");
-        result.setShardingStrategy(new 
StandardShardingStrategyConfiguration("user_id", "t_product_algorithm"));
-        return result;
-    }
-    
-    private ShardingAutoTableRuleConfiguration 
createUserAutoTableConfiguration() {
-        ShardingAutoTableRuleConfiguration result = new 
ShardingAutoTableRuleConfiguration("t_user", "ds_2,ds_3");
-        result.setShardingStrategy(new 
StandardShardingStrategyConfiguration("user_id", "t_user_algorithm"));
-        return result;
+    private void assertOrder(final ShardingSphereDatabase database) {
+        DatabaseDistSQLResultSet resultSet = new ShardingTableNodesResultSet();
+        resultSet.init(database, new 
ShowShardingTableNodesStatement("t_order", null));
+        List<Object> actual = new ArrayList<>(resultSet.getRowData());
+        assertThat(actual.size(), is(2));
+        assertThat(actual.get(0), is("t_order"));
+        assertThat(actual.get(1), is("ds_1.t_order_0, ds_2.t_order_1, 
ds_1.t_order_2, ds_2.t_order_3, ds_1.t_order_4, ds_2.t_order_5"));
     }
     
-    private Properties newProperties(final String key, final Object value) {
-        Properties result = new Properties();
-        result.put(key, value);
-        return result;
+    private void assertOrderItem(final ShardingSphereDatabase database) {
+        DatabaseDistSQLResultSet resultSet = new ShardingTableNodesResultSet();
+        resultSet.init(database, new 
ShowShardingTableNodesStatement("t_order_item", null));
+        List<Object> actual = new ArrayList<>(resultSet.getRowData());
+        assertThat(actual.size(), is(2));
+        assertThat(actual.get(0), is("t_order_item"));
+        assertThat(actual.get(1), is("ds_2.t_order_item_0, 
ds_3.t_order_item_1, ds_2.t_order_item_2, ds_3.t_order_item_3, 
ds_2.t_order_item_4, ds_3.t_order_item_5"));
     }
 }
diff --git 
a/features/sharding/distsql/handler/src/test/resources/yaml/config_sharding_for_table_nodes.yaml
 
b/features/sharding/distsql/handler/src/test/resources/yaml/config_sharding_for_table_nodes.yaml
new file mode 100644
index 00000000000..cb75aeb3623
--- /dev/null
+++ 
b/features/sharding/distsql/handler/src/test/resources/yaml/config_sharding_for_table_nodes.yaml
@@ -0,0 +1,54 @@
+#
+# 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.
+#
+
+rules:
+  - !SHARDING
+    autoTables:
+      t_order:
+        actualDataSources: ds_1,ds_2
+        keyGenerateStrategy:
+          column: order_id
+          keyGeneratorName: t_order_snowflake
+        logicTable: t_order
+        shardingStrategy:
+          standard:
+            shardingAlgorithmName: t_order_hash_mod
+            shardingColumn: order_id
+      t_order_item:
+        actualDataSources: ds_2,ds_3
+        keyGenerateStrategy:
+          column: order_id
+          keyGeneratorName: t_order_item_snowflake
+        logicTable: t_order_item
+        shardingStrategy:
+          standard:
+            shardingAlgorithmName: t_order_item_hash_mod
+            shardingColumn: order_id
+    keyGenerators:
+      t_order_snowflake:
+        type: snowflake
+      t_order_item_snowflake:
+        type: snowflake
+    shardingAlgorithms:
+      t_order_hash_mod:
+        props:
+          sharding-count: '6'
+        type: hash_mod
+      t_order_item_hash_mod:
+        props:
+          sharding-count: '6'
+        type: hash_mod

Reply via email to