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