You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/01/03 01:24:34 UTC

[shardingsphere] branch master updated: Refactor ifNotExists of CREATE READWRITE_SPLITTING RULE. (#23268)

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 <ya...@163.com>
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