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 53509a4  Refactor and standardization of AlterRuleStatementUpdater 
(#11034)
53509a4 is described below

commit 53509a498edf593f1a68e2332e9ddfb59f121762
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Jun 27 15:25:46 2021 +0800

    Refactor and standardization of AlterRuleStatementUpdater (#11034)
    
    * Refactor AlterEncryptRuleStatementUpdater
    
    * Refactor AlterReadwriteSplittingRuleStatementUpdater
    
    * Refactor AlterShardingBindingTableRuleStatementUpdater
    
    * Refactor AlterShardingBroadcastTableRuleStatementUpdater
    
    * Refactor AlterShardingTableRuleStatementUpdater
    
    * Refactor AlterShardingTableRuleStatementUpdater
    
    * Refactor AlterShardingBindingTableRuleStatementUpdater
    
    * Refactor CreateShardingBindingTableRuleStatementUpdater
---
 .../converter/ShardingRuleStatementConverter.java  |   4 +-
 .../parser/segment/BindingTableRuleSegment.java    |  15 ++-
 .../AlterShardingBindingTableRulesStatement.java   |  16 ++-
 .../CreateShardingBindingTableRulesStatement.java  |  16 ++-
 .../updater/AlterEncryptRuleStatementUpdater.java  |  62 +++++----
 ...lterReadwriteSplittingRuleStatementUpdater.java |  87 +++++++------
 ...erShardingBindingTableRuleStatementUpdater.java |  67 +++++-----
 ...ShardingBroadcastTableRuleStatementUpdater.java |  19 ++-
 .../AlterShardingTableRuleStatementUpdater.java    | 140 +++++++++++++--------
 ...teShardingBindingTableRuleStatementUpdater.java |  40 +++---
 .../AlterShardingTableRuleBackendHandlerTest.java  |   3 +-
 ...hardingBindingTableRulesBackendHandlerTest.java |  14 +--
 .../rdl/ShardingBindingTableRuleAssert.java        |   2 +-
 13 files changed, 282 insertions(+), 203 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
index af5a7f2..2100ab9 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
@@ -73,7 +73,7 @@ public final class ShardingRuleStatementConverter {
     public static YamlShardingRuleConfiguration convert(final 
CreateShardingBindingTableRulesStatement sqlStatement) {
         YamlShardingRuleConfiguration result = new 
YamlShardingRuleConfiguration();
         for (BindingTableRuleSegment each : sqlStatement.getRules()) {
-            result.getBindingTables().add(each.getTables());
+            result.getBindingTables().add(each.getTableGroups());
         }
         return result;
     }
@@ -87,7 +87,7 @@ public final class ShardingRuleStatementConverter {
     public static YamlShardingRuleConfiguration convert(final 
AlterShardingBindingTableRulesStatement sqlStatement) {
         YamlShardingRuleConfiguration result = new 
YamlShardingRuleConfiguration();
         for (BindingTableRuleSegment each : sqlStatement.getRules()) {
-            result.getBindingTables().add(each.getTables());
+            result.getBindingTables().add(each.getTableGroups());
         }
         return result;
     }
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
index e482d40..5ed41be 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
@@ -21,6 +21,10 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
 /**
  * Binding table rule segment.
  */
@@ -28,5 +32,14 @@ import 
org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 @Getter
 public final class BindingTableRuleSegment implements ASTNode {
     
-    private final String tables;
+    private final String tableGroups;
+    
+    /**
+     * Get binding tables.
+     * 
+     * @return binding tables
+     */
+    public Collection<String> getBindingTables() {
+        return 
Arrays.stream(tableGroups.split(",")).map(String::trim).collect(Collectors.toList());
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
index 37f6d97..b6fbd48 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
@@ -19,10 +19,11 @@ package 
org.apache.shardingsphere.sharding.distsql.parser.statement;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import 
org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterRuleStatement;
+import 
org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
 
 import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * Alter sharding binding table rules statement.
@@ -32,4 +33,17 @@ import java.util.Collection;
 public final class AlterShardingBindingTableRulesStatement extends 
AlterRuleStatement {
     
     private final Collection<BindingTableRuleSegment> rules;
+    
+    /**
+     * Get binding tables.
+     * 
+     * @return binding tables
+     */
+    public Collection<String> getBindingTables() {
+        Collection<String> result = new LinkedList<>();
+        for (BindingTableRuleSegment each : rules) {
+            result.addAll(each.getBindingTables());
+        }
+        return result;
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
index d1f2d94..3eca763 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
@@ -19,10 +19,11 @@ package 
org.apache.shardingsphere.sharding.distsql.parser.statement;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import 
org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.create.CreateRuleStatement;
+import 
org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
 
 import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * Create sharding binding table rules statement.
@@ -32,4 +33,17 @@ import java.util.Collection;
 public final class CreateShardingBindingTableRulesStatement extends 
CreateRuleStatement {
     
     private final Collection<BindingTableRuleSegment> rules;
+    
+    /**
+     * Get binding tables.
+     *
+     * @return binding tables
+     */
+    public Collection<String> getBindingTables() {
+        Collection<String> result = new LinkedList<>();
+        for (BindingTableRuleSegment each : rules) {
+            result.addAll(each.getBindingTables());
+        }
+        return result;
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
index bd00057..d498638 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
+import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.distsql.parser.segment.EncryptRuleSegment;
@@ -34,6 +35,7 @@ import 
org.apache.shardingsphere.proxy.backend.exception.InvalidEncryptorsExcept
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
@@ -49,29 +51,34 @@ public final class AlterEncryptRuleStatementUpdater 
implements RDLUpdater<AlterE
     
     @Override
     public void checkSQLStatement(final String schemaName, final 
AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration 
currentRuleConfig, final ShardingSphereResource resource) {
+        checkCurrentRuleConfiguration(schemaName, sqlStatement, 
currentRuleConfig);
+        checkToBeAlteredRules(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredEncryptors(sqlStatement);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final 
AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration 
currentRuleConfig) {
         if (null == currentRuleConfig) {
-            throw new EncryptRuleNotExistedException(schemaName, 
getAlteredRuleNames(sqlStatement));
+            throw new EncryptRuleNotExistedException(schemaName, 
getToBeAlteredEncryptTableNames(sqlStatement));
         }
-        checkAlteredTables(schemaName, sqlStatement, currentRuleConfig);
-        checkEncryptors(sqlStatement);
     }
     
-    private void checkAlteredTables(final String schemaName, final 
AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration 
currentRuleConfig) {
-        Collection<String> existTables = getExistTables(currentRuleConfig);
-        Collection<String> notExistTables = 
getAlteredRuleNames(sqlStatement).stream().filter(each -> 
!existTables.contains(each)).collect(Collectors.toList());
-        if (!notExistTables.isEmpty()) {
-            throw new EncryptRuleNotExistedException(schemaName, 
notExistTables);
+    private void checkToBeAlteredRules(final String schemaName, final 
AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration 
currentRuleConfig) {
+        Collection<String> currentEncryptTableNames = 
currentRuleConfig.getTables().stream().map(EncryptTableRuleConfiguration::getName).collect(Collectors.toList());
+        Collection<String> notExistEncryptTableNames = 
getToBeAlteredEncryptTableNames(sqlStatement).stream().filter(each -> 
!currentEncryptTableNames.contains(each)).collect(Collectors.toList());
+        if (!notExistEncryptTableNames.isEmpty()) {
+            throw new EncryptRuleNotExistedException(schemaName, 
notExistEncryptTableNames);
         }
     }
     
-    private Collection<String> getExistTables(final EncryptRuleConfiguration 
encryptRuleConfig) {
-        return 
encryptRuleConfig.getTables().stream().map(EncryptTableRuleConfiguration::getName).collect(Collectors.toList());
+    private Collection<String> getToBeAlteredEncryptTableNames(final 
AlterEncryptRuleStatement sqlStatement) {
+        return 
sqlStatement.getRules().stream().map(EncryptRuleSegment::getTableName).collect(Collectors.toList());
     }
     
-    private void checkEncryptors(final AlterEncryptRuleStatement sqlStatement) 
{
+    private void checkToBeAlteredEncryptors(final AlterEncryptRuleStatement 
sqlStatement) {
         Collection<String> encryptors = new LinkedHashSet<>();
-        sqlStatement.getRules().forEach(each -> 
encryptors.addAll(each.getColumns().stream()
-                .map(column -> 
column.getEncryptor().getName()).collect(Collectors.toSet())));
+        for (EncryptRuleSegment each : sqlStatement.getRules()) {
+            encryptors.addAll(each.getColumns().stream().map(column -> 
column.getEncryptor().getName()).collect(Collectors.toSet()));
+        }
         Collection<String> invalidEncryptors = encryptors.stream().filter(
             each -> 
!TypedSPIRegistry.findRegisteredService(EncryptAlgorithm.class, each, new 
Properties()).isPresent()).collect(Collectors.toList());
         if (!invalidEncryptors.isEmpty()) {
@@ -81,24 +88,25 @@ public final class AlterEncryptRuleStatementUpdater 
implements RDLUpdater<AlterE
     
     @Override
     public void updateCurrentRuleConfiguration(final String schemaName, final 
AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration 
currentRuleConfig) {
-        EncryptRuleConfiguration alteredEncryptRuleConfiguration = new 
YamlRuleConfigurationSwapperEngine()
-                
.swapToRuleConfigurations(Collections.singleton(EncryptRuleStatementConverter.convert(sqlStatement.getRules()))).stream()
-                .map(each -> (EncryptRuleConfiguration) 
each).findFirst().get();
-        drop(sqlStatement, currentRuleConfig);
-        
currentRuleConfig.getTables().addAll(alteredEncryptRuleConfiguration.getTables());
-        
currentRuleConfig.getEncryptors().putAll(alteredEncryptRuleConfiguration.getEncryptors());
+        dropRuleConfiguration(sqlStatement, currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
     }
     
-    private void drop(final AlterEncryptRuleStatement sqlStatement, final 
EncryptRuleConfiguration encryptRuleConfig) {
-        getAlteredRuleNames(sqlStatement).forEach(each -> {
-            EncryptTableRuleConfiguration encryptTableRuleConfig = 
encryptRuleConfig.getTables().stream().filter(tableRule -> 
tableRule.getName().equals(each)).findAny().get();
-            encryptRuleConfig.getTables().remove(encryptTableRuleConfig);
-            encryptTableRuleConfig.getColumns().forEach(column -> 
encryptRuleConfig.getEncryptors().remove(column.getEncryptorName()));
-        });
+    private void dropRuleConfiguration(final AlterEncryptRuleStatement 
sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
+        for (String each : getToBeAlteredEncryptTableNames(sqlStatement)) {
+            Optional<EncryptTableRuleConfiguration> 
toBeRemovedEncryptTableRuleConfig = 
currentRuleConfig.getTables().stream().filter(tableRule -> 
tableRule.getName().equals(each)).findAny();
+            
Preconditions.checkState(toBeRemovedEncryptTableRuleConfig.isPresent());
+            
currentRuleConfig.getTables().remove(toBeRemovedEncryptTableRuleConfig.get());
+            
toBeRemovedEncryptTableRuleConfig.get().getColumns().forEach(column -> 
currentRuleConfig.getEncryptors().remove(column.getEncryptorName()));
+        }
     }
     
-    private Collection<String> getAlteredRuleNames(final 
AlterEncryptRuleStatement sqlStatement) {
-        return 
sqlStatement.getRules().stream().map(EncryptRuleSegment::getTableName).collect(Collectors.toList());
+    private void addRuleConfiguration(final AlterEncryptRuleStatement 
sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
+        Optional<EncryptRuleConfiguration> toBeAlteredRuleConfig = new 
YamlRuleConfigurationSwapperEngine()
+                
.swapToRuleConfigurations(Collections.singleton(EncryptRuleStatementConverter.convert(sqlStatement.getRules()))).stream().map(each
 -> (EncryptRuleConfiguration) each).findFirst();
+        Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+        
currentRuleConfig.getTables().addAll(toBeAlteredRuleConfig.get().getTables());
+        
currentRuleConfig.getEncryptors().putAll(toBeAlteredRuleConfig.get().getEncryptors());
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
index 0e98c41..8621309 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import org.apache.shardingsphere.infra.distsql.RDLUpdater;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
@@ -36,8 +37,8 @@ import 
org.apache.shardingsphere.readwritesplitting.yaml.converter.ReadwriteSpli
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.Optional;
 import java.util.Properties;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -53,69 +54,73 @@ public final class 
AlterReadwriteSplittingRuleStatementUpdater implements RDLUpd
     @Override
     public void checkSQLStatement(final String schemaName, final 
AlterReadwriteSplittingRuleStatement sqlStatement, 
                                   final ReadwriteSplittingRuleConfiguration 
currentRuleConfig, final ShardingSphereResource resource) {
+        checkCurrentRuleConfiguration(schemaName, sqlStatement, 
currentRuleConfig);
+        checkToBeAlteredRules(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredResources(schemaName, sqlStatement, resource);
+        checkToBeAlteredLoadBalancer(sqlStatement);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final 
AlterReadwriteSplittingRuleStatement sqlStatement, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig) {
         if (null == currentRuleConfig) {
-            throw new ReadwriteSplittingRuleNotExistedException(schemaName, 
getAlteredRuleNames(sqlStatement));
+            throw new ReadwriteSplittingRuleNotExistedException(schemaName, 
getToBeAlteredRuleNames(sqlStatement));
+        }
+    }
+    
+    private void checkToBeAlteredRules(final String schemaName, final 
AlterReadwriteSplittingRuleStatement sqlStatement, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+        Collection<String> currentRuleNames = 
currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
+        Collection<String> notExistedRuleNames = 
getToBeAlteredRuleNames(sqlStatement).stream().filter(each -> 
!currentRuleNames.contains(each)).collect(Collectors.toList());
+        if (!notExistedRuleNames.isEmpty()) {
+            throw new ReadwriteSplittingRuleNotExistedException(schemaName, 
notExistedRuleNames);
         }
-        check(schemaName, sqlStatement, getAlteredRuleNames(sqlStatement), 
currentRuleConfig, resource);
     }
     
-    private void check(final String schemaName, final 
AlterReadwriteSplittingRuleStatement sqlStatement,
-                       final Collection<String> alteredRuleNames, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig, final 
ShardingSphereResource resource) {
-        checkAlteredRules(schemaName, alteredRuleNames, currentRuleConfig);
-        checkResources(schemaName, sqlStatement, resource);
-        checkLoadBalancer(sqlStatement);
+    private Collection<String> getToBeAlteredRuleNames(final 
AlterReadwriteSplittingRuleStatement sqlStatement) {
+        return 
sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toSet());
     }
     
-    private void checkAlteredRules(final String schemaName, final 
Collection<String> alteredRuleNames, final ReadwriteSplittingRuleConfiguration 
currentRuleConfig) {
-        Set<String> existRuleNames = 
currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
-        Collection<String> notExistRuleNames = alteredRuleNames.stream()
-                .filter(each -> 
!existRuleNames.contains(each)).collect(Collectors.toList());
-        if (!notExistRuleNames.isEmpty()) {
-            throw new ReadwriteSplittingRuleNotExistedException(schemaName, 
notExistRuleNames);
+    private void checkToBeAlteredLoadBalancer(final 
AlterReadwriteSplittingRuleStatement sqlStatement) {
+        Collection<String> invalidLoadBalances = 
sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getLoadBalancer).distinct()
+                .filter(each -> 
!TypedSPIRegistry.findRegisteredService(ReplicaLoadBalanceAlgorithm.class, 
each, new Properties()).isPresent()).collect(Collectors.toList());
+        if (!invalidLoadBalances.isEmpty()) {
+            throw new InvalidLoadBalancersException(invalidLoadBalances);
         }
     }
     
-    private void checkResources(final String schemaName, final 
AlterReadwriteSplittingRuleStatement sqlStatement, final ShardingSphereResource 
resource) {
+    private void checkToBeAlteredResources(final String schemaName, final 
AlterReadwriteSplittingRuleStatement sqlStatement, final ShardingSphereResource 
resource) {
         Collection<String> resources = new LinkedHashSet<>();
         sqlStatement.getRules().stream().filter(each -> 
Strings.isNullOrEmpty(each.getAutoAwareResource())).forEach(each -> {
             resources.add(each.getWriteDataSource());
             resources.addAll(each.getReadDataSources());
         });
-        Collection<String> notExistResources = 
resource.getNotExistedResources(resources);
-        if (!notExistResources.isEmpty()) {
-            throw new ResourceNotExistedException(schemaName, 
notExistResources);
-        }
-    }
-    
-    private void checkLoadBalancer(final AlterReadwriteSplittingRuleStatement 
sqlStatement) {
-        Collection<String> invalidLoadBalances = 
sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getLoadBalancer).distinct()
-                .filter(each -> 
!TypedSPIRegistry.findRegisteredService(ReplicaLoadBalanceAlgorithm.class, 
each, new Properties()).isPresent()).collect(Collectors.toList());
-        if (!invalidLoadBalances.isEmpty()) {
-            throw new InvalidLoadBalancersException(invalidLoadBalances);
+        Collection<String> notExistedResources = 
resource.getNotExistedResources(resources);
+        if (!notExistedResources.isEmpty()) {
+            throw new ResourceNotExistedException(schemaName, 
notExistedResources);
         }
     }
     
     @Override
     public void updateCurrentRuleConfiguration(final String schemaName, final 
AlterReadwriteSplittingRuleStatement sqlStatement, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig) {
-        ReadwriteSplittingRuleConfiguration alterReadwriteSplittingRuleConfig 
= new YamlRuleConfigurationSwapperEngine()
-                
.swapToRuleConfigurations(Collections.singletonList(ReadwriteSplittingRuleStatementConverter.convert(sqlStatement))).stream()
-                .map(each -> (ReadwriteSplittingRuleConfiguration) 
each).findFirst().get();
-        drop(sqlStatement, currentRuleConfig);
-        
currentRuleConfig.getDataSources().addAll(alterReadwriteSplittingRuleConfig.getDataSources());
-        
currentRuleConfig.getLoadBalancers().putAll(alterReadwriteSplittingRuleConfig.getLoadBalancers());
+        dropRuleConfiguration(sqlStatement, currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
     }
     
-    private void drop(final AlterReadwriteSplittingRuleStatement sqlStatement, 
final ReadwriteSplittingRuleConfiguration ruleConfig) {
-        getAlteredRuleNames(sqlStatement).forEach(each -> {
-            ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig 
= ruleConfig.getDataSources().stream().filter(dataSource -> 
each.equals(dataSource.getName())).findAny().get();
-            ruleConfig.getDataSources().remove(dataSourceRuleConfig);
-            
ruleConfig.getLoadBalancers().remove(dataSourceRuleConfig.getLoadBalancerName());
-        });
+    private void dropRuleConfiguration(final 
AlterReadwriteSplittingRuleStatement sqlStatement, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+        for (String each : getToBeAlteredRuleNames(sqlStatement)) {
+            Optional<ReadwriteSplittingDataSourceRuleConfiguration> 
toBeRemovedDataSourceRuleConfig
+                    = 
currentRuleConfig.getDataSources().stream().filter(dataSource -> 
each.equals(dataSource.getName())).findAny();
+            
Preconditions.checkState(toBeRemovedDataSourceRuleConfig.isPresent());
+            
currentRuleConfig.getDataSources().remove(toBeRemovedDataSourceRuleConfig.get());
+            
currentRuleConfig.getLoadBalancers().remove(toBeRemovedDataSourceRuleConfig.get().getLoadBalancerName());
+        }
     }
     
-    private Collection<String> getAlteredRuleNames(final 
AlterReadwriteSplittingRuleStatement sqlStatement) {
-        return sqlStatement.getRules()
-                
.stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toSet());
+    private void addRuleConfiguration(final 
AlterReadwriteSplittingRuleStatement sqlStatement, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+        Optional<ReadwriteSplittingRuleConfiguration> toBeAlteredRuleConfig = 
new YamlRuleConfigurationSwapperEngine()
+                
.swapToRuleConfigurations(Collections.singletonList(ReadwriteSplittingRuleStatementConverter.convert(sqlStatement))).stream()
+                .map(each -> (ReadwriteSplittingRuleConfiguration) 
each).findFirst();
+        Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+        
currentRuleConfig.getDataSources().addAll(toBeAlteredRuleConfig.get().getDataSources());
+        
currentRuleConfig.getLoadBalancers().putAll(toBeAlteredRuleConfig.get().getLoadBalancers());
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
index 3d82a14..b722ab6 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
-import com.google.common.base.Splitter;
 import org.apache.shardingsphere.infra.distsql.RDLUpdater;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.proxy.backend.exception.DuplicateBindingTablesException;
@@ -31,7 +30,6 @@ import 
org.apache.shardingsphere.sharding.distsql.parser.statement.AlterSharding
 
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -42,55 +40,52 @@ public final class 
AlterShardingBindingTableRuleStatementUpdater implements RDLU
     @Override
     public void checkSQLStatement(final String schemaName, final 
AlterShardingBindingTableRulesStatement sqlStatement, 
                                   final ShardingRuleConfiguration 
currentRuleConfig, final ShardingSphereResource resource) {
+        checkCurrentRuleConfiguration(schemaName, currentRuleConfig);
+        checkToBeAlertedBindingTables(schemaName, sqlStatement, 
currentRuleConfig);
+        checkToBeAlteredDuplicateBindingTables(sqlStatement);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final 
ShardingRuleConfiguration currentRuleConfig) {
         if (null == currentRuleConfig) {
             throw new ShardingBindingTableRuleNotExistsException(schemaName);
         }
-        Collection<String> invalidBindingTables = new HashSet<>();
-        Collection<String> existLogicTables = 
getLogicTables(currentRuleConfig);
-        Collection<String> bindingTables = 
ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables();
-        for (String bindingTable : bindingTables) {
-            for (String logicTable : 
Splitter.on(",").splitToList(bindingTable)) {
-                if (!existLogicTables.contains(logicTable.trim())) {
-                    invalidBindingTables.add(logicTable);
-                }
-            }
-        }
-        if (!invalidBindingTables.isEmpty()) {
-            throw new ShardingTableRuleNotExistedException(schemaName, 
invalidBindingTables);
-        }
-        Collection<String> duplicateBindingTables = 
bindingTables.stream().filter(distinct()).collect(Collectors.toList());
-        if (!duplicateBindingTables.isEmpty()) {
-            throw new DuplicateBindingTablesException(duplicateBindingTables);
-        }
     }
     
-    @Override
-    public void updateCurrentRuleConfiguration(final String schemaName, final 
AlterShardingBindingTableRulesStatement sqlStatement, final 
ShardingRuleConfiguration currentRuleConfig) {
-        Collection<String> bindingTableGroups = 
currentRuleConfig.getBindingTableGroups();
-        bindingTableGroups.clear();
-        
bindingTableGroups.addAll(ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables());
+    private void checkToBeAlertedBindingTables(final String schemaName, final 
AlterShardingBindingTableRulesStatement sqlStatement, final 
ShardingRuleConfiguration currentRuleConfig) {
+        Collection<String> currentLogicTables = 
getCurrentLogicTables(currentRuleConfig);
+        Collection<String> notExistedBindingTables = 
sqlStatement.getBindingTables().stream().filter(each -> 
!currentLogicTables.contains(each)).collect(Collectors.toSet());
+        if (!notExistedBindingTables.isEmpty()) {
+            throw new ShardingTableRuleNotExistedException(schemaName, 
notExistedBindingTables);
+        }
     }
     
-    private Collection<String> getLogicTables(final ShardingRuleConfiguration 
currentRuleConfig) {
+    private Collection<String> getCurrentLogicTables(final 
ShardingRuleConfiguration currentRuleConfig) {
         Collection<String> result = new HashSet<>();
         
result.addAll(currentRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toSet()));
         
result.addAll(currentRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toSet()));
         return result;
     }
     
-    private Predicate<String> distinct() {
-        Collection<String> tables = new HashSet<>();
-        return table -> notEquals(table, tables);
+    private void checkToBeAlteredDuplicateBindingTables(final 
AlterShardingBindingTableRulesStatement sqlStatement) {
+        Collection<String> toBeAlteredBindingTables = new HashSet<>();
+        Collection<String> duplicateBindingTables = 
sqlStatement.getBindingTables().stream().filter(each -> 
!toBeAlteredBindingTables.add(each)).collect(Collectors.toSet());
+        if (!duplicateBindingTables.isEmpty()) {
+            throw new DuplicateBindingTablesException(duplicateBindingTables);
+        }
     }
     
-    private boolean notEquals(final String table, final Collection<String> 
tables) {
-        for (String each : tables) {
-            if (table.equals(each) || (table.length() == each.length() && 
Splitter.on(",").splitToList(each).containsAll(Splitter.on(",").splitToList(table))))
 {
-                return true;
-            }
-        }
-        tables.add(table);
-        return false;
+    @Override
+    public void updateCurrentRuleConfiguration(final String schemaName, final 
AlterShardingBindingTableRulesStatement sqlStatement, final 
ShardingRuleConfiguration currentRuleConfig) {
+        dropRuleConfiguration(currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
+    }
+    
+    private void dropRuleConfiguration(final ShardingRuleConfiguration 
currentRuleConfig) {
+        currentRuleConfig.getBindingTableGroups().clear();
+    }
+    
+    private void addRuleConfiguration(final 
AlterShardingBindingTableRulesStatement sqlStatement, final 
ShardingRuleConfiguration currentRuleConfig) {
+        
currentRuleConfig.getBindingTableGroups().addAll(ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables());
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
index 38b2c50..8f2f43d 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
@@ -23,8 +23,6 @@ import 
org.apache.shardingsphere.proxy.backend.exception.ShardingBroadcastTableR
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.AlterShardingBroadcastTableRulesStatement;
 
-import java.util.Collection;
-
 /**
  * Alter sharding broadcast table rule statement updater.
  */
@@ -33,6 +31,10 @@ public final class 
AlterShardingBroadcastTableRuleStatementUpdater implements RD
     @Override
     public void checkSQLStatement(final String schemaName, final 
AlterShardingBroadcastTableRulesStatement sqlStatement, 
                                   final ShardingRuleConfiguration 
currentRuleConfig, final ShardingSphereResource resource) {
+        checkCurrentRuleConfiguration(schemaName, currentRuleConfig);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final 
ShardingRuleConfiguration currentRuleConfig) {
         if (null == currentRuleConfig) {
             throw new ShardingBroadcastTableRuleNotExistsException(schemaName);
         }
@@ -40,9 +42,16 @@ public final class 
AlterShardingBroadcastTableRuleStatementUpdater implements RD
     
     @Override
     public void updateCurrentRuleConfiguration(final String schemaName, final 
AlterShardingBroadcastTableRulesStatement sqlStatement, final 
ShardingRuleConfiguration currentRuleConfig) {
-        Collection<String> broadcastTables = 
currentRuleConfig.getBroadcastTables();
-        broadcastTables.clear();
-        broadcastTables.addAll(sqlStatement.getTables());
+        dropRuleConfiguration(currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
+    }
+    
+    private void dropRuleConfiguration(final ShardingRuleConfiguration 
currentRuleConfig) {
+        currentRuleConfig.getBroadcastTables().clear();
+    }
+    
+    private void addRuleConfiguration(final 
AlterShardingBroadcastTableRulesStatement sqlStatement, final 
ShardingRuleConfiguration currentRuleConfig) {
+        
currentRuleConfig.getBroadcastTables().addAll(sqlStatement.getTables());
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
index 2fee8ab..7d574b1 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
+import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.infra.distsql.RDLUpdater;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
@@ -41,7 +42,7 @@ import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.Map.Entry;
-import java.util.Objects;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
@@ -59,84 +60,113 @@ public final class AlterShardingTableRuleStatementUpdater 
implements RDLUpdater<
     @Override
     public void checkSQLStatement(final String schemaName, final 
AlterShardingTableRuleStatement sqlStatement, 
                                   final ShardingRuleConfiguration 
currentRuleConfig, final ShardingSphereResource resource) {
-        Collection<String> notExistResources = 
resource.getNotExistedResources(getResources(sqlStatement));
+        checkCurrentRuleConfiguration(schemaName, sqlStatement, 
currentRuleConfig);
+        checkToBeAlteredResources(schemaName, sqlStatement, resource);
+        checkToBeAlteredShardingTables(schemaName, sqlStatement, 
currentRuleConfig);
+        checkToBeAlteredShardingAlgorithm(sqlStatement);
+        checkToBeAlteredKeyGenerators(sqlStatement);
+        checkToBeAlteredDuplicateShardingTables(sqlStatement);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final 
AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration 
currentRuleConfig) {
+        if (null == currentRuleConfig) {
+            throw new ShardingTableRuleNotExistedException(schemaName, 
getToBeAlteredTableNames(sqlStatement));
+        }
+    }
+    
+    private Collection<String> getToBeAlteredTableNames(final 
AlterShardingTableRuleStatement sqlStatement) {
+        return 
sqlStatement.getRules().stream().map(TableRuleSegment::getLogicTable).collect(Collectors.toList());
+    }
+    
+    private void checkToBeAlteredResources(final String schemaName, final 
AlterShardingTableRuleStatement sqlStatement, final ShardingSphereResource 
resource) {
+        Collection<String> notExistResources = 
resource.getNotExistedResources(getToBeAlteredResources(sqlStatement));
         if (!notExistResources.isEmpty()) {
             throw new ResourceNotExistedException(schemaName, 
notExistResources);
         }
-        Collection<String> duplicateTables = getDuplicateTables(sqlStatement);
-        if (!duplicateTables.isEmpty()) {
-            throw new DuplicateTablesException(duplicateTables);
-        }
-        Collection<String> alteredTables = getAlteredTables(sqlStatement);
-        if (null == currentRuleConfig) {
-            throw new ShardingTableRuleNotExistedException(schemaName, 
alteredTables);
-        }
-        Collection<String> existTables = getShardingTables(currentRuleConfig);
-        Collection<String> notExistTables = alteredTables.stream().filter(each 
-> !existTables.contains(each)).collect(Collectors.toList());
-        if (!notExistTables.isEmpty()) {
-            throw new ShardingTableRuleNotExistedException(schemaName, 
notExistTables);
+    }
+    
+    private Collection<String> getToBeAlteredResources(final 
AlterShardingTableRuleStatement sqlStatement) {
+        Collection<String> result = new LinkedHashSet<>();
+        sqlStatement.getRules().forEach(each -> 
result.addAll(each.getDataSources()));
+        return result;
+    }
+    
+    private void checkToBeAlteredShardingTables(final String schemaName, final 
AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration 
currentRuleConfig) {
+        Collection<String> currentShardingTables = 
getCurrentShardingTables(currentRuleConfig);
+        Collection<String> notExistedShardingTables = 
getToBeAlteredTableNames(sqlStatement).stream().filter(each -> 
!currentShardingTables.contains(each)).collect(Collectors.toList());
+        if (!notExistedShardingTables.isEmpty()) {
+            throw new ShardingTableRuleNotExistedException(schemaName, 
notExistedShardingTables);
         }
-        Collection<String> invalidTableAlgorithms = 
sqlStatement.getRules().stream().map(each -> 
each.getTableStrategy().getName()).distinct()
+    }
+    
+    private Collection<String> getCurrentShardingTables(final 
ShardingRuleConfiguration currentRuleConfig) {
+        Collection<String> result = new LinkedList<>();
+        
result.addAll(currentRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
+        
result.addAll(currentRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
+        return result;
+    }
+    
+    private void checkToBeAlteredShardingAlgorithm(final 
AlterShardingTableRuleStatement sqlStatement) {
+        Collection<String> notExistedShardingAlgorithms = 
sqlStatement.getRules().stream().map(each -> 
each.getTableStrategy().getName()).distinct()
                 .filter(each -> 
!TypedSPIRegistry.findRegisteredService(ShardingAlgorithm.class, each, new 
Properties()).isPresent()).collect(Collectors.toList());
-        if (!invalidTableAlgorithms.isEmpty()) {
-            throw new 
InvalidShardingAlgorithmsException(invalidTableAlgorithms);
+        if (!notExistedShardingAlgorithms.isEmpty()) {
+            throw new 
InvalidShardingAlgorithmsException(notExistedShardingAlgorithms);
         }
-        Collection<String> invalidKeyGenerators = 
getKeyGenerators(sqlStatement).stream()
+    }
+    
+    private void checkToBeAlteredKeyGenerators(final 
AlterShardingTableRuleStatement sqlStatement) {
+        Collection<String> notExistedKeyGenerators = 
getToBeAlteredKeyGenerators(sqlStatement).stream().distinct()
                 .filter(each -> 
!TypedSPIRegistry.findRegisteredService(KeyGenerateAlgorithm.class, each, new 
Properties()).isPresent()).collect(Collectors.toList());
-        if (!invalidKeyGenerators.isEmpty()) {
-            throw new InvalidKeyGeneratorsException(invalidKeyGenerators);
+        if (!notExistedKeyGenerators.isEmpty()) {
+            throw new InvalidKeyGeneratorsException(notExistedKeyGenerators);
         }
     }
     
-    @Override
-    public void updateCurrentRuleConfiguration(final String schemaName, final 
AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration 
currentRuleConfig) {
-        ShardingRuleConfiguration alteredShardingRuleConfig = new 
YamlRuleConfigurationSwapperEngine()
-                
.swapToRuleConfigurations(Collections.singletonList(ShardingRuleStatementConverter.convert(sqlStatement))).stream().map(each
 -> (ShardingRuleConfiguration) each).findFirst().get();
-        drop(sqlStatement, currentRuleConfig);
-        
currentRuleConfig.getAutoTables().addAll(alteredShardingRuleConfig.getAutoTables());
-        
currentRuleConfig.getShardingAlgorithms().putAll(alteredShardingRuleConfig.getShardingAlgorithms());
-        
currentRuleConfig.getKeyGenerators().putAll(alteredShardingRuleConfig.getKeyGenerators());
-    }
-    
-    private void drop(final AlterShardingTableRuleStatement sqlStatement, 
final ShardingRuleConfiguration currentRuleConfig) {
-        getAlteredTables(sqlStatement).forEach(each -> {
-            ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig = 
currentRuleConfig.getAutoTables().stream().filter(tableRule -> 
each.equals(tableRule.getLogicTable())).findAny().get();
-            
currentRuleConfig.getAutoTables().remove(shardingAutoTableRuleConfig);
-            
currentRuleConfig.getShardingAlgorithms().remove(shardingAutoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName());
-            if 
(Objects.nonNull(shardingAutoTableRuleConfig.getKeyGenerateStrategy())) {
-                
currentRuleConfig.getKeyGenerators().remove(shardingAutoTableRuleConfig.getKeyGenerateStrategy().getKeyGeneratorName());
-            }
-        });
+    private Collection<String> getToBeAlteredKeyGenerators(final 
AlterShardingTableRuleStatement sqlStatement) {
+        return sqlStatement.getRules().stream().filter(each -> null != 
each.getKeyGenerateStrategy()).map(each -> 
each.getKeyGenerateStrategy().getName()).collect(Collectors.toSet());
+    }
+    
+    private void checkToBeAlteredDuplicateShardingTables(final 
AlterShardingTableRuleStatement sqlStatement) {
+        Collection<String> duplicateTables = getDuplicateTables(sqlStatement);
+        if (!duplicateTables.isEmpty()) {
+            throw new DuplicateTablesException(duplicateTables);
+        }
     }
     
     private Collection<String> getDuplicateTables(final 
AlterShardingTableRuleStatement sqlStatement) {
         return sqlStatement.getRules().stream()
-                .collect(Collectors.toMap(TableRuleSegment::getLogicTable, e 
-> 1, Integer::sum))
+                .collect(Collectors.toMap(TableRuleSegment::getLogicTable, 
entry -> 1, Integer::sum))
                 .entrySet().stream()
                 .filter(entry -> entry.getValue() > 1)
                 .map(Entry::getKey)
                 .collect(Collectors.toList());
     }
     
-    private Collection<String> getAlteredTables(final 
AlterShardingTableRuleStatement sqlStatement) {
-        return 
sqlStatement.getRules().stream().map(TableRuleSegment::getLogicTable).collect(Collectors.toList());
-    }
-    
-    private Collection<String> getShardingTables(final 
ShardingRuleConfiguration shardingRuleConfig) {
-        Collection<String> result = new LinkedList<>();
-        
result.addAll(shardingRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
-        
result.addAll(shardingRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
-        return result;
+    @Override
+    public void updateCurrentRuleConfiguration(final String schemaName, final 
AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration 
currentRuleConfig) {
+        dropRuleConfiguration(sqlStatement, currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
     }
     
-    private Collection<String> getResources(final 
AlterShardingTableRuleStatement sqlStatement) {
-        Collection<String> result = new LinkedHashSet<>();
-        sqlStatement.getRules().forEach(each -> 
result.addAll(each.getDataSources()));
-        return result;
+    private void dropRuleConfiguration(final AlterShardingTableRuleStatement 
sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        for (String each : getToBeAlteredTableNames(sqlStatement)) {
+            Optional<ShardingAutoTableRuleConfiguration> 
shardingAutoTableRuleConfig = 
currentRuleConfig.getAutoTables().stream().filter(tableRule -> 
each.equals(tableRule.getLogicTable())).findAny();
+            Preconditions.checkState(shardingAutoTableRuleConfig.isPresent());
+            
currentRuleConfig.getAutoTables().remove(shardingAutoTableRuleConfig.get());
+            
currentRuleConfig.getShardingAlgorithms().remove(shardingAutoTableRuleConfig.get().getShardingStrategy().getShardingAlgorithmName());
+            if (null != 
shardingAutoTableRuleConfig.get().getKeyGenerateStrategy()) {
+                
currentRuleConfig.getKeyGenerators().remove(shardingAutoTableRuleConfig.get().getKeyGenerateStrategy().getKeyGeneratorName());
+            }
+        }
     }
     
-    private Collection<String> getKeyGenerators(final 
AlterShardingTableRuleStatement sqlStatement) {
-        return sqlStatement.getRules().stream().filter(each -> 
Objects.nonNull(each.getKeyGenerateStrategy())).map(each -> 
each.getKeyGenerateStrategy().getName()).collect(Collectors.toSet());
+    private void addRuleConfiguration(final AlterShardingTableRuleStatement 
sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        Optional<ShardingRuleConfiguration> toBeAlteredRuleConfig = new 
YamlRuleConfigurationSwapperEngine()
+                
.swapToRuleConfigurations(Collections.singleton(ShardingRuleStatementConverter.convert(sqlStatement))).stream().map(each
 -> (ShardingRuleConfiguration) each).findFirst();
+        Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+        
currentRuleConfig.getAutoTables().addAll(toBeAlteredRuleConfig.get().getAutoTables());
+        
currentRuleConfig.getShardingAlgorithms().putAll(toBeAlteredRuleConfig.get().getShardingAlgorithms());
+        
currentRuleConfig.getKeyGenerators().putAll(toBeAlteredRuleConfig.get().getKeyGenerators());
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
index 72354bf..bb4b23d 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
-import com.google.common.base.Splitter;
 import org.apache.shardingsphere.infra.distsql.RDLUpdater;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.proxy.backend.exception.DuplicateBindingTablesException;
@@ -30,9 +29,9 @@ import 
org.apache.shardingsphere.sharding.converter.ShardingRuleStatementConvert
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.CreateShardingBindingTableRulesStatement;
 import 
org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -48,22 +47,16 @@ public final class 
CreateShardingBindingTableRuleStatementUpdater implements RDL
         }
         Collection<String> invalidBindingTables = new HashSet<>();
         Collection<String> existLogicTables = 
getLogicTables(currentRuleConfig);
-        Collection<String> bindingTables = 
ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables();
-        for (String bindingTable : bindingTables) {
-            for (String logicTable : 
Splitter.on(",").splitToList(bindingTable)) {
-                if (!existLogicTables.contains(logicTable.trim())) {
-                    invalidBindingTables.add(logicTable);
-                }
+        Collection<String> bindingTables = sqlStatement.getBindingTables();
+        for (String each : bindingTables) {
+            if (!existLogicTables.contains(each)) {
+                invalidBindingTables.add(each);
             }
         }
         if (!invalidBindingTables.isEmpty()) {
             throw new ShardingTableRuleNotExistedException(schemaName, 
invalidBindingTables);
         }
-        bindingTables.addAll(currentRuleConfig.getBindingTableGroups());
-        Collection<String> duplicateBindingTables = 
bindingTables.stream().filter(distinct()).collect(Collectors.toList());
-        if (!duplicateBindingTables.isEmpty()) {
-            throw new DuplicateBindingTablesException(duplicateBindingTables);
-        }
+        checkToBeCreatedDuplicateBindingTables(sqlStatement, 
currentRuleConfig);
     }
     
     private Collection<String> getLogicTables(final ShardingRuleConfiguration 
currentRuleConfig) {
@@ -73,20 +66,17 @@ public final class 
CreateShardingBindingTableRuleStatementUpdater implements RDL
         return result;
     }
     
-    private Predicate<String> distinct() {
-        Collection<String> tables = new HashSet<>();
-        return table -> notEquals(table, tables);
+    private void checkToBeCreatedDuplicateBindingTables(final 
CreateShardingBindingTableRulesStatement sqlStatement, final 
ShardingRuleConfiguration currentRuleConfig) {
+        Collection<String> toBeCreatedBindingTables = new HashSet<>();
+        Collection<String> duplicateBindingTables = 
sqlStatement.getBindingTables().stream().filter(each -> 
!toBeCreatedBindingTables.add(each)).collect(Collectors.toSet());
+        
duplicateBindingTables.addAll(getCurrentBindingTables(currentRuleConfig).stream().filter(each
 -> !toBeCreatedBindingTables.add(each)).collect(Collectors.toSet()));
+        if (!duplicateBindingTables.isEmpty()) {
+            throw new DuplicateBindingTablesException(duplicateBindingTables);
+        }
     }
     
-    private boolean notEquals(final String table, final Collection<String> 
tables) {
-        for (String each : tables) {
-            if (table.equals(each) || (table.length() == each.length() && 
Splitter.on(",").splitToList(each)
-                    .containsAll(Splitter.on(",").splitToList(table)))) {
-                return true;
-            }
-        }
-        tables.add(table);
-        return false;
+    private Collection<String> getCurrentBindingTables(final 
ShardingRuleConfiguration currentRuleConfig) {
+        return currentRuleConfig.getBindingTableGroups().stream().flatMap(each 
-> 
Arrays.stream(each.split(","))).map(String::trim).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
index 161d5d6..639a69f 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
@@ -109,7 +109,8 @@ public final class AlterShardingTableRuleBackendHandlerTest 
{
     
     @Test(expected = DuplicateTablesException.class)
     public void assertExecuteWithDuplicateTablesInRDL() {
-        TableRuleSegment tableRuleSegment = new TableRuleSegment("t_order", 
Collections.emptyList(), null, null, null, null);
+        TableRuleSegment tableRuleSegment = new TableRuleSegment("t_order", 
Collections.emptyList(), null, new AlgorithmSegment("hash_mod", new 
Properties()), null, null);
+        
when(ruleMetaData.getConfigurations()).thenReturn(buildShardingConfigurations());
         
when(sqlStatement.getRules()).thenReturn(Arrays.asList(tableRuleSegment, 
tableRuleSegment));
         handler.execute("test", sqlStatement);
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
index 43ae8c8..bffc260 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
@@ -117,13 +117,13 @@ public final class 
CreateShardingBindingTableRulesBackendHandlerTest {
     }
     
     private ShardingRuleConfiguration 
buildShardingBindingTableRuleConfiguration() {
-        ShardingRuleConfiguration shardingRuleConfig = new 
ShardingRuleConfiguration();
-        shardingRuleConfig.getTables().add(new 
ShardingTableRuleConfiguration("t_order"));
-        shardingRuleConfig.getTables().add(new 
ShardingTableRuleConfiguration("t_order_item"));
-        shardingRuleConfig.getTables().add(new 
ShardingTableRuleConfiguration("t_1"));
-        shardingRuleConfig.getTables().add(new 
ShardingTableRuleConfiguration("t_2"));
-        shardingRuleConfig.getBindingTableGroups().add("t_order,t_order_item");
-        return shardingRuleConfig;
+        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+        result.getTables().add(new ShardingTableRuleConfiguration("t_order"));
+        result.getTables().add(new 
ShardingTableRuleConfiguration("t_order_item"));
+        result.getTables().add(new ShardingTableRuleConfiguration("t_1"));
+        result.getTables().add(new ShardingTableRuleConfiguration("t_2"));
+        result.getBindingTableGroups().add("t_order,t_order_item");
+        return result;
     }
     
     private CreateShardingBindingTableRulesStatement 
buildShardingTableRuleStatement() {
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
index 33ae1c9..c6e68bd 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
@@ -47,7 +47,7 @@ public final class ShardingBindingTableRuleAssert {
         } else {
             assertNotNull(assertContext.getText("Actual should exist."), 
actual);
             assertThat(assertContext.getText(String.format("`%s`'s sharding 
binding table rule segment assertion error: ",
-                    actual.getClass().getSimpleName())), actual.getTables(), 
is(expected.getTables()));
+                    actual.getClass().getSimpleName())), 
actual.getTableGroups(), is(expected.getTables()));
         }
     }
 }

Reply via email to