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

zhonghongsheng 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 e5487054cb3 Add sharding algorithm check for auto sharding algorithm 
and manual sharding algorithm (#26681)
e5487054cb3 is described below

commit e5487054cb383f1f19db5f873bf00b43289be864
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Jun 30 11:14:36 2023 +0800

    Add sharding algorithm check for auto sharding algorithm and manual 
sharding algorithm (#26681)
    
    * Add sharding algorithm check for auto sharding algorithm and manual 
sharding algorithm
    
    * fix sharding route cache unit test
---
 .../shardingsphere/sharding/rule/ShardingRule.java | 39 +++++++++++++++---
 .../checker/ShardingRouteCacheableCheckerTest.java |  9 +++--
 .../sharding/rule/ShardingRuleTest.java            | 47 ++++++++++++++++++++++
 3 files changed, 85 insertions(+), 10 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index 6895ead1d7d..2dd7436403f 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -49,7 +49,7 @@ import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardS
 import 
org.apache.shardingsphere.sharding.api.sharding.ShardingAutoTableAlgorithm;
 import org.apache.shardingsphere.sharding.cache.ShardingCache;
 import 
org.apache.shardingsphere.sharding.exception.algorithm.keygen.GenerateKeyStrategyNotFoundException;
-import 
org.apache.shardingsphere.sharding.exception.algorithm.sharding.ShardingAlgorithmClassImplementationException;
+import 
org.apache.shardingsphere.sharding.exception.algorithm.sharding.ShardingAlgorithmInitializationException;
 import 
org.apache.shardingsphere.sharding.exception.metadata.InvalidBindingTablesException;
 import 
org.apache.shardingsphere.sharding.exception.metadata.ShardingTableRuleNotFoundException;
 import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm;
@@ -128,8 +128,8 @@ public final class ShardingRule implements DatabaseRule, 
DataNodeContainedRule,
         tableRules.putAll(createTableRules(ruleConfig.getTables(), 
ruleConfig.getDefaultKeyGenerateStrategy()));
         tableRules.putAll(createAutoTableRules(ruleConfig.getAutoTables(), 
ruleConfig.getDefaultKeyGenerateStrategy()));
         
bindingTableRules.putAll(createBindingTableRules(ruleConfig.getBindingTableGroups()));
-        defaultDatabaseShardingStrategyConfig = null == 
ruleConfig.getDefaultDatabaseShardingStrategy() ? new 
NoneShardingStrategyConfiguration() : 
ruleConfig.getDefaultDatabaseShardingStrategy();
-        defaultTableShardingStrategyConfig = null == 
ruleConfig.getDefaultTableShardingStrategy() ? new 
NoneShardingStrategyConfiguration() : 
ruleConfig.getDefaultTableShardingStrategy();
+        defaultDatabaseShardingStrategyConfig = 
createDefaultDatabaseShardingStrategyConfig(ruleConfig);
+        defaultTableShardingStrategyConfig = 
createDefaultTableShardingStrategyConfig(ruleConfig);
         defaultAuditStrategy = null == ruleConfig.getDefaultAuditStrategy() ? 
new ShardingAuditStrategyConfiguration(Collections.emptyList(), true) : 
ruleConfig.getDefaultAuditStrategy();
         defaultKeyGenerateAlgorithm = null == 
ruleConfig.getDefaultKeyGenerateStrategy()
                 ? TypedSPILoader.getService(KeyGenerateAlgorithm.class, null)
@@ -148,6 +148,16 @@ public final class ShardingRule implements DatabaseRule, 
DataNodeContainedRule,
         actualTableMapper = createActualTableMapper();
     }
     
+    private ShardingStrategyConfiguration 
createDefaultDatabaseShardingStrategyConfig(final ShardingRuleConfiguration 
ruleConfig) {
+        
Optional.ofNullable(ruleConfig.getDefaultDatabaseShardingStrategy()).ifPresent(optional
 -> checkManualShardingAlgorithm(optional.getShardingAlgorithmName(), 
"default"));
+        return null == ruleConfig.getDefaultDatabaseShardingStrategy() ? new 
NoneShardingStrategyConfiguration() : 
ruleConfig.getDefaultDatabaseShardingStrategy();
+    }
+    
+    private ShardingStrategyConfiguration 
createDefaultTableShardingStrategyConfig(final ShardingRuleConfiguration 
ruleConfig) {
+        
Optional.ofNullable(ruleConfig.getDefaultTableShardingStrategy()).ifPresent(optional
 -> checkManualShardingAlgorithm(optional.getShardingAlgorithmName(), 
"default"));
+        return null == ruleConfig.getDefaultTableShardingStrategy() ? new 
NoneShardingStrategyConfiguration() : 
ruleConfig.getDefaultTableShardingStrategy();
+    }
+    
     private TableNamesMapper createLogicalTableMapper() {
         TableNamesMapper result = new TableNamesMapper();
         tableRules.values().forEach(each -> result.put(each.getLogicTable()));
@@ -197,10 +207,22 @@ public final class ShardingRule implements DatabaseRule, 
DataNodeContainedRule,
     }
     
     private Map<String, TableRule> createTableRules(final 
Collection<ShardingTableRuleConfiguration> tableRuleConfigs, final 
KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
-        return tableRuleConfigs.stream().map(each -> new TableRule(each, 
dataSourceNames, getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig)))
+        return tableRuleConfigs.stream().map(each -> createTableRule(each, 
defaultKeyGenerateStrategyConfig))
                 .collect(Collectors.toMap(each -> 
each.getLogicTable().toLowerCase(), Function.identity(), (oldValue, 
currentValue) -> oldValue, LinkedHashMap::new));
     }
     
