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 d8d941af3fd Add check logic for ShardingAlgorithm and KeyGenerator
name not exists (#18834)
d8d941af3fd is described below
commit d8d941af3fdb882612a2ae82d74e22ab7a69a35f
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Tue Jul 5 10:59:51 2022 +0800
Add check logic for ShardingAlgorithm and KeyGenerator name not exists
(#18834)
* Add check logic for ShardingAlgorithm and KeyGenerator name not exists
* fix integration test
* correct some wrong sharding config
---
.../AlgorithmProvidedShardingRuleBuilder.java | 44 ++++++++++++++++++++++
.../sharding/rule/builder/ShardingRuleBuilder.java | 43 +++++++++++++++++++++
.../AlgorithmProvidedShardingRuleBuilderTest.java | 37 ++++++++++++++++--
.../rule/builder/ShardingRuleBuilderTest.java | 37 ++++++++++++++++--
.../sharding/configWithoutDataSourceWithProps.yaml | 4 +-
.../config_sharding_sphere_jdbc_source.yaml | 3 ++
6 files changed, 159 insertions(+), 9 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilder.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilder.java
index fdfc3b384bb..ff0ee13aa87 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilder.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilder.java
@@ -22,8 +22,15 @@ import
org.apache.shardingsphere.infra.instance.InstanceContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
import
org.apache.shardingsphere.sharding.algorithm.config.AlgorithmProvidedShardingRuleConfiguration;
+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.keygen.KeyGenerateStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.constant.ShardingOrder;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
import javax.sql.DataSource;
import java.util.Collection;
@@ -38,9 +45,46 @@ public final class AlgorithmProvidedShardingRuleBuilder
implements DatabaseRuleB
public ShardingRule build(final AlgorithmProvidedShardingRuleConfiguration
config, final String databaseName,
final Map<String, DataSource> dataSources, final
Collection<ShardingSphereRule> builtRules, final InstanceContext
instanceContext) {
Preconditions.checkArgument(null != dataSources &&
!dataSources.isEmpty(), "Data sources cannot be empty.");
+ Preconditions.checkArgument(isValidRuleConfiguration(config), "Invalid
sharding configuration in AlgorithmProvidedShardingRuleConfiguration.");
return new ShardingRule(config, dataSources.keySet(), instanceContext);
}
+ private boolean isValidRuleConfiguration(final
AlgorithmProvidedShardingRuleConfiguration config) {
+ Map<String, KeyGenerateAlgorithm> keyGenerators =
config.getKeyGenerators();
+ Map<String, ShardingAlgorithm> shardingAlgorithms =
config.getShardingAlgorithms();
+ if
(isInvalidKeyGenerateStrategy(config.getDefaultKeyGenerateStrategy(),
keyGenerators)
+ ||
isInvalidShardingStrategy(config.getDefaultDatabaseShardingStrategy(),
shardingAlgorithms)
+ ||
isInvalidShardingStrategy(config.getDefaultTableShardingStrategy(),
shardingAlgorithms)) {
+ return false;
+ }
+ for (ShardingTableRuleConfiguration each : config.getTables()) {
+ if (isInvalidKeyGenerateStrategy(each.getKeyGenerateStrategy(),
keyGenerators) || isInvalidShardingStrategy(each.getDatabaseShardingStrategy(),
shardingAlgorithms)
+ ||
isInvalidShardingStrategy(each.getTableShardingStrategy(), shardingAlgorithms))
{
+ return false;
+ }
+ }
+ for (ShardingAutoTableRuleConfiguration each : config.getAutoTables())
{
+ if (isInvalidKeyGenerateStrategy(each.getKeyGenerateStrategy(),
keyGenerators) || isInvalidShardingStrategy(each.getShardingStrategy(),
shardingAlgorithms)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean isInvalidKeyGenerateStrategy(final
KeyGenerateStrategyConfiguration keyGenerateStrategy, final Map<String,
KeyGenerateAlgorithm> keyGenerators) {
+ if (null == keyGenerateStrategy) {
+ return false;
+ }
+ return
!keyGenerators.containsKey(keyGenerateStrategy.getKeyGeneratorName());
+ }
+
+ private boolean isInvalidShardingStrategy(final
ShardingStrategyConfiguration shardingStrategy, final Map<String,
ShardingAlgorithm> shardingAlgorithms) {
+ if (null == shardingStrategy || shardingStrategy instanceof
NoneShardingStrategyConfiguration) {
+ return false;
+ }
+ return
!shardingAlgorithms.containsKey(shardingStrategy.getShardingAlgorithmName());
+ }
+
@Override
public int getOrder() {
return ShardingOrder.ALGORITHM_PROVIDER_ORDER;
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java
index 6588bbf57ae..fccefda9c17 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java
@@ -18,10 +18,16 @@
package org.apache.shardingsphere.sharding.rule.builder;
import com.google.common.base.Preconditions;
+import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import org.apache.shardingsphere.infra.instance.InstanceContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
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.keygen.KeyGenerateStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.constant.ShardingOrder;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
@@ -38,9 +44,46 @@ public final class ShardingRuleBuilder implements
DatabaseRuleBuilder<ShardingRu
public ShardingRule build(final ShardingRuleConfiguration config, final
String databaseName,
final Map<String, DataSource> dataSources, final
Collection<ShardingSphereRule> builtRules, final InstanceContext
instanceContext) {
Preconditions.checkArgument(null != dataSources &&
!dataSources.isEmpty(), "Data source names cannot be empty.");
+ Preconditions.checkArgument(isValidRuleConfiguration(config), "Invalid
sharding configuration in ShardingRuleConfiguration.");
return new ShardingRule(config, dataSources.keySet(), instanceContext);
}
+ private boolean isValidRuleConfiguration(final ShardingRuleConfiguration
config) {
+ Map<String, ShardingSphereAlgorithmConfiguration> keyGenerators =
config.getKeyGenerators();
+ Map<String, ShardingSphereAlgorithmConfiguration> shardingAlgorithms =
config.getShardingAlgorithms();
+ if
(isInvalidKeyGenerateStrategy(config.getDefaultKeyGenerateStrategy(),
keyGenerators)
+ ||
isInvalidShardingStrategy(config.getDefaultDatabaseShardingStrategy(),
shardingAlgorithms)
+ ||
isInvalidShardingStrategy(config.getDefaultTableShardingStrategy(),
shardingAlgorithms)) {
+ return false;
+ }
+ for (ShardingTableRuleConfiguration each : config.getTables()) {
+ if (isInvalidKeyGenerateStrategy(each.getKeyGenerateStrategy(),
keyGenerators) || isInvalidShardingStrategy(each.getDatabaseShardingStrategy(),
shardingAlgorithms)
+ ||
isInvalidShardingStrategy(each.getTableShardingStrategy(), shardingAlgorithms))
{
+ return false;
+ }
+ }
+ for (ShardingAutoTableRuleConfiguration each : config.getAutoTables())
{
+ if (isInvalidKeyGenerateStrategy(each.getKeyGenerateStrategy(),
keyGenerators) || isInvalidShardingStrategy(each.getShardingStrategy(),
shardingAlgorithms)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean isInvalidKeyGenerateStrategy(final
KeyGenerateStrategyConfiguration keyGenerateStrategy, final Map<String,
ShardingSphereAlgorithmConfiguration> keyGenerators) {
+ if (null == keyGenerateStrategy) {
+ return false;
+ }
+ return
!keyGenerators.containsKey(keyGenerateStrategy.getKeyGeneratorName());
+ }
+
+ private boolean isInvalidShardingStrategy(final
ShardingStrategyConfiguration shardingStrategy, final Map<String,
ShardingSphereAlgorithmConfiguration> shardingAlgorithms) {
+ if (null == shardingStrategy || shardingStrategy instanceof
NoneShardingStrategyConfiguration) {
+ return false;
+ }
+ return
!shardingAlgorithms.containsKey(shardingStrategy.getShardingAlgorithmName());
+ }
+
@Override
public int getOrder() {
return ShardingOrder.ORDER;
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilderTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilderTest.java
index 3007659d9d7..4089e2bc1ff 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilderTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilderTest.java
@@ -21,7 +21,10 @@ import
org.apache.shardingsphere.infra.instance.InstanceContext;
import
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
import
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilderFactory;
import
org.apache.shardingsphere.sharding.algorithm.config.AlgorithmProvidedShardingRuleConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm;
import org.junit.Before;
import org.junit.Test;
@@ -49,19 +52,47 @@ public final class AlgorithmProvidedShardingRuleBuilderTest
{
@SuppressWarnings("unchecked")
@Test
public void assertBuild() {
- assertThat(builder.build(ruleConfig, "test_schema",
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.singletonMap("name", mock(DataSource.class,
RETURNS_DEEP_STUBS)), Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
}
@SuppressWarnings("unchecked")
@Test(expected = IllegalArgumentException.class)
public void assertBuildWithNullDataSourceMap() {
- assertThat(builder.build(ruleConfig, "test_schema", null,
Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
+ assertThat(builder.build(ruleConfig, "sharding_db", null,
Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
}
@SuppressWarnings("unchecked")
@Test(expected = IllegalArgumentException.class)
public void assertBuildWithEmptyDataSourceMap() {
- assertThat(builder.build(ruleConfig, "test_schema",
Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test(expected = IllegalArgumentException.class)
+ public void assertBuildWithInvalidKeyGenerator() {
+ ruleConfig.setDefaultKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("order_id", "snowflake"));
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.singletonMap("ds_0", mock(DataSource.class)),
Collections.emptyList(), mock(InstanceContext.class)),
+ instanceOf(ShardingRule.class));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test(expected = IllegalArgumentException.class)
+ public void assertBuildWithInvalidDatabaseShardingStrategy() {
+ ruleConfig.setDefaultKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("order_id", "snowflake"));
+ ruleConfig.getKeyGenerators().put("snowflake",
mock(KeyGenerateAlgorithm.class));
+ ruleConfig.setDefaultDatabaseShardingStrategy(new
StandardShardingStrategyConfiguration("user_id", "database_inline"));
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.singletonMap("ds_0", mock(DataSource.class)),
Collections.emptyList(), mock(InstanceContext.class)),
+ instanceOf(ShardingRule.class));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test(expected = IllegalArgumentException.class)
+ public void assertBuildWithInvalidTableShardingStrategy() {
+ ruleConfig.setDefaultKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("order_id", "snowflake"));
+ ruleConfig.getKeyGenerators().put("snowflake",
mock(KeyGenerateAlgorithm.class));
+ ruleConfig.setDefaultTableShardingStrategy(new
StandardShardingStrategyConfiguration("order_id", "t_order_inline"));
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.singletonMap("ds_0", mock(DataSource.class)),
Collections.emptyList(), mock(InstanceContext.class)),
+ instanceOf(ShardingRule.class));
}
}
diff --git
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java
index 6b69772538d..910f303cb72 100644
---
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java
+++
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java
@@ -17,10 +17,13 @@
package org.apache.shardingsphere.sharding.rule.builder;
+import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import org.apache.shardingsphere.infra.instance.InstanceContext;
import
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
import
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilderFactory;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.junit.Before;
import org.junit.Test;
@@ -49,19 +52,47 @@ public final class ShardingRuleBuilderTest {
@SuppressWarnings("unchecked")
@Test
public void assertBuild() {
- assertThat(builder.build(ruleConfig, "test_schema",
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.singletonMap("name", mock(DataSource.class,
RETURNS_DEEP_STUBS)), Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
}
@SuppressWarnings("unchecked")
@Test(expected = IllegalArgumentException.class)
public void assertBuildWithNullDataSourceMap() {
- assertThat(builder.build(ruleConfig, "test_schema", null,
Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
+ assertThat(builder.build(ruleConfig, "sharding_db", null,
Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
}
@SuppressWarnings("unchecked")
@Test(expected = IllegalArgumentException.class)
public void assertBuildWithEmptyDataSourceMap() {
- assertThat(builder.build(ruleConfig, "test_schema",
Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)),
instanceOf(ShardingRule.class));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test(expected = IllegalArgumentException.class)
+ public void assertBuildWithInvalidKeyGenerator() {
+ ruleConfig.setDefaultKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("order_id", "snowflake"));
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.singletonMap("ds_0", mock(DataSource.class)),
Collections.emptyList(), mock(InstanceContext.class)),
+ instanceOf(ShardingRule.class));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test(expected = IllegalArgumentException.class)
+ public void assertBuildWithInvalidDatabaseShardingStrategy() {
+ ruleConfig.setDefaultKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("order_id", "snowflake"));
+ ruleConfig.getKeyGenerators().put("snowflake",
mock(ShardingSphereAlgorithmConfiguration.class));
+ ruleConfig.setDefaultDatabaseShardingStrategy(new
StandardShardingStrategyConfiguration("user_id", "database_inline"));
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.singletonMap("ds_0", mock(DataSource.class)),
Collections.emptyList(), mock(InstanceContext.class)),
+ instanceOf(ShardingRule.class));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test(expected = IllegalArgumentException.class)
+ public void assertBuildWithInvalidTableShardingStrategy() {
+ ruleConfig.setDefaultKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("order_id", "snowflake"));
+ ruleConfig.getKeyGenerators().put("snowflake",
mock(ShardingSphereAlgorithmConfiguration.class));
+ ruleConfig.setDefaultTableShardingStrategy(new
StandardShardingStrategyConfiguration("order_id", "t_order_inline"));
+ assertThat(builder.build(ruleConfig, "sharding_db",
Collections.singletonMap("ds_0", mock(DataSource.class)),
Collections.emptyList(), mock(InstanceContext.class)),
+ instanceOf(ShardingRule.class));
}
}
diff --git
a/shardingsphere-test/shardingsphere-integration-driver-test/src/test/resources/yaml/integrate/sharding/configWithoutDataSourceWithProps.yaml
b/shardingsphere-test/shardingsphere-integration-driver-test/src/test/resources/yaml/integrate/sharding/configWithoutDataSourceWithProps.yaml
index a7ded4fdbd9..73440510fb2 100644
---
a/shardingsphere-test/shardingsphere-integration-driver-test/src/test/resources/yaml/integrate/sharding/configWithoutDataSourceWithProps.yaml
+++
b/shardingsphere-test/shardingsphere-integration-driver-test/src/test/resources/yaml/integrate/sharding/configWithoutDataSourceWithProps.yaml
@@ -61,9 +61,7 @@ rules:
defaultDatabaseStrategy:
none:
defaultTableStrategy:
- complex:
- shardingColumns: id, order_id
- shardingAlgorithmName: complex_sharding_fixture
+ none:
shardingAlgorithms:
standard_sharding_fixture:
diff --git
a/shardingsphere-test/shardingsphere-pipeline-test/src/test/resources/config_sharding_sphere_jdbc_source.yaml
b/shardingsphere-test/shardingsphere-pipeline-test/src/test/resources/config_sharding_sphere_jdbc_source.yaml
index 116ab7bcbd9..96e05f6f2dc 100644
---
a/shardingsphere-test/shardingsphere-pipeline-test/src/test/resources/config_sharding_sphere_jdbc_source.yaml
+++
b/shardingsphere-test/shardingsphere-pipeline-test/src/test/resources/config_sharding_sphere_jdbc_source.yaml
@@ -49,6 +49,9 @@ rules:
type: INLINE
props:
algorithm-expression: t_order
+ keyGenerators:
+ snowflake:
+ type: SNOWFLAKE
scalingName: default_scaling
scaling:
default_scaling: