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 7b5ba96cffc Refactor shadow RDL updater (#26364)
7b5ba96cffc is described below

commit 7b5ba96cffccb4872d6fa6e1a1fed223620199a2
Author: ChenJiaHao <pace2...@163.com>
AuthorDate: Thu Jun 15 15:41:48 2023 +0800

    Refactor shadow RDL updater (#26364)
    
    * Refactor shadow RDL updater
    
    * Fix code style
---
 ...DropDefaultShadowAlgorithmStatementUpdater.java |  9 ++++
 .../DropShadowAlgorithmStatementUpdater.java       |  9 ++++
 .../update/DropShadowRuleStatementUpdater.java     | 59 ++++++++++++++++++++++
 .../handler/update/RuleDefinitionDropUpdater.java  | 11 ++++
 .../rdl/rule/NewRuleDefinitionBackendHandler.java  |  2 +
 5 files changed, 90 insertions(+)

diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmStatementUpdater.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmStatementUpdater.java
index dca15348d87..dbd96ab5f32 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmStatementUpdater.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmStatementUpdater.java
@@ -53,6 +53,15 @@ public final class 
DropDefaultShadowAlgorithmStatementUpdater implements RuleDef
         return null != currentRuleConfig && null != 
currentRuleConfig.getDefaultShadowAlgorithmName();
     }
     
+    @Override
+    public ShadowRuleConfiguration buildToBeDroppedRuleConfiguration(final 
ShadowRuleConfiguration currentRuleConfig, final 
DropDefaultShadowAlgorithmStatement sqlStatement) {
+        ShadowRuleConfiguration result = new ShadowRuleConfiguration();
+        
result.setShadowAlgorithms(Collections.singletonMap(currentRuleConfig.getDefaultShadowAlgorithmName(),
+                
currentRuleConfig.getShadowAlgorithms().get(currentRuleConfig.getDefaultShadowAlgorithmName())));
+        
result.setDefaultShadowAlgorithmName(currentRuleConfig.getDefaultShadowAlgorithmName());
+        return result;
+    }
+    
     @Override
     public boolean updateCurrentRuleConfiguration(final 
DropDefaultShadowAlgorithmStatement sqlStatement, final ShadowRuleConfiguration 
currentRuleConfig) {
         
currentRuleConfig.getShadowAlgorithms().remove(currentRuleConfig.getDefaultShadowAlgorithmName());
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmStatementUpdater.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmStatementUpdater.java
index 3700a9c46a0..32619964c9a 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmStatementUpdater.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmStatementUpdater.java
@@ -77,6 +77,15 @@ public final class DropShadowAlgorithmStatementUpdater 
implements RuleDefinition
                 && 
!getIdenticalData(ShadowRuleStatementSupporter.getAlgorithmNames(currentRuleConfig),
 sqlStatement.getNames()).isEmpty();
     }
     
+    @Override
+    public ShadowRuleConfiguration buildToBeDroppedRuleConfiguration(final 
ShadowRuleConfiguration currentRuleConfig, final DropShadowAlgorithmStatement 
sqlStatement) {
+        ShadowRuleConfiguration result = new ShadowRuleConfiguration();
+        for (String each : sqlStatement.getNames()) {
+            result.getShadowAlgorithms().put(each, null);
+        }
+        return result;
+    }
+    
     @Override
     public boolean updateCurrentRuleConfiguration(final 
DropShadowAlgorithmStatement sqlStatement, final ShadowRuleConfiguration 
currentRuleConfig) {
         Collection<String> algorithmNames = sqlStatement.getNames();
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowRuleStatementUpdater.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowRuleStatementUpdater.java
index 69acf2b9840..41eb45727e9 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowRuleStatementUpdater.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowRuleStatementUpdater.java
@@ -19,14 +19,21 @@ package 
org.apache.shardingsphere.shadow.distsql.handler.update;
 
 import 
org.apache.shardingsphere.distsql.handler.exception.rule.MissingRequiredRuleException;
 import 
org.apache.shardingsphere.distsql.handler.update.RuleDefinitionDropUpdater;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import 
org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
+import 
org.apache.shardingsphere.shadow.api.config.table.ShadowTableConfiguration;
 import 
org.apache.shardingsphere.shadow.distsql.handler.checker.ShadowRuleStatementChecker;
 import 
org.apache.shardingsphere.shadow.distsql.parser.statement.DropShadowRuleStatement;
 
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -63,6 +70,58 @@ public final class DropShadowRuleStatementUpdater implements 
RuleDefinitionDropU
         return isExistRuleConfig(currentRuleConfig) && 
!getIdenticalData(sqlStatement.getNames(), 
getDataSourceNames(currentRuleConfig)).isEmpty();
     }
     
+    @Override
+    public ShadowRuleConfiguration buildToBeDroppedRuleConfiguration(final 
ShadowRuleConfiguration currentRuleConfig, final DropShadowRuleStatement 
sqlStatement) {
+        Collection<ShadowDataSourceConfiguration> toBeDroppedDataSources = new 
LinkedList<>();
+        Map<String, ShadowTableConfiguration> toBeDroppedTables = new 
LinkedHashMap<>();
+        Map<String, AlgorithmConfiguration> toBeDroppedShadowAlgorithms = new 
HashMap<>();
+        for (String each : sqlStatement.getNames()) {
+            compareAndGetToBeDroppedRule(currentRuleConfig, 
toBeDroppedDataSources, toBeDroppedTables, toBeDroppedShadowAlgorithms, each, 
sqlStatement.getNames());
+        }
+        ShadowRuleConfiguration result = new ShadowRuleConfiguration();
+        result.setDataSources(toBeDroppedDataSources);
+        result.setTables(toBeDroppedTables);
+        result.setShadowAlgorithms(toBeDroppedShadowAlgorithms);
+        return result;
+    }
+    
+    private void compareAndGetToBeDroppedRule(final ShadowRuleConfiguration 
currentRuleConfig, final Collection<ShadowDataSourceConfiguration> 
toBeDroppedDataSources,
+                                              final Map<String, 
ShadowTableConfiguration> toBeDroppedTables, final Map<String, 
AlgorithmConfiguration> toBeDroppedShadowAlgorithms,
+                                              final String 
toBeDroppedDataSourceName, final Collection<String> toBeDroppedDataSourceNames) 
{
+        toBeDroppedDataSources.add(new 
ShadowDataSourceConfiguration(toBeDroppedDataSourceName, null, null));
+        for (Map.Entry<String, ShadowTableConfiguration> each : 
currentRuleConfig.getTables().entrySet()) {
+            if 
(toBeDroppedDataSourceNames.containsAll(each.getValue().getDataSourceNames())) {
+                toBeDroppedTables.put(each.getKey(), each.getValue());
+            }
+        }
+        Collection<String> inUsedAlgorithms = 
currentRuleConfig.getTables().entrySet().stream().filter(each -> 
!toBeDroppedTables.containsKey(each.getKey()))
+                .flatMap(entry -> 
entry.getValue().getShadowAlgorithmNames().stream()).collect(Collectors.toSet());
+        if (null != currentRuleConfig.getDefaultShadowAlgorithmName()) {
+            
inUsedAlgorithms.add(currentRuleConfig.getDefaultShadowAlgorithmName());
+        }
+        for (String each : currentRuleConfig.getShadowAlgorithms().keySet()) {
+            if (!inUsedAlgorithms.contains(each)) {
+                toBeDroppedShadowAlgorithms.put(each, 
currentRuleConfig.getShadowAlgorithms().get(each));
+            }
+        }
+    }
+    
+    @Override
+    public ShadowRuleConfiguration buildToBeAlteredRuleConfiguration(final 
ShadowRuleConfiguration currentRuleConfig, final DropShadowRuleStatement 
sqlStatement) {
+        Map<String, ShadowTableConfiguration> tables = new LinkedHashMap<>();
+        Collection<String> toBeDroppedDataSourceNames = 
sqlStatement.getNames();
+        for (Map.Entry<String, ShadowTableConfiguration> each : 
currentRuleConfig.getTables().entrySet()) {
+            if 
(!toBeDroppedDataSourceNames.containsAll(each.getValue().getDataSourceNames())) 
{
+                List<String> currentDataSources = new 
LinkedList<>(each.getValue().getDataSourceNames());
+                currentDataSources.removeAll(toBeDroppedDataSourceNames);
+                tables.put(each.getKey(), new 
ShadowTableConfiguration(currentDataSources, null));
+            }
+        }
+        ShadowRuleConfiguration result = new ShadowRuleConfiguration();
+        result.setTables(tables);
+        return result;
+    }
+    
     @Override
     public boolean updateCurrentRuleConfiguration(final 
DropShadowRuleStatement sqlStatement, final ShadowRuleConfiguration 
currentRuleConfig) {
         currentRuleConfig.getDataSources().removeIf(each -> 
sqlStatement.getNames().contains(each.getName()));
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/update/RuleDefinitionDropUpdater.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/update/RuleDefinitionDropUpdater.java
index 1dfa5c4c355..161ca2f3af8 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/update/RuleDefinitionDropUpdater.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/update/RuleDefinitionDropUpdater.java
@@ -43,6 +43,17 @@ public interface RuleDefinitionDropUpdater<T extends 
SQLStatement, R extends Rul
         return null;
     }
     
+    /**
+     * Build to be altered rule configuration.
+     *
+     * @param currentRuleConfig current rule configuration to be updated
+     * @param sqlStatement SQL statement
+     * @return to be altered rule configuration
+     */
+    default R buildToBeAlteredRuleConfiguration(R currentRuleConfig, T 
sqlStatement) {
+        return null;
+    }
+    
     /**
      * Update current rule configuration.
      *
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
index 7a63e84f1de..5d87ed39e76 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
@@ -111,11 +111,13 @@ public final class NewRuleDefinitionBackendHandler<T 
extends RuleDefinitionState
             return;
         }
         RuleConfiguration toBeDroppedRuleConfig = 
updater.buildToBeDroppedRuleConfiguration(currentRuleConfig, sqlStatement);
+        RuleConfiguration toBeAlteredRuleConfig = 
updater.buildToBeAlteredRuleConfiguration(currentRuleConfig, sqlStatement);
         if (updater.updateCurrentRuleConfiguration(sqlStatement, 
currentRuleConfig)) {
             
database.getRuleMetaData().getConfigurations().remove(currentRuleConfig);
             // TODO remove rule root node
         }
         
ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().removeRuleConfiguration(database.getName(),
 toBeDroppedRuleConfig);
+        
ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().alterRuleConfiguration(database.getName(),
 toBeAlteredRuleConfig);
         if (updater instanceof DropReadwriteSplittingRuleStatementUpdater) {
             
database.getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class)
                     .ifPresent(optional -> 
((DropReadwriteSplittingRuleStatement) 
sqlStatement).getNames().forEach(optional::cleanStorageNodeDataSource));

Reply via email to