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 20cc50ae010 Revise #19808 (#19950)
20cc50ae010 is described below

commit 20cc50ae010a57fb252362e23cb52bcd795e506a
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Aug 8 00:12:43 2022 +0800

    Revise #19808 (#19950)
    
    * Refactor AbstractReadwriteSplittingRuleConfigurationChecker
    
    * Refactor ReadwriteSplittingRule
---
 ...ReadwriteSplittingRuleConfigurationChecker.java | 43 +++++++----
 .../rule/ReadwriteSplittingRule.java               | 86 ++++++++++++----------
 2 files changed, 73 insertions(+), 56 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
index 157696a1835..3d2381a8fdb 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/AbstractReadwriteSplittingRuleConfigurationChecker.java
@@ -54,30 +54,41 @@ public abstract class 
AbstractReadwriteSplittingRuleConfigurationChecker<T exten
         checkLoadBalancerDataSourceName(databaseName, configs, 
getLoadBalancer(config), rules);
     }
     
-    private void checkDataSources(final String databaseName, final 
Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs,
-                                  final Map<String, DataSource> dataSourceMap, 
final Collection<ShardingSphereRule> rules) {
-        Collection<String> writeDataSourceNames = new HashSet<>();
-        Collection<String> readDataSourceNames = new HashSet<>();
+    private void checkDataSources(final String databaseName,
+                                  final 
Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs, final 
Map<String, DataSource> dataSourceMap, final Collection<ShardingSphereRule> 
rules) {
+        Collection<String> addedWriteDataSourceNames = new HashSet<>();
+        Collection<String> addedReadDataSourceNames = new HashSet<>();
         for (ReadwriteSplittingDataSourceRuleConfiguration each : configs) {
-            
Preconditions.checkArgument(!Strings.isNullOrEmpty(each.getName()), "Name is 
required.");
-            Preconditions.checkState(null != each.getStaticStrategy() || null 
!= each.getDynamicStrategy(),
-                    "No available readwrite-splitting rule configuration in 
database `%s`.", databaseName);
-            Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional 
-> checkStaticStrategy(databaseName, dataSourceMap, writeDataSourceNames, 
readDataSourceNames, optional));
+            
Preconditions.checkArgument(!Strings.isNullOrEmpty(each.getName()), 
"Readwrite-splitting data source name is required.");
+            Preconditions.checkState(null != each.getStaticStrategy() || null 
!= each.getDynamicStrategy(), "No available readwrite-splitting rule 
configuration in database `%s`.", databaseName);
+            Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional 
-> checkStaticStrategy(databaseName, dataSourceMap, addedWriteDataSourceNames, 
addedReadDataSourceNames, optional));
             Optional.ofNullable(each.getDynamicStrategy()).ifPresent(optional 
-> checkDynamicStrategy(rules, optional));
         }
     }
     
-    private void checkStaticStrategy(final String databaseName, final 
Map<String, DataSource> dataSourceMap, final Collection<String> 
writeDataSourceNames,
+    private void checkStaticStrategy(final String databaseName, final 
Map<String, DataSource> dataSourceMap, final Collection<String> 
addedWriteDataSourceNames,
                                      final Collection<String> 
readDataSourceNames, final StaticReadwriteSplittingStrategyConfiguration 
strategyConfig) {
         
Preconditions.checkArgument(!Strings.isNullOrEmpty(strategyConfig.getWriteDataSourceName()),
 "Write data source name is required.");
         
Preconditions.checkArgument(!strategyConfig.getReadDataSourceNames().isEmpty(), 
"Read data source names are required.");
-        Collection<String> inlineWriteNames = new 
InlineExpressionParser(strategyConfig.getWriteDataSourceName()).splitAndEvaluate();
-        inlineWriteNames.forEach(each -> Preconditions.checkState(null != 
dataSourceMap.get(each), "Write data source name `%s` not in database `%s`.", 
each, databaseName));
-        inlineWriteNames.forEach(each -> 
Preconditions.checkState(writeDataSourceNames.add(each), "Can not config 
duplicate write dataSource `%s` in database `%s`.", each, databaseName));
-        for (String readName : readDataSourceNames) {
-            Collection<String> inlineReadNames = new 
InlineExpressionParser(readName).splitAndEvaluate();
-            inlineReadNames.forEach(each -> Preconditions.checkState(null != 
dataSourceMap.get(each), "Read data source name `%s` not in database `%s`.", 
each, databaseName));
-            inlineReadNames.forEach(each -> 
Preconditions.checkState(readDataSourceNames.add(each), "Can not config 
duplicate write dataSource `%s` in database `%s`.", each, databaseName));
+        checkWriteDataSourceNames(databaseName, dataSourceMap, 
addedWriteDataSourceNames, strategyConfig);
+        for (String each : readDataSourceNames) {
+            checkReadeDataSourceNames(databaseName, dataSourceMap, 
readDataSourceNames, each);
+        }
+    }
+    
+    private void checkWriteDataSourceNames(final String databaseName, final 
Map<String, DataSource> dataSourceMap,
+                                           final Collection<String> 
addedWriteDataSourceNames, final StaticReadwriteSplittingStrategyConfiguration 
strategyConfig) {
+        for (String each : new 
InlineExpressionParser(strategyConfig.getWriteDataSourceName()).splitAndEvaluate())
 {
+            Preconditions.checkState(dataSourceMap.containsKey(each), "Write 
data source name `%s` not in database `%s`.", each, databaseName);
+            Preconditions.checkState(addedWriteDataSourceNames.add(each), "Can 
not config duplicate write data source `%s` in database `%s`.", each, 
databaseName);
+        }
+    }
+    
+    private void checkReadeDataSourceNames(final String databaseName,
+                                           final Map<String, DataSource> 
dataSourceMap, final Collection<String> addedReadDataSourceNames, final String 
readDataSourceName) {
+        for (String each : new 
InlineExpressionParser(readDataSourceName).splitAndEvaluate()) {
+            Preconditions.checkState(dataSourceMap.containsKey(each), "Read 
data source name `%s` not in database `%s`.", each, databaseName);
+            Preconditions.checkState(addedReadDataSourceNames.add(each), "Can 
not config duplicate write data source `%s` in database `%s`.", each, 
databaseName);
         }
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index 0ff565ab8d8..418530c3eb7 100644
--- 
a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++ 
b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -69,7 +69,7 @@ public final class ReadwriteSplittingRule implements 
DatabaseRule, DataSourceCon
         ruleConfig.getLoadBalancers().forEach((key, value) -> 
loadBalancers.put(key, 
ReadQueryLoadBalanceAlgorithmFactory.newInstance(value)));
         dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
-            
dataSourceRules.putAll(buildReadwriteSplittingDataSourceRules(each, 
builtRules));
+            
dataSourceRules.putAll(createReadwriteSplittingDataSourceRules(each, 
builtRules));
         }
     }
     
@@ -78,58 +78,64 @@ public final class ReadwriteSplittingRule implements 
DatabaseRule, DataSourceCon
         loadBalancers.putAll(ruleConfig.getLoadBalanceAlgorithms());
         dataSourceRules = new HashMap<>(ruleConfig.getDataSources().size(), 1);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
-            
dataSourceRules.putAll(buildReadwriteSplittingDataSourceRules(each, 
builtRules));
+            
dataSourceRules.putAll(createReadwriteSplittingDataSourceRules(each, 
builtRules));
         }
     }
     
-    private Map<String, ReadwriteSplittingDataSourceRule> 
buildReadwriteSplittingDataSourceRules(final 
ReadwriteSplittingDataSourceRuleConfiguration config,
-                                                                               
                  final Collection<ShardingSphereRule> builtRules) {
-        ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = null == 
loadBalancers.get(config.getLoadBalancerName())
-                ? ReadQueryLoadBalanceAlgorithmFactory.newInstance()
-                : loadBalancers.get(config.getLoadBalancerName());
-        if (null != config.getStaticStrategy()) {
-            return buildStaticReadwriteSplittingDataSourceRules(config, 
builtRules, loadBalanceAlgorithm);
-        } else {
-            return buildDynamicReadwriteSplittingDataSourceRules(config, 
builtRules, loadBalanceAlgorithm);
-        }
+    private Map<String, ReadwriteSplittingDataSourceRule> 
createReadwriteSplittingDataSourceRules(final 
ReadwriteSplittingDataSourceRuleConfiguration config,
+                                                                               
                   final Collection<ShardingSphereRule> builtRules) {
+        ReadQueryLoadBalanceAlgorithm loadBalanceAlgorithm = 
loadBalancers.getOrDefault(config.getLoadBalancerName(), 
ReadQueryLoadBalanceAlgorithmFactory.newInstance());
+        return null == config.getStaticStrategy()
+                ? createDynamicReadwriteSplittingDataSourceRules(config, 
builtRules, loadBalanceAlgorithm)
+                : createStaticReadwriteSplittingDataSourceRules(config, 
builtRules, loadBalanceAlgorithm);
     }
-
-    private Map<String, ReadwriteSplittingDataSourceRule> 
buildStaticReadwriteSplittingDataSourceRules(final 
ReadwriteSplittingDataSourceRuleConfiguration config,
-                                                                               
                        final Collection<ShardingSphereRule> builtRules,
-                                                                               
                        final ReadQueryLoadBalanceAlgorithm 
loadBalanceAlgorithm) {
+    
+    private Map<String, ReadwriteSplittingDataSourceRule> 
createStaticReadwriteSplittingDataSourceRules(final 
ReadwriteSplittingDataSourceRuleConfiguration config,
+                                                                               
                         final Collection<ShardingSphereRule> builtRules,
+                                                                               
                         final ReadQueryLoadBalanceAlgorithm 
loadBalanceAlgorithm) {
         Map<String, ReadwriteSplittingDataSourceRule> result = new 
LinkedHashMap<>();
-        List<String> readwriteInlineNames = new 
InlineExpressionParser(config.getName()).splitAndEvaluate();
-        List<String> writeInlineDatasourceNames = new 
InlineExpressionParser(config.getStaticStrategy().getWriteDataSourceName()).splitAndEvaluate();
-        List<List<String>> readInlineDatasourceNames = 
config.getStaticStrategy().getReadDataSourceNames().stream()
+        List<String> inlineReadwriteDataSourceNames = new 
InlineExpressionParser(config.getName()).splitAndEvaluate();
+        List<String> inlineWriteDatasourceNames = new 
InlineExpressionParser(config.getStaticStrategy().getWriteDataSourceName()).splitAndEvaluate();
+        List<List<String>> inlineReadDatasourceNames = 
config.getStaticStrategy().getReadDataSourceNames().stream()
                 .map(each -> new 
InlineExpressionParser(each).splitAndEvaluate()).collect(Collectors.toList());
-        Preconditions.checkArgument(writeInlineDatasourceNames.size() == 
readwriteInlineNames.size(), "Inline expression write data source names size 
error");
-        readInlineDatasourceNames.forEach(e -> 
Preconditions.checkArgument(e.size() == readwriteInlineNames.size(), "Inline 
expression read data source names size error"));
-        for (int i = 0; i < readwriteInlineNames.size(); i++) {
-            final int index = i;
-            ReadwriteSplittingDataSourceRuleConfiguration staticConfig = new 
ReadwriteSplittingDataSourceRuleConfiguration(readwriteInlineNames.get(index),
-                    new 
StaticReadwriteSplittingStrategyConfiguration(writeInlineDatasourceNames.get(index),
-                            readInlineDatasourceNames.stream().map(each -> 
each.get(index)).collect(Collectors.toList())),
-                    null, config.getLoadBalancerName());
-            result.put(readwriteInlineNames.get(i), new 
ReadwriteSplittingDataSourceRule(staticConfig, loadBalanceAlgorithm, 
builtRules));
+        Preconditions.checkArgument(inlineWriteDatasourceNames.size() == 
inlineReadwriteDataSourceNames.size(), "Inline expression write data source 
names size error");
+        inlineReadDatasourceNames.forEach(each -> 
Preconditions.checkArgument(each.size() == 
inlineReadwriteDataSourceNames.size(), "Inline expression read data source 
names size error"));
+        for (int i = 0; i < inlineReadwriteDataSourceNames.size(); i++) {
+            ReadwriteSplittingDataSourceRuleConfiguration staticConfig = 
createStaticDataSourceRuleConfiguration(
+                    config, i, inlineReadwriteDataSourceNames, 
inlineWriteDatasourceNames, inlineReadDatasourceNames);
+            result.put(inlineReadwriteDataSourceNames.get(i), new 
ReadwriteSplittingDataSourceRule(staticConfig, loadBalanceAlgorithm, 
builtRules));
         }
         return result;
     }
-
-    private Map<String, ReadwriteSplittingDataSourceRule> 
buildDynamicReadwriteSplittingDataSourceRules(final 
ReadwriteSplittingDataSourceRuleConfiguration config,
-                                                                               
                         final Collection<ShardingSphereRule> builtRules,
-                                                                               
                         final ReadQueryLoadBalanceAlgorithm 
loadBalanceAlgorithm) {
+    
+    private ReadwriteSplittingDataSourceRuleConfiguration 
createStaticDataSourceRuleConfiguration(final 
ReadwriteSplittingDataSourceRuleConfiguration config, final int index,
+                                                                               
                   final List<String> readwriteDataSourceNames, final 
List<String> writeDatasourceNames,
+                                                                               
                   final List<List<String>> readDatasourceNames) {
+        List<String> readDataSourceNames = 
readDatasourceNames.stream().map(each -> 
each.get(index)).collect(Collectors.toList());
+        return new 
ReadwriteSplittingDataSourceRuleConfiguration(readwriteDataSourceNames.get(index),
+                new 
StaticReadwriteSplittingStrategyConfiguration(writeDatasourceNames.get(index), 
readDataSourceNames), null, config.getLoadBalancerName());
+    }
+    
+    private Map<String, ReadwriteSplittingDataSourceRule> 
createDynamicReadwriteSplittingDataSourceRules(final 
ReadwriteSplittingDataSourceRuleConfiguration config,
+                                                                               
                          final Collection<ShardingSphereRule> builtRules,
+                                                                               
                          final ReadQueryLoadBalanceAlgorithm 
loadBalanceAlgorithm) {
         Map<String, ReadwriteSplittingDataSourceRule> result = new 
LinkedHashMap<>();
-        List<String> readwriteInlineNames = new 
InlineExpressionParser(config.getName()).splitAndEvaluate();
-        List<String> autoAwareNames = new 
InlineExpressionParser(config.getDynamicStrategy().getAutoAwareDataSourceName()).splitAndEvaluate();
-        Preconditions.checkArgument(autoAwareNames.size() == 
readwriteInlineNames.size(), "Inline expression auto aware data source names 
size error");
-        for (int i = 0; i < readwriteInlineNames.size(); i++) {
-            ReadwriteSplittingDataSourceRuleConfiguration dynamicConfig = new 
ReadwriteSplittingDataSourceRuleConfiguration(readwriteInlineNames.get(i), null,
-                    new 
DynamicReadwriteSplittingStrategyConfiguration(autoAwareNames.get(i), 
config.getDynamicStrategy().getWriteDataSourceQueryEnabled()), 
config.getLoadBalancerName());
-            result.put(readwriteInlineNames.get(i), new 
ReadwriteSplittingDataSourceRule(dynamicConfig, loadBalanceAlgorithm, 
builtRules));
+        List<String> inlineReadwriteDataSourceNames = new 
InlineExpressionParser(config.getName()).splitAndEvaluate();
+        List<String> inlineAutoAwareDataSourceNames = new 
InlineExpressionParser(config.getDynamicStrategy().getAutoAwareDataSourceName()).splitAndEvaluate();
+        Preconditions.checkArgument(inlineAutoAwareDataSourceNames.size() == 
inlineReadwriteDataSourceNames.size(), "Inline expression auto aware data 
source names size error");
+        for (int i = 0; i < inlineReadwriteDataSourceNames.size(); i++) {
+            ReadwriteSplittingDataSourceRuleConfiguration dynamicConfig = 
createDynamicDataSourceRuleConfiguration(config, i, 
inlineReadwriteDataSourceNames, inlineAutoAwareDataSourceNames);
+            result.put(inlineReadwriteDataSourceNames.get(i), new 
ReadwriteSplittingDataSourceRule(dynamicConfig, loadBalanceAlgorithm, 
builtRules));
         }
         return result;
     }
-
+    
+    private ReadwriteSplittingDataSourceRuleConfiguration 
createDynamicDataSourceRuleConfiguration(final 
ReadwriteSplittingDataSourceRuleConfiguration config, final int index,
+                                                                               
                    final List<String> readwriteDataSourceNames, final 
List<String> autoAwareDataSourceNames) {
+        return new 
ReadwriteSplittingDataSourceRuleConfiguration(readwriteDataSourceNames.get(index),
 null,
+                new 
DynamicReadwriteSplittingStrategyConfiguration(autoAwareDataSourceNames.get(index),
 config.getDynamicStrategy().getWriteDataSourceQueryEnabled()), 
config.getLoadBalancerName());
+    }
+    
     /**
      * Get single data source rule.
      *

Reply via email to