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

jianglongtao 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 addf8dbf2d4 Refactor ifNotExists of CREATE READWRITE_SPLITTING RULE. 
(#23268)
addf8dbf2d4 is described below

commit addf8dbf2d49e68e46cef745fbae2e4a2fe57217
Author: yx9o <[email protected]>
AuthorDate: Tue Jan 3 09:24:27 2023 +0800

    Refactor ifNotExists of CREATE READWRITE_SPLITTING RULE. (#23268)
---
 .../ReadwriteSplittingRuleStatementChecker.java    | 28 ++++++++--------------
 ...eateReadwriteSplittingRuleStatementUpdater.java | 21 +++++++++-------
 2 files changed, 23 insertions(+), 26 deletions(-)

diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
index 144fa45f4cc..37dee289c62 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
@@ -56,13 +56,12 @@ public final class ReadwriteSplittingRuleStatementChecker {
      * @param database database
      * @param segments segments
      * @param currentRuleConfig current rule config
-     * @param duplicatedRuleNames duplicated rule names
      * @param ifNotExists rule if not exists
      */
     public static void checkCreation(final ShardingSphereDatabase database, 
final Collection<ReadwriteSplittingRuleSegment> segments,
-                                     final ReadwriteSplittingRuleConfiguration 
currentRuleConfig, final Collection<String> duplicatedRuleNames, final boolean 
ifNotExists) {
+                                     final ReadwriteSplittingRuleConfiguration 
currentRuleConfig, final boolean ifNotExists) {
         String databaseName = database.getName();
-        checkDuplicateRuleNames(databaseName, segments, currentRuleConfig, 
database.getResourceMetaData(), duplicatedRuleNames, ifNotExists);
+        checkDuplicateRuleNames(databaseName, segments, currentRuleConfig, 
database.getResourceMetaData(), ifNotExists);
         checkDataSourcesExist(databaseName, segments, database);
         checkDuplicatedDataSourceNames(databaseName, segments, 
currentRuleConfig, true);
         checkLoadBalancers(segments);
@@ -103,10 +102,12 @@ public final class ReadwriteSplittingRuleStatementChecker 
{
     }
     
     private static void checkDuplicateRuleNames(final String databaseName, 
final Collection<ReadwriteSplittingRuleSegment> segments, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig,
-                                                final 
ShardingSphereResourceMetaData resourceMetaData, final Collection<String> 
duplicatedRuleNames, final boolean ifNotExists) {
+                                                final 
ShardingSphereResourceMetaData resourceMetaData, final boolean ifNotExists) {
         checkDuplicateRuleNamesWithSelf(databaseName, segments);
-        checkDuplicateRuleNamesWithResourceMetaData(resourceMetaData, 
ifNotExists, duplicatedRuleNames, segments);
-        checkDuplicateRuleNamesWithRuleConfiguration(databaseName, 
currentRuleConfig, ifNotExists, duplicatedRuleNames, segments);
+        checkDuplicateRuleNamesWithResourceMetaData(resourceMetaData, 
segments);
+        if (!ifNotExists) {
+            checkDuplicateRuleNamesWithRuleConfiguration(databaseName, 
currentRuleConfig, segments);
+        }
     }
     
     private static void checkDuplicateRuleNamesWithSelf(final String 
databaseName, final Collection<ReadwriteSplittingRuleSegment> segments) {
@@ -119,32 +120,23 @@ public final class ReadwriteSplittingRuleStatementChecker 
{
                 .filter(each -> each.getValue() > 
1).map(Map.Entry::getKey).collect(Collectors.toSet());
     }
     
-    private static void checkDuplicateRuleNamesWithResourceMetaData(final 
ShardingSphereResourceMetaData resourceMetaData, final boolean ifNotExists, 
final Collection<String> duplicatedRuleNames,
-                                                                    final 
Collection<ReadwriteSplittingRuleSegment> segments) {
+    private static void checkDuplicateRuleNamesWithResourceMetaData(final 
ShardingSphereResourceMetaData resourceMetaData, final 
Collection<ReadwriteSplittingRuleSegment> segments) {
         Collection<String> currentRuleNames = new LinkedList<>();
         if (null != resourceMetaData && null != 
resourceMetaData.getDataSources()) {
             
currentRuleNames.addAll(resourceMetaData.getDataSources().keySet());
         }
         Collection<String> toBeCreatedRuleNames = 
segments.stream().map(ReadwriteSplittingRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
-        if (ifNotExists) {
-            duplicatedRuleNames.addAll(toBeCreatedRuleNames);
-            return;
-        }
         ShardingSpherePreconditions.checkState(toBeCreatedRuleNames.isEmpty(), 
() -> new InvalidRuleConfigurationException("Readwrite splitting", 
toBeCreatedRuleNames,
                 Collections.singleton(String.format("%s already exists in 
storage unit", toBeCreatedRuleNames))));
     }
     
-    private static void checkDuplicateRuleNamesWithRuleConfiguration(final 
String databaseName, final ReadwriteSplittingRuleConfiguration 
currentRuleConfig, final boolean ifNotExists,
-                                                                     final 
Collection<String> duplicatedRuleNames, final 
Collection<ReadwriteSplittingRuleSegment> segments) {
+    private static void checkDuplicateRuleNamesWithRuleConfiguration(final 
String databaseName, final ReadwriteSplittingRuleConfiguration 
currentRuleConfig,
+                                                                     final 
Collection<ReadwriteSplittingRuleSegment> segments) {
         Collection<String> currentRuleNames = new LinkedList<>();
         if (null != currentRuleConfig) {
             
currentRuleNames.addAll(currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toList()));
         }
         Collection<String> toBeCreatedRuleNames = 
segments.stream().map(ReadwriteSplittingRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
-        if (ifNotExists) {
-            duplicatedRuleNames.addAll(toBeCreatedRuleNames);
-            return;
-        }
         ShardingSpherePreconditions.checkState(toBeCreatedRuleNames.isEmpty(), 
() -> new DuplicateRuleException("Readwrite splitting", databaseName, 
toBeCreatedRuleNames));
     }
     
diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdater.java
 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdater.java
index 503955ad537..fa0a9b59a4a 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdater.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdater.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.readwritesplitting.distsql.handler.update;
 import 
org.apache.shardingsphere.distsql.handler.update.RuleDefinitionCreateUpdater;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.handler.checker.ReadwriteSplittingRuleStatementChecker;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.handler.converter.ReadwriteSplittingRuleStatementConverter;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.parser.segment.ReadwriteSplittingRuleSegment;
@@ -27,26 +28,24 @@ import 
org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.Cre
 
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.stream.Collectors;
 
 /**
  * Create readwrite-splitting rule statement updater.
  */
 public final class CreateReadwriteSplittingRuleStatementUpdater implements 
RuleDefinitionCreateUpdater<CreateReadwriteSplittingRuleStatement, 
ReadwriteSplittingRuleConfiguration> {
     
-    private Collection<String> duplicatedRuleNames = new LinkedList<>();
-    
     @Override
     public void checkSQLStatement(final ShardingSphereDatabase database, final 
CreateReadwriteSplittingRuleStatement sqlStatement, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig) {
-        Collection<String> duplicatedRuleNames = new LinkedList<>();
-        ReadwriteSplittingRuleStatementChecker.checkCreation(database, 
sqlStatement.getRules(), currentRuleConfig, duplicatedRuleNames, 
sqlStatement.isIfNotExists());
-        this.duplicatedRuleNames = duplicatedRuleNames;
+        ReadwriteSplittingRuleStatementChecker.checkCreation(database, 
sqlStatement.getRules(), currentRuleConfig, sqlStatement.isIfNotExists());
     }
     
     @Override
     public ReadwriteSplittingRuleConfiguration 
buildToBeCreatedRuleConfiguration(final ReadwriteSplittingRuleConfiguration 
currentRuleConfig,
                                                                                
  final CreateReadwriteSplittingRuleStatement sqlStatement) {
         Collection<ReadwriteSplittingRuleSegment> segments = 
sqlStatement.getRules();
-        if (!duplicatedRuleNames.isEmpty()) {
+        if (sqlStatement.isIfNotExists()) {
+            Collection<String> duplicatedRuleNames = 
getDuplicatedRuleNames(currentRuleConfig, sqlStatement.getRules());
             segments.removeIf(each -> 
duplicatedRuleNames.contains(each.getName()));
         }
         return ReadwriteSplittingRuleStatementConverter.convert(segments);
@@ -54,10 +53,16 @@ public final class 
CreateReadwriteSplittingRuleStatementUpdater implements RuleD
     
     @Override
     public void updateCurrentRuleConfiguration(final 
ReadwriteSplittingRuleConfiguration currentRuleConfig, final 
ReadwriteSplittingRuleConfiguration toBeCreatedRuleConfig) {
+        
currentRuleConfig.getDataSources().addAll(toBeCreatedRuleConfig.getDataSources());
+        
currentRuleConfig.getLoadBalancers().putAll(toBeCreatedRuleConfig.getLoadBalancers());
+    }
+    
+    private Collection<String> getDuplicatedRuleNames(final 
ReadwriteSplittingRuleConfiguration currentRuleConfig, final 
Collection<ReadwriteSplittingRuleSegment> segments) {
+        Collection<String> currentRuleNames = new LinkedList<>();
         if (null != currentRuleConfig) {
-            
currentRuleConfig.getDataSources().addAll(toBeCreatedRuleConfig.getDataSources());
-            
currentRuleConfig.getLoadBalancers().putAll(toBeCreatedRuleConfig.getLoadBalancers());
+            
currentRuleNames.addAll(currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toList()));
         }
+        return 
segments.stream().map(ReadwriteSplittingRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
     }
     
     @Override

Reply via email to