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

duanzhengqiang 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 ad4ac701d01 Add inline sharding algorithms match actual data nodes 
check (#30917)
ad4ac701d01 is described below

commit ad4ac701d0118eb6f53c58581311051af7d70da4
Author: ZhangCheng <[email protected]>
AuthorDate: Tue Apr 16 18:48:15 2024 +0800

    Add inline sharding algorithms match actual data nodes check (#30917)
---
 .../shardingsphere/sharding/rule/ShardingRule.java |  87 +---------
 .../sharding/rule/checker/ShardingRuleChecker.java | 185 +++++++++++++++++++++
 .../checker/ShardingRouteCacheableCheckerTest.java |   4 +-
 .../sharding/rule/ShardingRuleTest.java            |  38 +++++
 4 files changed, 230 insertions(+), 84 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 1ded6e4ba4e..a51e40b2da6 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,11 +49,10 @@ import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingS
 import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.api.sharding.ShardingAutoTableAlgorithm;
 import org.apache.shardingsphere.sharding.cache.ShardingCache;
-import 
org.apache.shardingsphere.sharding.exception.metadata.DuplicateSharingActualDataNodeException;
-import 
org.apache.shardingsphere.sharding.exception.metadata.InvalidBindingTablesException;
 import 
org.apache.shardingsphere.sharding.exception.metadata.ShardingTableRuleNotFoundException;
 import 
org.apache.shardingsphere.sharding.rule.attribute.ShardingDataNodeRuleAttribute;
 import 
org.apache.shardingsphere.sharding.rule.attribute.ShardingTableNamesRuleAttribute;
+import org.apache.shardingsphere.sharding.rule.checker.ShardingRuleChecker;
 import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
 import org.apache.shardingsphere.sharding.spi.ShardingAuditAlgorithm;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
@@ -68,7 +67,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
@@ -76,7 +74,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.Set;
 import java.util.TreeSet;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -117,6 +114,8 @@ public final class ShardingRule implements DatabaseRule {
     
     private final RuleAttributes attributes;
     
+    private final ShardingRuleChecker shardingRuleChecker = new 
ShardingRuleChecker(this);
+    
     public ShardingRule(final ShardingRuleConfiguration ruleConfig, final 
Map<String, DataSource> dataSources, final InstanceContext instanceContext) {
         configuration = ruleConfig;
         this.dataSourceNames = getDataSourceNames(ruleConfig.getTables(), 
ruleConfig.getAutoTables(), dataSources.keySet());
@@ -125,7 +124,6 @@ public final class ShardingRule implements DatabaseRule {
         ruleConfig.getAuditors().forEach((key, value) -> auditors.put(key, 
TypedSPILoader.getService(ShardingAuditAlgorithm.class, value.getType(), 
value.getProps())));
         shardingTables.putAll(createShardingTables(ruleConfig.getTables(), 
ruleConfig.getDefaultKeyGenerateStrategy()));
         
shardingTables.putAll(createShardingAutoTables(ruleConfig.getAutoTables(), 
ruleConfig.getDefaultKeyGenerateStrategy()));
-        validateUniqueActualDataNodesInTableRules();
         
bindingTableRules.putAll(createBindingTableRules(ruleConfig.getBindingTableGroups()));
         defaultDatabaseShardingStrategyConfig = 
createDefaultDatabaseShardingStrategyConfiguration(ruleConfig);
         defaultTableShardingStrategyConfig = 
createDefaultTableShardingStrategyConfiguration(ruleConfig);
@@ -134,25 +132,13 @@ public final class ShardingRule implements DatabaseRule {
                 ? TypedSPILoader.getService(KeyGenerateAlgorithm.class, null)
                 : 
keyGenerators.get(ruleConfig.getDefaultKeyGenerateStrategy().getKeyGeneratorName());
         defaultShardingColumn = ruleConfig.getDefaultShardingColumn();
-        
ShardingSpherePreconditions.checkState(isValidBindingTableConfiguration(shardingTables,
 new BindingTableCheckedConfiguration(this.dataSourceNames, shardingAlgorithms,
-                ruleConfig.getBindingTableGroups(), 
defaultDatabaseShardingStrategyConfig, defaultTableShardingStrategyConfig, 
defaultShardingColumn)),
-                InvalidBindingTablesException::new);
         
keyGenerators.values().stream().filter(InstanceContextAware.class::isInstance).forEach(each
 -> ((InstanceContextAware) each).setInstanceContext(instanceContext));
         if (defaultKeyGenerateAlgorithm instanceof InstanceContextAware && -1 
== instanceContext.getWorkerId()) {
             ((InstanceContextAware) 
defaultKeyGenerateAlgorithm).setInstanceContext(instanceContext);
         }
         shardingCache = null == ruleConfig.getShardingCache() ? null : new 
ShardingCache(ruleConfig.getShardingCache(), this);
         attributes = new RuleAttributes(new 
ShardingDataNodeRuleAttribute(shardingTables), new 
ShardingTableNamesRuleAttribute(shardingTables.values()));
-    }
-    
-    private void validateUniqueActualDataNodesInTableRules() {
-        Set<DataNode> uniqueActualDataNodes = new 
HashSet<>(shardingTables.size(), 1L);
-        shardingTables.forEach((key, value) -> {
-            DataNode sampleActualDataNode = 
value.getActualDataNodes().iterator().next();
-            
ShardingSpherePreconditions.checkState(!uniqueActualDataNodes.contains(sampleActualDataNode),
-                    () -> new DuplicateSharingActualDataNodeException(key, 
sampleActualDataNode.getDataSourceName(), sampleActualDataNode.getTableName()));
-            uniqueActualDataNodes.add(sampleActualDataNode);
-        });
+        shardingRuleChecker.check(ruleConfig);
     }
     
     private ShardingStrategyConfiguration 
createDefaultDatabaseShardingStrategyConfiguration(final 
ShardingRuleConfiguration ruleConfig) {
@@ -248,71 +234,6 @@ public final class ShardingRule implements DatabaseRule {
         return result;
     }
     
-    private boolean isValidBindingTableConfiguration(final Map<String, 
ShardingTable> shardingTables, final BindingTableCheckedConfiguration 
checkedConfig) {
-        for (ShardingTableReferenceRuleConfiguration each : 
checkedConfig.getBindingTableGroups()) {
-            Collection<String> bindingTables = 
Splitter.on(",").trimResults().splitToList(each.getReference());
-            if (bindingTables.size() <= 1) {
-                continue;
-            }
-            Iterator<String> iterator = bindingTables.iterator();
-            ShardingTable sampleShardingTable = 
getShardingTable(iterator.next(), shardingTables);
-            while (iterator.hasNext()) {
-                ShardingTable shardingTable = 
getShardingTable(iterator.next(), shardingTables);
-                if (!isValidActualDataSourceName(sampleShardingTable, 
shardingTable) || !isValidActualTableName(sampleShardingTable, shardingTable)) {
-                    return false;
-                }
-                if (!isBindingShardingAlgorithm(sampleShardingTable, 
shardingTable, true, checkedConfig) || 
!isBindingShardingAlgorithm(sampleShardingTable, shardingTable, false, 
checkedConfig)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-    
-    private boolean isValidActualDataSourceName(final ShardingTable 
sampleShardingTable, final ShardingTable shardingTable) {
-        return 
sampleShardingTable.getActualDataSourceNames().equals(shardingTable.getActualDataSourceNames());
-    }
-    
-    private boolean isValidActualTableName(final ShardingTable 
sampleShardingTable, final ShardingTable shardingTable) {
-        for (String each : sampleShardingTable.getActualDataSourceNames()) {
-            Collection<String> sampleActualTableNames =
-                    
sampleShardingTable.getActualTableNames(each).stream().map(actualTableName -> 
actualTableName.replace(sampleShardingTable.getTableDataNode().getPrefix(), ""))
-                            .collect(Collectors.toSet());
-            Collection<String> actualTableNames =
-                    
shardingTable.getActualTableNames(each).stream().map(optional -> 
optional.replace(shardingTable.getTableDataNode().getPrefix(), 
"")).collect(Collectors.toSet());
-            if (!sampleActualTableNames.equals(actualTableNames)) {
-                return false;
-            }
-        }
-        return true;
-    }
-    
-    private boolean isBindingShardingAlgorithm(final ShardingTable 
sampleShardingTable, final ShardingTable shardingTable, final boolean 
databaseAlgorithm,
-                                               final 
BindingTableCheckedConfiguration checkedConfig) {
-        return getAlgorithmExpression(sampleShardingTable, databaseAlgorithm, 
checkedConfig).equals(getAlgorithmExpression(shardingTable, databaseAlgorithm, 
checkedConfig));
-    }
-    
-    private Optional<String> getAlgorithmExpression(final ShardingTable 
shardingTable, final boolean databaseAlgorithm, final 
BindingTableCheckedConfiguration checkedConfig) {
-        ShardingStrategyConfiguration shardingStrategyConfig = 
databaseAlgorithm
-                ? getDatabaseShardingStrategyConfiguration(shardingTable, 
checkedConfig.getDefaultDatabaseShardingStrategyConfig())
-                : getTableShardingStrategyConfiguration(shardingTable, 
checkedConfig.getDefaultTableShardingStrategyConfig());
-        ShardingAlgorithm shardingAlgorithm = 
checkedConfig.getShardingAlgorithms().get(shardingStrategyConfig.getShardingAlgorithmName());
-        String dataNodePrefix = databaseAlgorithm ? 
shardingTable.getDataSourceDataNode().getPrefix() : 
shardingTable.getTableDataNode().getPrefix();
-        String shardingColumn = getShardingColumn(shardingStrategyConfig, 
checkedConfig.getDefaultShardingColumn());
-        return null == shardingAlgorithm ? Optional.empty() : 
shardingAlgorithm.getAlgorithmStructure(dataNodePrefix, shardingColumn);
-    }
-    
-    private String getShardingColumn(final ShardingStrategyConfiguration 
shardingStrategyConfig, final String defaultShardingColumn) {
-        String shardingColumn = defaultShardingColumn;
-        if (shardingStrategyConfig instanceof 
ComplexShardingStrategyConfiguration) {
-            shardingColumn = ((ComplexShardingStrategyConfiguration) 
shardingStrategyConfig).getShardingColumns();
-        }
-        if (shardingStrategyConfig instanceof 
StandardShardingStrategyConfiguration) {
-            shardingColumn = ((StandardShardingStrategyConfiguration) 
shardingStrategyConfig).getShardingColumn();
-        }
-        return null == shardingColumn ? "" : shardingColumn;
-    }
-    
     /**
      * Get database sharding strategy configuration.
      *
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/checker/ShardingRuleChecker.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/checker/ShardingRuleChecker.java
new file mode 100644
index 00000000000..0cf3433246f
--- /dev/null
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/checker/ShardingRuleChecker.java
@@ -0,0 +1,185 @@
+/*
+ * 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.
+ */
+
+package org.apache.shardingsphere.sharding.rule.checker;
+
+import com.google.common.base.Splitter;
+import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.infra.algorithm.core.exception.AlgorithmInitializationException;
+import org.apache.shardingsphere.infra.datanode.DataNode;
+import org.apache.shardingsphere.infra.datanode.DataNodeInfo;
+import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.sharding.algorithm.sharding.inline.InlineShardingAlgorithm;
+import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableReferenceRuleConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ComplexShardingStrategyConfiguration;
+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.api.sharding.standard.PreciseShardingValue;
+import 
org.apache.shardingsphere.sharding.exception.metadata.DuplicateSharingActualDataNodeException;
+import 
org.apache.shardingsphere.sharding.exception.metadata.InvalidBindingTablesException;
+import 
org.apache.shardingsphere.sharding.exception.metadata.ShardingTableRuleNotFoundException;
+import 
org.apache.shardingsphere.sharding.rule.BindingTableCheckedConfiguration;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import org.apache.shardingsphere.sharding.rule.ShardingTable;
+import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+public class ShardingRuleChecker {
+    
+    private final ShardingRule shardingRule;
+    
+    /**
+     * Check sharding rule.
+     *
+     * @param ruleConfig sharding rule configuration
+     */
+    public void check(final ShardingRuleConfiguration ruleConfig) {
+        checkUniqueActualDataNodesInTableRules();
+        checkBindingTableConfiguration(ruleConfig);
+        checkInlineShardingAlgorithmsInTableRules();
+    }
+    
+    private void checkUniqueActualDataNodesInTableRules() {
+        Set<DataNode> uniqueActualDataNodes = new 
HashSet<>(shardingRule.getShardingTables().size(), 1L);
+        shardingRule.getShardingTables().forEach((key, value) -> {
+            DataNode sampleActualDataNode = 
value.getActualDataNodes().iterator().next();
+            
ShardingSpherePreconditions.checkState(!uniqueActualDataNodes.contains(sampleActualDataNode),
+                    () -> new DuplicateSharingActualDataNodeException(key, 
sampleActualDataNode.getDataSourceName(), sampleActualDataNode.getTableName()));
+            uniqueActualDataNodes.add(sampleActualDataNode);
+        });
+    }
+    
+    private void checkBindingTableConfiguration(final 
ShardingRuleConfiguration ruleConfig) {
+        ShardingSpherePreconditions.checkState(
+                
isValidBindingTableConfiguration(shardingRule.getShardingTables(), new 
BindingTableCheckedConfiguration(shardingRule.getDataSourceNames(), 
shardingRule.getShardingAlgorithms(),
+                        ruleConfig.getBindingTableGroups(), 
shardingRule.getDefaultDatabaseShardingStrategyConfig(), 
shardingRule.getDefaultTableShardingStrategyConfig(),
+                        shardingRule.getDefaultShardingColumn())),
+                InvalidBindingTablesException::new);
+    }
+    
+    private boolean isValidBindingTableConfiguration(final Map<String, 
ShardingTable> shardingTables, final BindingTableCheckedConfiguration 
checkedConfig) {
+        for (ShardingTableReferenceRuleConfiguration each : 
checkedConfig.getBindingTableGroups()) {
+            Collection<String> bindingTables = 
Splitter.on(",").trimResults().splitToList(each.getReference());
+            if (bindingTables.size() <= 1) {
+                continue;
+            }
+            Iterator<String> iterator = bindingTables.iterator();
+            ShardingTable sampleShardingTable = 
getShardingTable(iterator.next(), shardingTables);
+            while (iterator.hasNext()) {
+                ShardingTable shardingTable = 
getShardingTable(iterator.next(), shardingTables);
+                if (!isValidActualDataSourceName(sampleShardingTable, 
shardingTable) || !isValidActualTableName(sampleShardingTable, shardingTable)) {
+                    return false;
+                }
+                if (!isBindingShardingAlgorithm(sampleShardingTable, 
shardingTable, true, checkedConfig) || 
!isBindingShardingAlgorithm(sampleShardingTable, shardingTable, false, 
checkedConfig)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+    
+    private ShardingTable getShardingTable(final String logicTableName, final 
Map<String, ShardingTable> shardingTables) {
+        ShardingTable result = shardingTables.get(logicTableName);
+        if (null != result) {
+            return result;
+        }
+        throw new 
ShardingTableRuleNotFoundException(Collections.singleton(logicTableName));
+    }
+    
+    private boolean isValidActualDataSourceName(final ShardingTable 
sampleShardingTable, final ShardingTable shardingTable) {
+        return 
sampleShardingTable.getActualDataSourceNames().equals(shardingTable.getActualDataSourceNames());
+    }
+    
+    private boolean isValidActualTableName(final ShardingTable 
sampleShardingTable, final ShardingTable shardingTable) {
+        for (String each : sampleShardingTable.getActualDataSourceNames()) {
+            Collection<String> sampleActualTableNames =
+                    
sampleShardingTable.getActualTableNames(each).stream().map(actualTableName -> 
actualTableName.replace(sampleShardingTable.getTableDataNode().getPrefix(), ""))
+                            .collect(Collectors.toSet());
+            Collection<String> actualTableNames =
+                    
shardingTable.getActualTableNames(each).stream().map(optional -> 
optional.replace(shardingTable.getTableDataNode().getPrefix(), 
"")).collect(Collectors.toSet());
+            if (!sampleActualTableNames.equals(actualTableNames)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    private boolean isBindingShardingAlgorithm(final ShardingTable 
sampleShardingTable, final ShardingTable shardingTable, final boolean 
databaseAlgorithm,
+                                               final 
BindingTableCheckedConfiguration checkedConfig) {
+        return getAlgorithmExpression(sampleShardingTable, databaseAlgorithm, 
checkedConfig).equals(getAlgorithmExpression(shardingTable, databaseAlgorithm, 
checkedConfig));
+    }
+    
+    private Optional<String> getAlgorithmExpression(final ShardingTable 
shardingTable, final boolean databaseAlgorithm, final 
BindingTableCheckedConfiguration checkedConfig) {
+        ShardingStrategyConfiguration shardingStrategyConfig = 
databaseAlgorithm
+                ? 
shardingRule.getDatabaseShardingStrategyConfiguration(shardingTable)
+                : 
shardingRule.getTableShardingStrategyConfiguration(shardingTable);
+        ShardingAlgorithm shardingAlgorithm = 
checkedConfig.getShardingAlgorithms().get(shardingStrategyConfig.getShardingAlgorithmName());
+        String dataNodePrefix = databaseAlgorithm ? 
shardingTable.getDataSourceDataNode().getPrefix() : 
shardingTable.getTableDataNode().getPrefix();
+        String shardingColumn = getShardingColumn(shardingStrategyConfig, 
shardingRule.getDefaultShardingColumn());
+        return null == shardingAlgorithm ? Optional.empty() : 
shardingAlgorithm.getAlgorithmStructure(dataNodePrefix, shardingColumn);
+    }
+    
+    private String getShardingColumn(final ShardingStrategyConfiguration 
shardingStrategyConfig, final String defaultShardingColumn) {
+        String shardingColumn = defaultShardingColumn;
+        if (shardingStrategyConfig instanceof 
ComplexShardingStrategyConfiguration) {
+            shardingColumn = ((ComplexShardingStrategyConfiguration) 
shardingStrategyConfig).getShardingColumns();
+        }
+        if (shardingStrategyConfig instanceof 
StandardShardingStrategyConfiguration) {
+            shardingColumn = ((StandardShardingStrategyConfiguration) 
shardingStrategyConfig).getShardingColumn();
+        }
+        return null == shardingColumn ? "" : shardingColumn;
+    }
+    
+    private void checkInlineShardingAlgorithmsInTableRules() {
+        shardingRule.getShardingTables().forEach((key, value) -> {
+            validateInlineShardingAlgorithm(value, 
shardingRule.getTableShardingStrategyConfiguration(value), 
value.getTableDataNode());
+            validateInlineShardingAlgorithm(value, 
shardingRule.getDatabaseShardingStrategyConfiguration(value), 
value.getDataSourceDataNode());
+        });
+    }
+    
+    private void validateInlineShardingAlgorithm(final ShardingTable 
shardingTable, final ShardingStrategyConfiguration shardingStrategy, final 
DataNodeInfo dataNodeInfo) {
+        if (null == shardingStrategy) {
+            return;
+        }
+        ShardingAlgorithm shardingAlgorithm = 
shardingRule.getShardingAlgorithms().get(shardingStrategy.getShardingAlgorithmName());
+        if (shardingAlgorithm instanceof InlineShardingAlgorithm) {
+            String shardingColumn = null == 
((StandardShardingStrategyConfiguration) shardingStrategy).getShardingColumn() 
? shardingRule.getDefaultShardingColumn()
+                    : ((StandardShardingStrategyConfiguration) 
shardingStrategy).getShardingColumn();
+            String result = null;
+            try {
+                result = ((InlineShardingAlgorithm) 
shardingAlgorithm).doSharding(Collections.emptySet(),
+                        new 
PreciseShardingValue<Comparable<?>>(shardingTable.getLogicTable(), 
shardingColumn, dataNodeInfo, 1));
+                // CHECKSTYLE:OFF
+            } catch (final Exception ignored) {
+                // CHECKSTYLE:ON
+            }
+            ShardingSpherePreconditions.checkState(null == result || 
result.startsWith(dataNodeInfo.getPrefix()),
+                    () -> new 
AlgorithmInitializationException(shardingAlgorithm, "`%s` sharding algorithm 
configuration of `%s` does not match the actual data nodes",
+                            shardingStrategy.getShardingAlgorithmName(), 
shardingTable.getLogicTable()));
+        }
+    }
+}
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 1807c5b28b5..8a8dd05f4c3 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
@@ -92,6 +92,8 @@ 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.getShardingAlgorithms().put("table-inline",
+                new AlgorithmConfiguration("INLINE", 
PropertiesBuilder.build(new Property("algorithm-expression", 
"t_non_cacheable_table_sharding_${id % 2}"))));
         ruleConfig.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("warehouse_id", "inline"));
         ShardingAutoTableRuleConfiguration warehouse = new 
ShardingAutoTableRuleConfiguration("t_warehouse", "ds_${0..1}");
         warehouse.setShardingStrategy(new 
StandardShardingStrategyConfiguration("id", "mod"));
@@ -102,7 +104,7 @@ class ShardingRouteCacheableCheckerTest {
         nonCacheableDatabaseSharding.setDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("id", "inline"));
         ruleConfig.getTables().add(nonCacheableDatabaseSharding);
         ShardingTableRuleConfiguration nonCacheableTableSharding = new 
ShardingTableRuleConfiguration("t_non_cacheable_table_sharding", 
"ds_0.t_non_cacheable_table_sharding_${0..1}");
-        nonCacheableTableSharding.setTableShardingStrategy(new 
StandardShardingStrategyConfiguration("id", "inline"));
+        nonCacheableTableSharding.setTableShardingStrategy(new 
StandardShardingStrategyConfiguration("id", "table-inline"));
         ruleConfig.getTables().add(nonCacheableTableSharding);
         ruleConfig.setShardingCache(new ShardingCacheConfiguration(100, new 
ShardingCacheOptionsConfiguration(true, 0, 0)));
         return new ShardingRule(ruleConfig, Maps.of("ds_0", new 
MockedDataSource(), "ds_1", new MockedDataSource()),
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 32f22b4bad1..8723fa8cd24 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
@@ -174,6 +174,44 @@ class ShardingRuleTest {
         assertThrows(DuplicateSharingActualDataNodeException.class, () -> new 
ShardingRule(ruleConfig, Collections.emptyMap(), mock(InstanceContext.class)));
     }
     
+    @Test
+    void assertValidateWrongInlineShardingAlgorithmsInTableRules() {
+        ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+        ShardingTableRuleConfiguration tableRuleConfig = new 
ShardingTableRuleConfiguration("t_order", "ds_${0..1}.t_order_tmp_${0..1}");
+        tableRuleConfig.setTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "order_id_inline"));
+        ruleConfig.getTables().add(tableRuleConfig);
+        ruleConfig.getShardingAlgorithms().put("order_id_inline", new 
AlgorithmConfiguration("INLINE", PropertiesBuilder.build(new 
Property("algorithm-expression", "t_order_${order_id % 2}"))));
+        assertThrows(AlgorithmInitializationException.class, () -> new 
ShardingRule(ruleConfig, Collections.emptyMap(), mock(InstanceContext.class)));
+    }
+    
+    @Test
+    void assertValidateInlineShardingAlgorithmsInTableRules() {
+        ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+        ShardingTableRuleConfiguration tableRuleConfig = new 
ShardingTableRuleConfiguration("t_order", "ds_${0..1}.t_order_${0..1}");
+        tableRuleConfig.setTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "order_id_inline"));
+        tableRuleConfig.setDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("user_id", "user_id_inline"));
+        ruleConfig.getTables().add(tableRuleConfig);
+        ShardingTableRuleConfiguration versionTableRuleConfig = new 
ShardingTableRuleConfiguration("t_order", "ds_${0..1}.v2_t_order_${0..1}");
+        versionTableRuleConfig.setTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "order_id_inline"));
+        versionTableRuleConfig.setDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("user_id", "user_id_inline"));
+        ruleConfig.getTables().add(versionTableRuleConfig);
+        ruleConfig.getShardingAlgorithms().put("order_id_inline", new 
AlgorithmConfiguration("INLINE", PropertiesBuilder.build(new 
Property("algorithm-expression", "t_order_${order_id % 2}"))));
+        ruleConfig.getShardingAlgorithms().put("user_id_inline", new 
AlgorithmConfiguration("INLINE", PropertiesBuilder.build(new 
Property("algorithm-expression", "ds_${user_id % 2}"))));
+        new ShardingRule(ruleConfig, Collections.emptyMap(), 
mock(InstanceContext.class, RETURNS_DEEP_STUBS));
+    }
+    
+    @Test
+    void assertValidateInlineShardingAlgorithmsIgnoreExceptionInTableRules() {
+        ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+        ShardingTableRuleConfiguration tableRuleConfig =
+                new ShardingTableRuleConfiguration("t_order_interval", 
"ds_${0..1}.t_order_interval_${(2018..2050)}${(01..12).collect{m 
->m.toString().padLeft(2, '0')}}");
+        tableRuleConfig.setTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "t_order_interval_inline"));
+        ruleConfig.getTables().add(tableRuleConfig);
+        ruleConfig.getShardingAlgorithms().put("t_order_interval_inline",
+                new AlgorithmConfiguration("INLINE", 
PropertiesBuilder.build(new Property("algorithm-expression", 
"t_order_interval_${order_id.substring(0, 6)}"))));
+        new ShardingRule(ruleConfig, Collections.emptyMap(), 
mock(InstanceContext.class, RETURNS_DEEP_STUBS));
+    }
+    
     @Test
     void assertFindTableRule() {
         
assertTrue(createMaximumShardingRule().findShardingTable("logic_Table").isPresent());

Reply via email to