RaigorJiang commented on code in PR #22040:
URL: https://github.com/apache/shardingsphere/pull/22040#discussion_r1018575891


##########
features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java:
##########
@@ -35,15 +50,125 @@
 public final class ReadwriteSplittingRuleStatementChecker {
     
     /**
-     * Check duplicate resource names for readwrite-splitting rule statement.
+     * Check create readwrite splitting rule statement.
+     *
+     * @param database database
+     * @param segments segments
+     * @param currentRuleConfig current rule config
+     */
+    public static void checkCreation(final ShardingSphereDatabase database, 
final Collection<ReadwriteSplittingRuleSegment> segments, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+        String databaseName = database.getName();
+        checkDuplicateRuleNames(databaseName, segments, currentRuleConfig, 
database.getResourceMetaData());
+        checkResourcesExist(databaseName, segments, database);
+        checkDuplicateResourceNames(databaseName, segments, currentRuleConfig, 
true);
+        checkLoadBalancers(segments);
+    }
+    
+    /**
+     *  Check alter readwrite splitting rule statement.
      * 
-     * @param databaseName database name
+     * @param database database
      * @param segments segments
      * @param currentRuleConfig current rule config
-     * @param isCreating whether is creating
      */
-    public static void checkDuplicateResourceNames(final String databaseName, 
final Collection<ReadwriteSplittingRuleSegment> segments,
-                                                   final 
ReadwriteSplittingRuleConfiguration currentRuleConfig, final boolean 
isCreating) {
+    public static void checkAlteration(final ShardingSphereDatabase database, 
final Collection<ReadwriteSplittingRuleSegment> segments, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+        String databaseName = database.getName();
+        checkRuleConfigurationExist(database, currentRuleConfig);
+        checkDuplicateRuleNamesWithSelf(databaseName, segments);
+        checkRuleNamesExist(segments, currentRuleConfig, databaseName);
+        checkResourcesExist(databaseName, segments, database);
+        checkDuplicateResourceNames(databaseName, segments, currentRuleConfig, 
false);
+        checkLoadBalancers(segments);
+    }
+    
+    /**
+     *  Check current rule configuration exist.
+     * 
+     * @param database database
+     * @param currentRuleConfig current rule config
+     */
+    public static void checkRuleConfigurationExist(final 
ShardingSphereDatabase database, final ReadwriteSplittingRuleConfiguration 
currentRuleConfig) {
+        ShardingSpherePreconditions.checkNotNull(currentRuleConfig, () -> new 
MissingRequiredRuleException("Readwrite splitting", database.getName()));
+    }
+    
+    private static void checkRuleNamesExist(final 
Collection<ReadwriteSplittingRuleSegment> segments, final 
ReadwriteSplittingRuleConfiguration currentRuleConfig, final String 
databaseName) {
+        Collection<String> requiredRuleNames = 
segments.stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toList());
+        Collection<String> currentRuleNames = 
currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toList());
+        Collection<String> notExistRuleNames = 
requiredRuleNames.stream().filter(each -> 
!currentRuleNames.contains(each)).collect(Collectors.toSet());
+        ShardingSpherePreconditions.checkState(notExistRuleNames.isEmpty(), () 
-> new MissingRequiredRuleException(databaseName, notExistRuleNames));
+    }
+    
+    private static void checkDuplicateRuleNames(final String databaseName, 
final Collection<ReadwriteSplittingRuleSegment> segments,
+                                                final 
ReadwriteSplittingRuleConfiguration currentRuleConfig, final 
ShardingSphereResourceMetaData resourceMetaData) {
+        checkDuplicateRuleNamesWithSelf(databaseName, segments);
+        checkDuplicateRuleNamesWithResourceMetaData(segments, 
resourceMetaData);
+        checkDuplicateRuleNamesWithRuleConfiguration(databaseName, segments, 
currentRuleConfig);
+    }
+    
+    private static void checkDuplicateRuleNamesWithSelf(final String 
databaseName, final Collection<ReadwriteSplittingRuleSegment> segments) {
+        Collection<String> requiredRuleNames = 
segments.stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toList());
+        Collection<String> duplicateRuleNames = 
getDuplicate(requiredRuleNames);
+        ShardingSpherePreconditions.checkState(duplicateRuleNames.isEmpty(), 
() -> new DuplicateRuleException("Readwrite splitting", databaseName, 
duplicateRuleNames));
+    }
+    
+    private static Collection<String> getDuplicate(final Collection<String> 
require) {
+        return require.stream().collect(Collectors.groupingBy(each -> each, 
Collectors.counting())).entrySet().stream()
+                .filter(each -> each.getValue() > 
1).map(Map.Entry::getKey).collect(Collectors.toSet());
+    }
+    
+    private static void checkDuplicateRuleNamesWithResourceMetaData(final 
Collection<ReadwriteSplittingRuleSegment> segments, final 
ShardingSphereResourceMetaData resourceMetaData) {
+        Collection<String> currentRuleNames = new LinkedList<>();
+        if (null != resourceMetaData && null != 
resourceMetaData.getDataSources()) {
+            
currentRuleNames.addAll(resourceMetaData.getDataSources().keySet());
+        }
+        Collection<String> duplicateRuleNames = 
segments.stream().map(ReadwriteSplittingRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
+        ShardingSpherePreconditions.checkState(duplicateRuleNames.isEmpty(), 
() -> new InvalidRuleConfigurationException("Readwrite splitting", 
duplicateRuleNames,
+                Collections.singleton(String.format("%s already exists in 
resource", duplicateRuleNames))));

Review Comment:
   The prompt information needs to be optimized



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to