+    private TableRule createTableRule(final ShardingTableRuleConfiguration 
tableRuleConfig, final KeyGenerateStrategyConfiguration 
defaultKeyGenerateStrategyConfig) {
+        
Optional.ofNullable(tableRuleConfig.getDatabaseShardingStrategy()).ifPresent(optional
 -> checkManualShardingAlgorithm(optional.getShardingAlgorithmName(), 
tableRuleConfig.getLogicTable()));
+        
Optional.ofNullable(tableRuleConfig.getTableShardingStrategy()).ifPresent(optional
 -> checkManualShardingAlgorithm(optional.getShardingAlgorithmName(), 
tableRuleConfig.getLogicTable()));
+        return new TableRule(tableRuleConfig, dataSourceNames, 
getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig));
+    }
+    
+    private void checkManualShardingAlgorithm(final String 
shardingAlgorithmName, final String logicTable) {
+        ShardingAlgorithm shardingAlgorithm = 
shardingAlgorithms.get(shardingAlgorithmName);
+        ShardingSpherePreconditions.checkState(!(shardingAlgorithm instanceof 
ShardingAutoTableAlgorithm),
+                () -> new 
ShardingAlgorithmInitializationException(shardingAlgorithm.getType(), 
String.format("`%s` tables sharding configuration can not use auto sharding 
algorithm.", logicTable)));
+    }
+    
     private Map<String, TableRule> createAutoTableRules(final 
Collection<ShardingAutoTableRuleConfiguration> autoTableRuleConfigs,
                                                         final 
KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
         return autoTableRuleConfigs.stream().map(each -> 
createAutoTableRule(defaultKeyGenerateStrategyConfig, each))
@@ -208,12 +230,17 @@ public final class ShardingRule implements DatabaseRule, 
DataNodeContainedRule,
     }
     
     private TableRule createAutoTableRule(final 
KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig, final 
ShardingAutoTableRuleConfiguration autoTableRuleConfig) {
+        
checkAutoShardingAlgorithm(autoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName(),
 autoTableRuleConfig.getLogicTable());
         ShardingAlgorithm shardingAlgorithm = 
shardingAlgorithms.get(autoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName());
-        ShardingSpherePreconditions.checkState(shardingAlgorithm instanceof 
ShardingAutoTableAlgorithm,
-                () -> new 
ShardingAlgorithmClassImplementationException(autoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName(),
 ShardingAutoTableAlgorithm.class));
         return new TableRule(autoTableRuleConfig, dataSourceNames, 
(ShardingAutoTableAlgorithm) shardingAlgorithm, 
getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig));
     }
     
+    private void checkAutoShardingAlgorithm(final String 
shardingAlgorithmName, final String logicTable) {
+        ShardingAlgorithm shardingAlgorithm = 
shardingAlgorithms.get(shardingAlgorithmName);
+        ShardingSpherePreconditions.checkState(shardingAlgorithm instanceof 
ShardingAutoTableAlgorithm,
+                () -> new 
ShardingAlgorithmInitializationException(shardingAlgorithm.getType(), 
String.format("`%s` autoTables sharding configuration must use auto sharding 
algorithm.", logicTable)));
+    }
+    
     private String getDefaultGenerateKeyColumn(final 
KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
         return 
Optional.ofNullable(defaultKeyGenerateStrategyConfig).map(KeyGenerateStrategyConfiguration::getColumn).orElse(null);
     }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java
index 0572ad8b5f8..0b476cc79b4 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java
@@ -36,6 +36,7 @@ import 
org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.cache.ShardingCacheConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.cache.ShardingCacheOptionsConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableReferenceRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
@@ -87,10 +88,10 @@ class ShardingRouteCacheableCheckerTest {
         ruleConfig.getBindingTableGroups().add(new 
ShardingTableReferenceRuleConfiguration("foo", "t_order,t_order_item"));
         ruleConfig.getShardingAlgorithms().put("mod", new 
AlgorithmConfiguration("MOD", PropertiesBuilder.build(new 
Property("sharding-count", "2"))));
         ruleConfig.getShardingAlgorithms().put("inline", new 
AlgorithmConfiguration("INLINE", PropertiesBuilder.build(new 
Property("algorithm-expression", "ds_${id % 2}"))));
-        ruleConfig.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("warehouse_id", "mod"));
-        ShardingTableRuleConfiguration warehouse = new 
ShardingTableRuleConfiguration("t_warehouse", "ds_${0..1}.t_warehouse");
-        warehouse.setDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("id", "mod"));
-        ruleConfig.getTables().add(warehouse);
+        ruleConfig.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("warehouse_id", "inline"));
+        ShardingAutoTableRuleConfiguration warehouse = new 
ShardingAutoTableRuleConfiguration("t_warehouse", "ds_${0..1}");
+        warehouse.setShardingStrategy(new 
StandardShardingStrategyConfiguration("id", "mod"));
+        ruleConfig.getAutoTables().add(warehouse);
         ruleConfig.getTables().add(new 
ShardingTableRuleConfiguration("t_order", "ds_${0..1}.t_order"));
         ruleConfig.getTables().add(new 
ShardingTableRuleConfiguration("t_order_item", "ds_${0..1}.t_order_item"));
         ShardingTableRuleConfiguration nonCacheableDatabaseSharding = new 
ShardingTableRuleConfiguration("t_non_cacheable_database_sharding", 
"ds_${0..1}.t_non_cacheable_database_sharding");
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
index 7060d9237a8..ed9ba2c91a6 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
@@ -43,6 +43,7 @@ import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShard
 import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.exception.algorithm.keygen.GenerateKeyStrategyNotFoundException;
+import 
org.apache.shardingsphere.sharding.exception.algorithm.sharding.ShardingAlgorithmInitializationException;
 import 
org.apache.shardingsphere.sharding.exception.metadata.InvalidBindingTablesException;
 import 
org.apache.shardingsphere.sharding.exception.metadata.ShardingTableRuleNotFoundException;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
@@ -109,6 +110,52 @@ class ShardingRuleTest {
         assertNull(actual.getDefaultShardingColumn());
     }
     
+    @Test
+    void 
assertNewShardingRuleWithWrongShardingAlgorithmInDefaultDatabaseShardingStrategy()
 {
+        ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+        ruleConfig.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "MOD"));
+        ruleConfig.getShardingAlgorithms().put("MOD", new 
AlgorithmConfiguration("MOD", PropertiesBuilder.build(new 
Property("sharding-count", "2"))));
+        assertThrows(ShardingAlgorithmInitializationException.class, () -> new 
ShardingRule(ruleConfig, Collections.emptyList(), mock(InstanceContext.class)));
+    }
+    
+    @Test
+    void 
assertNewShardingRuleWithWrongShardingAlgorithmInDefaultTableShardingStrategy() 
{
+        ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+        ruleConfig.setDefaultTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "MOD"));
+        ruleConfig.getShardingAlgorithms().put("MOD", new 
AlgorithmConfiguration("MOD", PropertiesBuilder.build(new 
Property("sharding-count", "2"))));
+        assertThrows(ShardingAlgorithmInitializationException.class, () -> new 
ShardingRule(ruleConfig, Collections.emptyList(), mock(InstanceContext.class)));
+    }
+    
+    @Test
+    void 
assertNewShardingRuleWithWrongShardingAlgorithmInDatabaseShardingStrategy() {
+        ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+        ShardingTableRuleConfiguration tableRuleConfig = new 
ShardingTableRuleConfiguration("t_order", "");
+        tableRuleConfig.setDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "MOD"));
+        ruleConfig.getTables().add(tableRuleConfig);
+        ruleConfig.getShardingAlgorithms().put("MOD", new 
AlgorithmConfiguration("MOD", PropertiesBuilder.build(new 
Property("sharding-count", "2"))));
+        assertThrows(ShardingAlgorithmInitializationException.class, () -> new 
ShardingRule(ruleConfig, Collections.emptyList(), mock(InstanceContext.class)));
+    }
+    
+    @Test
+    void 
assertNewShardingRuleWithWrongShardingAlgorithmInTableShardingStrategy() {
+        ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+        ShardingTableRuleConfiguration tableRuleConfig = new 
ShardingTableRuleConfiguration("t_order", "");
+        tableRuleConfig.setTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "MOD"));
+        ruleConfig.getTables().add(tableRuleConfig);
+        ruleConfig.getShardingAlgorithms().put("MOD", new 
AlgorithmConfiguration("MOD", PropertiesBuilder.build(new 
Property("sharding-count", "2"))));
+        assertThrows(ShardingAlgorithmInitializationException.class, () -> new 
ShardingRule(ruleConfig, Collections.emptyList(), mock(InstanceContext.class)));
+    }
+    
+    @Test
+    void 
assertNewShardingRuleWithWrongShardingAlgorithmInAutoTableShardingStrategy() {
+        ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+        ShardingAutoTableRuleConfiguration autoTableRuleConfig = new 
ShardingAutoTableRuleConfiguration("t_order", "ds_0,ds_1");
+        autoTableRuleConfig.setShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "INLINE"));
+        ruleConfig.getAutoTables().add(autoTableRuleConfig);
+        ruleConfig.getShardingAlgorithms().put("INLINE", new 
AlgorithmConfiguration("INLINE", PropertiesBuilder.build(new 
Property("algorithm-expression", "t_order_%{order_id % 2}"))));
+        assertThrows(ShardingAlgorithmInitializationException.class, () -> new 
ShardingRule(ruleConfig, Collections.emptyList(), mock(InstanceContext.class)));
+    }
+    
     @Test
     void assertFindTableRule() {
         
assertTrue(createMaximumShardingRule().findTableRule("logic_Table").isPresent());

Reply via email to