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 a8ad839541e Add ShardingAlgorithm.getAlgorithmStructure() (#23872)
a8ad839541e is described below

commit a8ad839541e599b1d8985c671a82f9f0658a6c7d
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Jan 31 19:09:08 2023 +0800

    Add ShardingAlgorithm.getAlgorithmStructure() (#23872)
    
    * Add ShardingAlgorithm.getAlgorithmStructure()
    
    * Add ShardingAlgorithm.getAlgorithmStructure()
---
 .../shardingsphere/sharding/spi/ShardingAlgorithm.java    | 13 +++++++++++++
 .../sharding/inline/InlineShardingAlgorithm.java          |  6 ++++++
 .../apache/shardingsphere/sharding/rule/ShardingRule.java | 15 ++++++---------
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git 
a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/spi/ShardingAlgorithm.java
 
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/spi/ShardingAlgorithm.java
index 3d92cdae5ed..31146ab95b3 100644
--- 
a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/spi/ShardingAlgorithm.java
+++ 
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/spi/ShardingAlgorithm.java
@@ -19,8 +19,21 @@ package org.apache.shardingsphere.sharding.spi;
 
 import org.apache.shardingsphere.infra.algorithm.ShardingSphereAlgorithm;
 
+import java.util.Optional;
+
 /**
  * Sharding algorithm.
  */
 public interface ShardingAlgorithm extends ShardingSphereAlgorithm {
+    
+    /**
+     * Get algorithm structure.
+     * 
+     * @param dataNodePrefix data node prefix
+     * @param shardingColumn sharding column
+     * @return algorithm structure
+     */
+    default Optional<String> getAlgorithmStructure(final String 
dataNodePrefix, final String shardingColumn) {
+        return Optional.empty();
+    }
 }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithm.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithm.java
index 08f4f7cb6b7..29ecae864c3 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithm.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/inline/InlineShardingAlgorithm.java
@@ -31,6 +31,7 @@ import 
org.apache.shardingsphere.sharding.exception.algorithm.sharding.Mismatche
 import 
org.apache.shardingsphere.sharding.exception.algorithm.sharding.ShardingAlgorithmInitializationException;
 
 import java.util.Collection;
+import java.util.Optional;
 import java.util.Properties;
 
 /**
@@ -96,6 +97,11 @@ public final class InlineShardingAlgorithm implements 
StandardShardingAlgorithm<
         }
     }
     
+    @Override
+    public Optional<String> getAlgorithmStructure(final String dataNodePrefix, 
final String shardingColumn) {
+        return Optional.of(algorithmExpression.replaceFirst(dataNodePrefix, 
"").replaceFirst(shardingColumn, "").replaceAll(" ", ""));
+    }
+    
     @Override
     public String getType() {
         return "INLINE";
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 46d4e6ed631..d8f982f5e41 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
@@ -234,7 +234,7 @@ public final class ShardingRule implements DatabaseRule, 
DataNodeContainedRule,
                 if (!isValidActualDataSourceName(sampleTableRule, tableRule) 
|| !isValidActualTableName(sampleTableRule, tableRule)) {
                     return false;
                 }
-                if (!isValidShardingAlgorithm(sampleTableRule, tableRule, 
true, checkedConfig) || !isValidShardingAlgorithm(sampleTableRule, tableRule, 
false, checkedConfig)) {
+                if (!isBindingShardingAlgorithm(sampleTableRule, tableRule, 
true, checkedConfig) || !isBindingShardingAlgorithm(sampleTableRule, tableRule, 
false, checkedConfig)) {
                     return false;
                 }
             }
@@ -259,21 +259,18 @@ public final class ShardingRule implements DatabaseRule, 
DataNodeContainedRule,
         return true;
     }
     
-    private boolean isValidShardingAlgorithm(final TableRule sampleTableRule, 
final TableRule tableRule, final boolean databaseAlgorithm, final 
BindingTableCheckedConfiguration checkedConfig) {
-        String sampleAlgorithmExpression = 
getAlgorithmExpression(sampleTableRule, databaseAlgorithm, checkedConfig);
-        String algorithmExpression = getAlgorithmExpression(tableRule, 
databaseAlgorithm, checkedConfig);
-        return sampleAlgorithmExpression.equalsIgnoreCase(algorithmExpression);
+    private boolean isBindingShardingAlgorithm(final TableRule 
sampleTableRule, final TableRule tableRule, final boolean databaseAlgorithm, 
final BindingTableCheckedConfiguration checkedConfig) {
+        return getAlgorithmExpression(sampleTableRule, databaseAlgorithm, 
checkedConfig).equals(getAlgorithmExpression(tableRule, databaseAlgorithm, 
checkedConfig));
     }
     
-    private String getAlgorithmExpression(final TableRule tableRule, final 
boolean databaseAlgorithm, final BindingTableCheckedConfiguration 
checkedConfig) {
+    private Optional<String> getAlgorithmExpression(final TableRule tableRule, 
final boolean databaseAlgorithm, final BindingTableCheckedConfiguration 
checkedConfig) {
         ShardingStrategyConfiguration shardingStrategyConfig = 
databaseAlgorithm
                 ? null == tableRule.getDatabaseShardingStrategyConfig() ? 
checkedConfig.getDefaultDatabaseShardingStrategyConfig() : 
tableRule.getDatabaseShardingStrategyConfig()
                 : null == tableRule.getTableShardingStrategyConfig() ? 
checkedConfig.getDefaultTableShardingStrategyConfig() : 
tableRule.getTableShardingStrategyConfig();
         ShardingAlgorithm shardingAlgorithm = 
checkedConfig.getShardingAlgorithms().get(shardingStrategyConfig.getShardingAlgorithmName());
-        String originAlgorithmExpression = null == shardingAlgorithm ? "" : 
shardingAlgorithm.getProps().getProperty("algorithm-expression", "");
-        String sampleDataNodePrefix = databaseAlgorithm ? 
tableRule.getDataSourceDataNode().getPrefix() : 
tableRule.getTableDataNode().getPrefix();
+        String dataNodePrefix = databaseAlgorithm ? 
tableRule.getDataSourceDataNode().getPrefix() : 
tableRule.getTableDataNode().getPrefix();
         String shardingColumn = getShardingColumn(shardingStrategyConfig, 
checkedConfig.getDefaultShardingColumn());
-        return originAlgorithmExpression.replaceFirst(sampleDataNodePrefix, 
"").replaceFirst(shardingColumn, "").replaceAll(" ", "");
+        return null == shardingAlgorithm ? Optional.empty() : 
shardingAlgorithm.getAlgorithmStructure(dataNodePrefix, shardingColumn);
     }
     
     private String getShardingColumn(final ShardingStrategyConfiguration 
shardingStrategyConfig, final String defaultShardingColumn) {

Reply via email to