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

tuichenchuxin 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 3719f6e5c8a Refactor StorageUnitBackendHandler. (#22191)
3719f6e5c8a is described below

commit 3719f6e5c8a52b08aa09c74b28c346422f2386d4
Author: Raigor <[email protected]>
AuthorDate: Wed Nov 16 08:58:46 2022 +0800

    Refactor StorageUnitBackendHandler. (#22191)
    
    * Refactor StorageUnitBackendHandler.
    
    * Change method order.
---
 ...nt.java => StorageUnitDefinitionStatement.java} |  4 +-
 .../rdl/alter/AlterStorageUnitStatement.java       |  8 +--
 .../rdl/create/RegisterStorageUnitStatement.java   |  8 +--
 .../rdl/drop/UnregisterStorageUnitStatement.java   | 14 ++---
 .../distsql/rdl/RDLBackendHandlerFactory.java      | 15 +++--
 .../resource/AlterStorageUnitBackendHandler.java   | 34 +++++------
 .../RegisterStorageUnitBackendHandler.java         | 40 +++++++------
 .../rdl/resource/StorageUnitBackendHandler.java    | 16 +++++-
 .../UnregisterStorageUnitBackendHandler.java       | 65 +++++++++++-----------
 .../UnregisterStorageUnitBackendHandlerTest.java   |  6 +-
 .../rdl/alter/AlterStorageUnitStatementAssert.java | 12 ++--
 .../create/RegisterStorageUnitStatementAssert.java | 12 ++--
 .../drop/UnregisterStorageUnitStatementAssert.java | 12 ++--
 13 files changed, 132 insertions(+), 114 deletions(-)

diff --git 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/ResourceDefinitionStatement.java
 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/StorageUnitDefinitionStatement.java
similarity index 88%
copy from 
distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/ResourceDefinitionStatement.java
copy to 
distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/StorageUnitDefinitionStatement.java
index 5a33bdb74db..889021e4388 100644
--- 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/ResourceDefinitionStatement.java
+++ 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/StorageUnitDefinitionStatement.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.distsql.parser.statement.rdl;
 
 /**
- * Resource definition statement.
+ * Storage unit definition statement.
  */
-public abstract class ResourceDefinitionStatement extends RDLStatement {
+public abstract class StorageUnitDefinitionStatement extends RDLStatement {
 }
diff --git 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/alter/AlterStorageUnitStatement.java
 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/alter/AlterStorageUnitStatement.java
index a3a46f1e0a0..12e8de33a5b 100644
--- 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/alter/AlterStorageUnitStatement.java
+++ 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/alter/AlterStorageUnitStatement.java
@@ -20,16 +20,16 @@ package 
org.apache.shardingsphere.distsql.parser.statement.rdl.alter;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
-import 
org.apache.shardingsphere.distsql.parser.statement.rdl.ResourceDefinitionStatement;
+import 
org.apache.shardingsphere.distsql.parser.statement.rdl.StorageUnitDefinitionStatement;
 
 import java.util.Collection;
 
 /**
- * Alter resource statement.
+ * Alter storage unit statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class AlterStorageUnitStatement extends 
ResourceDefinitionStatement {
+public final class AlterStorageUnitStatement extends 
StorageUnitDefinitionStatement {
     
-    private final Collection<DataSourceSegment> dataSources;
+    private final Collection<DataSourceSegment> storageUnits;
 }
diff --git 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/RegisterStorageUnitStatement.java
 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/RegisterStorageUnitStatement.java
index 84e73a17c6f..a255a7b77e8 100644
--- 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/RegisterStorageUnitStatement.java
+++ 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/RegisterStorageUnitStatement.java
@@ -20,16 +20,16 @@ package 
org.apache.shardingsphere.distsql.parser.statement.rdl.create;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
-import 
org.apache.shardingsphere.distsql.parser.statement.rdl.ResourceDefinitionStatement;
+import 
org.apache.shardingsphere.distsql.parser.statement.rdl.StorageUnitDefinitionStatement;
 
 import java.util.Collection;
 
 /**
- * Add resource statement.
+ * Register storage unit statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class RegisterStorageUnitStatement extends 
ResourceDefinitionStatement {
+public final class RegisterStorageUnitStatement extends 
StorageUnitDefinitionStatement {
     
-    private final Collection<DataSourceSegment> dataSources;
+    private final Collection<DataSourceSegment> storageUnits;
 }
diff --git 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/drop/UnregisterStorageUnitStatement.java
 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/drop/UnregisterStorageUnitStatement.java
index 7a8f83de6f4..9e0aad88597 100644
--- 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/drop/UnregisterStorageUnitStatement.java
+++ 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/drop/UnregisterStorageUnitStatement.java
@@ -19,26 +19,24 @@ package 
org.apache.shardingsphere.distsql.parser.statement.rdl.drop;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import 
org.apache.shardingsphere.distsql.parser.statement.rdl.ResourceDefinitionStatement;
+import 
org.apache.shardingsphere.distsql.parser.statement.rdl.StorageUnitDefinitionStatement;
 
 import java.util.Collection;
 
 /**
- * Drop resource statement.
+ * Unregister storage unit statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class UnregisterStorageUnitStatement extends 
ResourceDefinitionStatement {
+public final class UnregisterStorageUnitStatement extends 
StorageUnitDefinitionStatement {
     
     private final boolean ifExists;
     
-    private final Collection<String> names;
+    private final Collection<String> storageUnitNames;
     
     private final boolean ignoreSingleTables;
     
-    public UnregisterStorageUnitStatement(final Collection<String> names, 
final boolean ignoreSingleTables) {
-        this.ifExists = false;
-        this.names = names;
-        this.ignoreSingleTables = ignoreSingleTables;
+    public UnregisterStorageUnitStatement(final Collection<String> 
storageUnitNames, final boolean ignoreSingleTables) {
+        this(false, storageUnitNames, ignoreSingleTables);
     }
 }
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/RDLBackendHandlerFactory.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/RDLBackendHandlerFactory.java
index b8de8f2b29c..0e97de1c536 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/RDLBackendHandlerFactory.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/RDLBackendHandlerFactory.java
@@ -21,12 +21,13 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.RDLStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.RuleDefinitionStatement;
+import 
org.apache.shardingsphere.distsql.parser.statement.rdl.StorageUnitDefinitionStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterStorageUnitStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.create.RegisterStorageUnitStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.drop.UnregisterStorageUnitStatement;
 import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
-import 
org.apache.shardingsphere.proxy.backend.handler.distsql.rdl.resource.RegisterStorageUnitBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.distsql.rdl.resource.AlterStorageUnitBackendHandler;
+import 
org.apache.shardingsphere.proxy.backend.handler.distsql.rdl.resource.RegisterStorageUnitBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.distsql.rdl.resource.UnregisterStorageUnitBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.distsql.rdl.rule.RuleDefinitionBackendHandler;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -45,15 +46,19 @@ public final class RDLBackendHandlerFactory {
      * @return RDL backend handler
      */
     public static ProxyBackendHandler newInstance(final RDLStatement 
sqlStatement, final ConnectionSession connectionSession) {
+        if (sqlStatement instanceof StorageUnitDefinitionStatement) {
+            return 
getStorageUnitBackendHandler((StorageUnitDefinitionStatement) sqlStatement, 
connectionSession);
+        }
+        return new RuleDefinitionBackendHandler<>((RuleDefinitionStatement) 
sqlStatement, connectionSession);
+    }
+    
+    private static ProxyBackendHandler getStorageUnitBackendHandler(final 
StorageUnitDefinitionStatement sqlStatement, final ConnectionSession 
connectionSession) {
         if (sqlStatement instanceof RegisterStorageUnitStatement) {
             return new 
RegisterStorageUnitBackendHandler((RegisterStorageUnitStatement) sqlStatement, 
connectionSession);
         }
         if (sqlStatement instanceof AlterStorageUnitStatement) {
             return new 
AlterStorageUnitBackendHandler((AlterStorageUnitStatement) sqlStatement, 
connectionSession);
         }
-        if (sqlStatement instanceof UnregisterStorageUnitStatement) {
-            return new 
UnregisterStorageUnitBackendHandler((UnregisterStorageUnitStatement) 
sqlStatement, connectionSession);
-        }
-        return new RuleDefinitionBackendHandler<>((RuleDefinitionStatement) 
sqlStatement, connectionSession);
+        return new 
UnregisterStorageUnitBackendHandler((UnregisterStorageUnitStatement) 
sqlStatement, connectionSession);
     }
 }
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/AlterStorageUnitBackendHandler.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/AlterStorageUnitBackendHandler.java
index 2520e36d74e..d3b832c83c8 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/AlterStorageUnitBackendHandler.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/AlterStorageUnitBackendHandler.java
@@ -53,7 +53,7 @@ import java.util.stream.Collectors;
  * Alter storage unit backend handler.
  */
 @Slf4j
-public final class AlterStorageUnitBackendHandler extends 
DatabaseRequiredBackendHandler<AlterStorageUnitStatement> {
+public final class AlterStorageUnitBackendHandler extends 
DatabaseRequiredBackendHandler<AlterStorageUnitStatement> implements 
StorageUnitBackendHandler<AlterStorageUnitStatement> {
     
     private final DatabaseType databaseType;
     
@@ -68,7 +68,7 @@ public final class AlterStorageUnitBackendHandler extends 
DatabaseRequiredBacken
     @Override
     public ResponseHeader execute(final String databaseName, final 
AlterStorageUnitStatement sqlStatement) {
         checkSQLStatement(databaseName, sqlStatement);
-        Map<String, DataSourceProperties> dataSourcePropsMap = 
ResourceSegmentsConverter.convert(databaseType, sqlStatement.getDataSources());
+        Map<String, DataSourceProperties> dataSourcePropsMap = 
ResourceSegmentsConverter.convert(databaseType, sqlStatement.getStorageUnits());
         validator.validate(dataSourcePropsMap);
         try {
             
ProxyContext.getInstance().getContextManager().updateResources(databaseName, 
dataSourcePropsMap);
@@ -79,30 +79,24 @@ public final class AlterStorageUnitBackendHandler extends 
DatabaseRequiredBacken
         return new UpdateResponseHeader(sqlStatement);
     }
     
-    private void checkSQLStatement(final String databaseName, final 
AlterStorageUnitStatement sqlStatement) {
+    @Override
+    public void checkSQLStatement(final String databaseName, final 
AlterStorageUnitStatement sqlStatement) {
         Collection<String> toBeAlteredStorageUnitNames = 
getToBeAlteredStorageUnitNames(sqlStatement);
-        checkToBeAlteredDuplicateStorageUnitNames(toBeAlteredStorageUnitNames);
+        checkDuplicatedStorageUnitNames(toBeAlteredStorageUnitNames);
         checkStorageUnitNameExisted(databaseName, toBeAlteredStorageUnitNames);
         checkDatabase(databaseName, sqlStatement);
     }
     
-    private void checkDatabase(final String databaseName, final 
AlterStorageUnitStatement sqlStatement) {
-        Map<String, DataSource> storageUnits = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources();
-        Collection<String> invalid = 
sqlStatement.getDataSources().stream().collect(Collectors.toMap(DataSourceSegment::getName,
 each -> each)).entrySet().stream()
-                .filter(each -> !isIdenticalDatabase(each.getValue(), 
storageUnits.get(each.getKey()))).map(Entry::getKey).collect(Collectors.toSet());
-        ShardingSpherePreconditions.checkState(invalid.isEmpty(), () -> new 
InvalidResourcesException(Collections.singleton(String.format("Cannot alter the 
database of %s", invalid))));
-    }
-    
     private Collection<String> getToBeAlteredStorageUnitNames(final 
AlterStorageUnitStatement sqlStatement) {
-        return 
sqlStatement.getDataSources().stream().map(DataSourceSegment::getName).collect(Collectors.toList());
+        return 
sqlStatement.getStorageUnits().stream().map(DataSourceSegment::getName).collect(Collectors.toList());
     }
     
-    private void checkToBeAlteredDuplicateStorageUnitNames(final 
Collection<String> storageUnitNames) {
-        Collection<String> duplicateStorageUnitNames = 
getDuplicateStorageUnitNames(storageUnitNames);
-        
ShardingSpherePreconditions.checkState(duplicateStorageUnitNames.isEmpty(), () 
-> new DuplicateResourceException(duplicateStorageUnitNames));
+    private void checkDuplicatedStorageUnitNames(final Collection<String> 
storageUnitNames) {
+        Collection<String> duplicatedStorageUnitNames = 
getDuplicatedStorageUnitNames(storageUnitNames);
+        
ShardingSpherePreconditions.checkState(duplicatedStorageUnitNames.isEmpty(), () 
-> new DuplicateResourceException(duplicatedStorageUnitNames));
     }
     
-    private Collection<String> getDuplicateStorageUnitNames(final 
Collection<String> storageUnitNames) {
+    private Collection<String> getDuplicatedStorageUnitNames(final 
Collection<String> storageUnitNames) {
         return storageUnitNames.stream().filter(each -> 
storageUnitNames.stream().filter(each::equals).count() > 
1).collect(Collectors.toList());
     }
     
@@ -112,6 +106,14 @@ public final class AlterStorageUnitBackendHandler extends 
DatabaseRequiredBacken
         
ShardingSpherePreconditions.checkState(notExistedStorageUnitNames.isEmpty(), () 
-> new MissingRequiredResourcesException(databaseName, 
notExistedStorageUnitNames));
     }
     
+    private void checkDatabase(final String databaseName, final 
AlterStorageUnitStatement sqlStatement) {
+        Map<String, DataSource> storageUnits = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources();
+        Collection<String> invalidStorageUnitNames = 
sqlStatement.getStorageUnits().stream().collect(Collectors.toMap(DataSourceSegment::getName,
 each -> each)).entrySet().stream()
+                .filter(each -> !isIdenticalDatabase(each.getValue(), 
storageUnits.get(each.getKey()))).map(Entry::getKey).collect(Collectors.toSet());
+        
ShardingSpherePreconditions.checkState(invalidStorageUnitNames.isEmpty(),
+                () -> new 
InvalidResourcesException(Collections.singleton(String.format("Cannot alter the 
database of %s", invalidStorageUnitNames))));
+    }
+    
     private boolean isIdenticalDatabase(final DataSourceSegment segment, final 
DataSource dataSource) {
         String hostName = null;
         String port = null;
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java
index dac30460abc..8737eb240aa 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java
@@ -50,7 +50,7 @@ import java.util.stream.Collectors;
  * Register storage unit backend handler.
  */
 @Slf4j
-public final class RegisterStorageUnitBackendHandler extends 
DatabaseRequiredBackendHandler<RegisterStorageUnitStatement> {
+public final class RegisterStorageUnitBackendHandler extends 
DatabaseRequiredBackendHandler<RegisterStorageUnitStatement> implements 
StorageUnitBackendHandler<RegisterStorageUnitStatement> {
     
     private final DatabaseType databaseType;
     
@@ -65,7 +65,7 @@ public final class RegisterStorageUnitBackendHandler extends 
DatabaseRequiredBac
     @Override
     public ResponseHeader execute(final String databaseName, final 
RegisterStorageUnitStatement sqlStatement) {
         checkSQLStatement(databaseName, sqlStatement);
-        Map<String, DataSourceProperties> dataSourcePropsMap = 
ResourceSegmentsConverter.convert(databaseType, sqlStatement.getDataSources());
+        Map<String, DataSourceProperties> dataSourcePropsMap = 
ResourceSegmentsConverter.convert(databaseType, sqlStatement.getStorageUnits());
         validator.validate(dataSourcePropsMap);
         try {
             
ProxyContext.getInstance().getContextManager().addResources(databaseName, 
dataSourcePropsMap);
@@ -76,28 +76,34 @@ public final class RegisterStorageUnitBackendHandler 
extends DatabaseRequiredBac
         return new UpdateResponseHeader(sqlStatement);
     }
     
-    private void checkSQLStatement(final String databaseName, final 
RegisterStorageUnitStatement sqlStatement) {
-        Collection<String> dataSourceNames = new 
ArrayList<>(sqlStatement.getDataSources().size());
-        Collection<String> duplicateDataSourceNames = new 
HashSet<>(sqlStatement.getDataSources().size(), 1);
-        for (DataSourceSegment each : sqlStatement.getDataSources()) {
+    @Override
+    public void checkSQLStatement(final String databaseName, final 
RegisterStorageUnitStatement sqlStatement) {
+        Collection<String> dataSourceNames = new 
ArrayList<>(sqlStatement.getStorageUnits().size());
+        checkDuplicatedDataSourceNames(databaseName, dataSourceNames, 
sqlStatement);
+        checkDuplicatedDataSourceNameWithReadwriteSplittingRule(databaseName, 
dataSourceNames);
+    }
+    
+    private void checkDuplicatedDataSourceNames(final String databaseName, 
final Collection<String> dataSourceNames, final RegisterStorageUnitStatement 
sqlStatement) {
+        Collection<String> duplicatedDataSourceNames = new 
HashSet<>(sqlStatement.getStorageUnits().size(), 1);
+        for (DataSourceSegment each : sqlStatement.getStorageUnits()) {
             if (dataSourceNames.contains(each.getName()) || 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources().containsKey(each.getName()))
 {
-                duplicateDataSourceNames.add(each.getName());
+                duplicatedDataSourceNames.add(each.getName());
             }
             dataSourceNames.add(each.getName());
         }
-        
ShardingSpherePreconditions.checkState(duplicateDataSourceNames.isEmpty(), () 
-> new DuplicateResourceException(duplicateDataSourceNames));
-        checkDuplicateDataSourceNameWithReadwriteSplittingRule(databaseName, 
dataSourceNames);
+        
ShardingSpherePreconditions.checkState(duplicatedDataSourceNames.isEmpty(), () 
-> new DuplicateResourceException(duplicatedDataSourceNames));
     }
     
-    private void checkDuplicateDataSourceNameWithReadwriteSplittingRule(final 
String databaseName, final Collection<String> requiredDataSourceNames) {
-        Optional<ReadwriteSplittingRule> readwriteSplittingRule = 
ProxyContext.getInstance().getDatabase(databaseName).getRuleMetaData().findSingleRule(ReadwriteSplittingRule.class);
-        if (!readwriteSplittingRule.isPresent()) {
+    private void checkDuplicatedDataSourceNameWithReadwriteSplittingRule(final 
String databaseName, final Collection<String> requiredDataSourceNames) {
+        // TODO use SPI to decouple features
+        Optional<ReadwriteSplittingRule> rule = 
ProxyContext.getInstance().getDatabase(databaseName).getRuleMetaData().findSingleRule(ReadwriteSplittingRule.class);
+        if (!rule.isPresent()) {
             return;
         }
-        ReadwriteSplittingRuleConfiguration config = 
(ReadwriteSplittingRuleConfiguration) 
readwriteSplittingRule.get().getConfiguration();
-        Collection<String> existRuleNames = 
config.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
-        Collection<String> duplicateDataSourceNames = 
requiredDataSourceNames.stream().filter(each -> 
existRuleNames.contains(each)).collect(Collectors.toSet());
-        
ShardingSpherePreconditions.checkState(duplicateDataSourceNames.isEmpty(),
-                () -> new 
InvalidResourcesException(Collections.singleton(String.format("%s already 
exists in readwrite splitting", duplicateDataSourceNames))));
+        ReadwriteSplittingRuleConfiguration ruleConfig = 
(ReadwriteSplittingRuleConfiguration) rule.get().getConfiguration();
+        Collection<String> existedRuleNames = 
ruleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
+        Collection<String> duplicatedDataSourceNames = 
requiredDataSourceNames.stream().filter(existedRuleNames::contains).collect(Collectors.toSet());
+        
ShardingSpherePreconditions.checkState(duplicatedDataSourceNames.isEmpty(),
+                () -> new 
InvalidResourcesException(Collections.singleton(String.format("%s already 
exists in readwrite splitting", duplicatedDataSourceNames))));
     }
 }
diff --git 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/ResourceDefinitionStatement.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/StorageUnitBackendHandler.java
similarity index 62%
rename from 
distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/ResourceDefinitionStatement.java
rename to 
proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/StorageUnitBackendHandler.java
index 5a33bdb74db..5f5c411d06c 100644
--- 
a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/ResourceDefinitionStatement.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/StorageUnitBackendHandler.java
@@ -15,10 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.distsql.parser.statement.rdl;
+package org.apache.shardingsphere.proxy.backend.handler.distsql.rdl.resource;
+
+import 
org.apache.shardingsphere.distsql.parser.statement.rdl.StorageUnitDefinitionStatement;
 
 /**
- * Resource definition statement.
+ * Storage unit backend handler.
  */
-public abstract class ResourceDefinitionStatement extends RDLStatement {
+public interface StorageUnitBackendHandler<T extends 
StorageUnitDefinitionStatement> {
+    
+    /**
+     * Check SQL statement.
+     *
+     * @param databaseName database name
+     * @param sqlStatement SQL statement
+     */
+    void checkSQLStatement(String databaseName, T sqlStatement);
 }
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandler.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandler.java
index 063a2c456d3..b7af8365bc1 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandler.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandler.java
@@ -49,7 +49,7 @@ import java.util.stream.Collectors;
  * Unregister storage unit backend handler.
  */
 @Slf4j
-public final class UnregisterStorageUnitBackendHandler extends 
DatabaseRequiredBackendHandler<UnregisterStorageUnitStatement> {
+public final class UnregisterStorageUnitBackendHandler extends 
DatabaseRequiredBackendHandler<UnregisterStorageUnitStatement> implements 
StorageUnitBackendHandler<UnregisterStorageUnitStatement> {
     
     public UnregisterStorageUnitBackendHandler(final 
UnregisterStorageUnitStatement sqlStatement, final ConnectionSession 
connectionSession) {
         super(sqlStatement, connectionSession);
@@ -57,10 +57,9 @@ public final class UnregisterStorageUnitBackendHandler 
extends DatabaseRequiredB
     
     @Override
     public ResponseHeader execute(final String databaseName, final 
UnregisterStorageUnitStatement sqlStatement) {
-        Collection<String> toBeDroppedResourceNames = sqlStatement.getNames();
-        check(databaseName, toBeDroppedResourceNames, 
sqlStatement.isIgnoreSingleTables(), sqlStatement.isIfExists());
+        checkSQLStatement(databaseName, sqlStatement);
         try {
-            
ProxyContext.getInstance().getContextManager().dropResources(databaseName, 
toBeDroppedResourceNames);
+            
ProxyContext.getInstance().getContextManager().dropResources(databaseName, 
sqlStatement.getStorageUnitNames());
         } catch (final SQLException | ShardingSphereServerException ex) {
             log.error("Unregister storage unit failed", ex);
             throw new 
InvalidResourcesException(Collections.singleton(ex.getMessage()));
@@ -68,52 +67,42 @@ public final class UnregisterStorageUnitBackendHandler 
extends DatabaseRequiredB
         return new UpdateResponseHeader(sqlStatement);
     }
     
-    private void check(final String databaseName, final Collection<String> 
toBeDroppedResourceNames,
-                       final boolean ignoreSingleTables, final boolean 
allowNotExist) {
-        if (!allowNotExist) {
-            checkResourceNameExisted(databaseName, toBeDroppedResourceNames);
+    @Override
+    public void checkSQLStatement(final String databaseName, final 
UnregisterStorageUnitStatement sqlStatement) {
+        if (!sqlStatement.isIfExists()) {
+            checkExisted(databaseName, sqlStatement.getStorageUnitNames());
         }
-        checkResourceNameNotInUse(databaseName, toBeDroppedResourceNames, 
ignoreSingleTables);
+        checkInUsed(databaseName, sqlStatement);
     }
     
-    private void checkResourceNameExisted(final String databaseName, final 
Collection<String> resourceNames) {
-        Map<String, DataSource> resources = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources();
-        Collection<String> notExistedResourceNames = 
resourceNames.stream().filter(each -> 
!resources.containsKey(each)).collect(Collectors.toList());
-        
ShardingSpherePreconditions.checkState(notExistedResourceNames.isEmpty(), () -> 
new MissingRequiredResourcesException(databaseName, notExistedResourceNames));
+    private void checkExisted(final String databaseName, final 
Collection<String> storageUnitNames) {
+        Map<String, DataSource> dataSources = 
ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources();
+        Collection<String> notExistedStorageUnits = 
storageUnitNames.stream().filter(each -> 
!dataSources.containsKey(each)).collect(Collectors.toList());
+        
ShardingSpherePreconditions.checkState(notExistedStorageUnits.isEmpty(), () -> 
new MissingRequiredResourcesException(databaseName, notExistedStorageUnits));
     }
     
-    private void checkResourceNameNotInUse(final String databaseName, final 
Collection<String> toBeDroppedResourceNames, final boolean ignoreSingleTables) {
-        Multimap<String, String> inUsedMultimap = 
getInUsedResources(databaseName);
-        Collection<String> inUsedResourceNames = inUsedMultimap.keySet();
-        inUsedResourceNames.retainAll(toBeDroppedResourceNames);
-        if (!inUsedResourceNames.isEmpty()) {
-            if (ignoreSingleTables) {
-                checkResourceNameNotInUseIgnoreSingleTableRule(new 
HashSet<>(inUsedResourceNames), inUsedMultimap);
+    private void checkInUsed(final String databaseName, final 
UnregisterStorageUnitStatement sqlStatement) {
+        Multimap<String, String> inUsedStorageUnits = 
getInUsedResources(databaseName);
+        Collection<String> inUsedStorageUnitNames = 
inUsedStorageUnits.keySet();
+        inUsedStorageUnitNames.retainAll(sqlStatement.getStorageUnitNames());
+        if (!inUsedStorageUnitNames.isEmpty()) {
+            if (sqlStatement.isIgnoreSingleTables()) {
+                checkInUsedIgnoreSingleTables(new 
HashSet<>(inUsedStorageUnitNames), inUsedStorageUnits);
             } else {
-                String firstResource = inUsedResourceNames.iterator().next();
-                throw new ResourceInUsedException(firstResource, 
inUsedMultimap.get(firstResource));
+                String firstResource = 
inUsedStorageUnitNames.iterator().next();
+                throw new ResourceInUsedException(firstResource, 
inUsedStorageUnits.get(firstResource));
             }
         }
     }
     
-    private void checkResourceNameNotInUseIgnoreSingleTableRule(final 
Collection<String> inUsedResourceNames, final Multimap<String, String> 
inUsedMultimap) {
-        for (String each : inUsedResourceNames) {
-            Collection<String> inUsedRules = inUsedMultimap.get(each);
-            inUsedRules.remove(SingleTableRule.class.getSimpleName());
-            ShardingSpherePreconditions.checkState(inUsedRules.isEmpty(), () 
-> new ResourceInUsedException(each, inUsedRules));
-        }
-    }
-    
     private Multimap<String, String> getInUsedResources(final String 
databaseName) {
         Multimap<String, String> result = LinkedListMultimap.create();
         for (ShardingSphereRule each : 
ProxyContext.getInstance().getDatabase(databaseName).getRuleMetaData().getRules())
 {
             if (each instanceof DataSourceContainedRule) {
-                Collection<String> inUsedResourceNames = 
getInUsedResourceNames((DataSourceContainedRule) each);
-                inUsedResourceNames.forEach(eachResource -> 
result.put(eachResource, each.getType()));
+                getInUsedResourceNames((DataSourceContainedRule) 
each).forEach(eachResource -> result.put(eachResource, each.getType()));
             }
             if (each instanceof DataNodeContainedRule) {
-                Collection<String> inUsedResourceNames = 
getInUsedResourceNames((DataNodeContainedRule) each);
-                inUsedResourceNames.forEach(eachResource -> 
result.put(eachResource, each.getType()));
+                getInUsedResourceNames((DataNodeContainedRule) 
each).forEach(eachResource -> result.put(eachResource, each.getType()));
             }
         }
         return result;
@@ -134,4 +123,12 @@ public final class UnregisterStorageUnitBackendHandler 
extends DatabaseRequiredB
         }
         return result;
     }
+    
+    private void checkInUsedIgnoreSingleTables(final Collection<String> 
inUsedResourceNames, final Multimap<String, String> inUsedStorageUnits) {
+        for (String each : inUsedResourceNames) {
+            Collection<String> inUsedRules = inUsedStorageUnits.get(each);
+            inUsedRules.remove(SingleTableRule.class.getSimpleName());
+            ShardingSpherePreconditions.checkState(inUsedRules.isEmpty(), () 
-> new ResourceInUsedException(each, inUsedRules));
+        }
+    }
 }
diff --git 
a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandlerTest.java
 
b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandlerTest.java
index a387277d5c1..c2d68553670 100644
--- 
a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandlerTest.java
+++ 
b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandlerTest.java
@@ -104,7 +104,7 @@ public final class UnregisterStorageUnitBackendHandlerTest 
extends ProxyContextR
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("test")).thenReturn(database);
         UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false);
         assertThat(unregisterStorageUnitBackendHandler.execute("test", 
unregisterStorageUnitStatement), instanceOf(UpdateResponseHeader.class));
-        verify(contextManager).dropResources("test", 
unregisterStorageUnitStatement.getNames());
+        verify(contextManager).dropResources("test", 
unregisterStorageUnitStatement.getStorageUnitNames());
     }
     
     @Test(expected = MissingRequiredResourcesException.class)
@@ -148,14 +148,14 @@ public final class 
UnregisterStorageUnitBackendHandlerTest extends ProxyContextR
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("test")).thenReturn(database);
         UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), true);
         assertThat(unregisterStorageUnitBackendHandler.execute("test", 
unregisterStorageUnitStatement), instanceOf(UpdateResponseHeader.class));
-        verify(contextManager).dropResources("test", 
unregisterStorageUnitStatement.getNames());
+        verify(contextManager).dropResources("test", 
unregisterStorageUnitStatement.getStorageUnitNames());
     }
     
     @Test
     public void assertExecuteWithIfExists() throws SQLException {
         UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(true, Collections.singleton("foo_ds"), true);
         assertThat(unregisterStorageUnitBackendHandler.execute("test", 
unregisterStorageUnitStatement), instanceOf(UpdateResponseHeader.class));
-        verify(contextManager).dropResources("test", 
unregisterStorageUnitStatement.getNames());
+        verify(contextManager).dropResources("test", 
unregisterStorageUnitStatement.getStorageUnitNames());
     }
     
     @Test(expected = DistSQLException.class)
diff --git 
a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/alter/AlterStorageUnitStatementAssert.java
 
b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/alter/AlterStorageUnitStatementAssert.java
index a678e2f1d72..ca7eac97b2e 100644
--- 
a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/alter/AlterStorageUnitStatementAssert.java
+++ 
b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/alter/AlterStorageUnitStatementAssert.java
@@ -30,9 +30,9 @@ import java.util.Collection;
 import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
-import static org.hamcrest.MatcherAssert.assertThat;
 
 /**
  * Alter storage unit statement assert.
@@ -41,7 +41,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 public final class AlterStorageUnitStatementAssert {
     
     /**
-     * Assert alter resource statement is correct with expected parser result.
+     * Assert alter storage unit statement is correct with expected parser 
result.
      *
      * @param assertContext assert context
      * @param actual actual alter storage unit statement
@@ -52,16 +52,16 @@ public final class AlterStorageUnitStatementAssert {
             assertNull(assertContext.getText("Actual statement should not 
exist."), actual);
         } else {
             assertNotNull(assertContext.getText("Actual statement should 
exist."), actual);
-            assertDataSources(assertContext, actual.getDataSources(), 
expected.getDataSources());
+            assertDataSources(assertContext, actual.getStorageUnits(), 
expected.getDataSources());
         }
     }
     
     private static void assertDataSources(final SQLCaseAssertContext 
assertContext, final Collection<DataSourceSegment> actual, final 
List<ExpectedDataSource> expected) {
         if (null == expected) {
-            assertNull(assertContext.getText("Actual datasource should not 
exist."), actual);
+            assertNull(assertContext.getText("Actual storage unit should not 
exist."), actual);
         } else {
-            assertNotNull(assertContext.getText("Actual datasource should 
exist."), actual);
-            assertThat(assertContext.getText(String.format("Actual datasource 
size should be %s , but it was %s", expected.size(), actual.size())), 
actual.size(), is(expected.size()));
+            assertNotNull(assertContext.getText("Actual storage unit should 
exist."), actual);
+            assertThat(assertContext.getText(String.format("Actual storage 
unit size should be %s , but it was %s", expected.size(), actual.size())), 
actual.size(), is(expected.size()));
             int count = 0;
             for (DataSourceSegment actualDataSource : actual) {
                 DataSourceAssert.assertIs(assertContext, actualDataSource, 
expected.get(count));
diff --git 
a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/create/RegisterStorageUnitStatementAssert.java
 
b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/create/RegisterStorageUnitStatementAssert.java
index d6464f4ae20..dbdc97d1abc 100644
--- 
a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/create/RegisterStorageUnitStatementAssert.java
+++ 
b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/create/RegisterStorageUnitStatementAssert.java
@@ -30,9 +30,9 @@ import java.util.Collection;
 import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
-import static org.hamcrest.MatcherAssert.assertThat;
 
 /**
  * Register storage unit statement assert.
@@ -41,7 +41,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 public final class RegisterStorageUnitStatementAssert {
     
     /**
-     * Assert add resource statement is correct with expected parser result.
+     * Assert register storage unit statement is correct with expected parser 
result.
      *
      * @param assertContext assert context
      * @param actual actual register storage unit statement
@@ -52,16 +52,16 @@ public final class RegisterStorageUnitStatementAssert {
             assertNull(assertContext.getText("Actual statement should not 
exist."), actual);
         } else {
             assertNotNull(assertContext.getText("Actual statement should 
exist."), actual);
-            assertDataSources(assertContext, actual.getDataSources(), 
expected.getDataSources());
+            assertDataSources(assertContext, actual.getStorageUnits(), 
expected.getDataSources());
         }
     }
     
     private static void assertDataSources(final SQLCaseAssertContext 
assertContext, final Collection<DataSourceSegment> actual, final 
List<ExpectedDataSource> expected) {
         if (null == expected) {
-            assertNull(assertContext.getText("Actual datasource should not 
exist."), actual);
+            assertNull(assertContext.getText("Actual storage unit should not 
exist."), actual);
         } else {
-            assertNotNull(assertContext.getText("Actual datasource should 
exist."), actual);
-            assertThat(assertContext.getText(String.format("Actual datasource 
size should be %s , but it was %s", expected.size(), actual.size())), 
actual.size(), is(expected.size()));
+            assertNotNull(assertContext.getText("Actual storage unit should 
exist."), actual);
+            assertThat(assertContext.getText(String.format("Actual storage 
unit size should be %s , but it was %s", expected.size(), actual.size())), 
actual.size(), is(expected.size()));
             int count = 0;
             for (DataSourceSegment actualDataSource : actual) {
                 DataSourceAssert.assertIs(assertContext, actualDataSource, 
expected.get(count));
diff --git 
a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/drop/UnregisterStorageUnitStatementAssert.java
 
b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/drop/UnregisterStorageUnitStatementAssert.java
index e9ce63b99c0..0c879b59b57 100644
--- 
a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/drop/UnregisterStorageUnitStatementAssert.java
+++ 
b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/distsql/rdl/drop/UnregisterStorageUnitStatementAssert.java
@@ -24,8 +24,8 @@ import 
org.apache.shardingsphere.test.sql.parser.internal.asserts.SQLCaseAssertC
 import 
org.apache.shardingsphere.test.sql.parser.internal.jaxb.cases.domain.statement.distsql.rdl.drop.UnregisterStorageUnitStatementTestCase;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertNull;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertNull;
 
 /**
  * Unregister storage unit statement assert.
@@ -34,7 +34,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 public final class UnregisterStorageUnitStatementAssert {
     
     /**
-     * Assert drop resource statement is correct with expected parser result.
+     * Assert unregister storage unit statement is correct with expected 
parser result.
      *
      * @param assertContext assert context
      * @param actual actual unregister storage unit statement
@@ -42,11 +42,11 @@ public final class UnregisterStorageUnitStatementAssert {
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final UnregisterStorageUnitStatement actual, final 
UnregisterStorageUnitStatementTestCase expected) {
         if (null == expected.getDataSources()) {
-            assertNull(assertContext.getText("Actual resource should not 
exist."), actual);
+            assertNull(assertContext.getText("Actual storage unit should not 
exist."), actual);
         } else {
-            assertThat(assertContext.getText("resource assertion error: "), 
actual.getNames(), is(expected.getDataSources()));
-            assertThat(assertContext.getText("resource assertion error: "), 
actual.isIgnoreSingleTables(), 
is(expected.getIgnoreSingleTables().iterator().next()));
-            assertThat(assertContext.getText("resource assertion error: "), 
actual.isIfExists(), is(expected.isIfExists()));
+            assertThat(assertContext.getText("storage unit assertion error: 
"), actual.getStorageUnitNames(), is(expected.getDataSources()));
+            assertThat(assertContext.getText("storage unit assertion error: 
"), actual.isIgnoreSingleTables(), 
is(expected.getIgnoreSingleTables().iterator().next()));
+            assertThat(assertContext.getText("storage unit assertion error: 
"), actual.isIfExists(), is(expected.isIfExists()));
         }
     }
 }


Reply via email to