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 9a141b4c3fc Improve DistSQL DROP DEFAULT SHARDING (DATABASE | TABLE) 
STRATEGY (#22386)
9a141b4c3fc is described below

commit 9a141b4c3fc621f175d0e4ffa979c407990a114c
Author: ChenJiaHao <[email protected]>
AuthorDate: Thu Nov 24 19:49:49 2022 +0800

    Improve DistSQL DROP DEFAULT SHARDING (DATABASE | TABLE) STRATEGY (#22386)
    
    * Remove unused algorithms while dropping the default sharding strategy
    
    * Add related test cases
    
    * Revise method name
---
 .../update/AbstractDropShardingRuleUpdater.java    | 51 ++++++++++++++++++++++
 .../DropDefaultStrategyStatementUpdater.java       |  3 +-
 .../DropShardingTableRuleStatementUpdater.java     | 22 ++--------
 ...efaultShardingStrategyStatementUpdaterTest.java | 30 +++++++++++++
 4 files changed, 86 insertions(+), 20 deletions(-)

diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AbstractDropShardingRuleUpdater.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AbstractDropShardingRuleUpdater.java
new file mode 100644
index 00000000000..5322c340248
--- /dev/null
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AbstractDropShardingRuleUpdater.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.distsql.handler.update;
+
+import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * Abstract drop sharding table rule updater.
+ */
+public abstract class AbstractDropShardingRuleUpdater {
+    
+    /**
+     * Drop unused algorithm.
+     * 
+     * @param currentRuleConfig current sharding rule configuration
+     */
+    public void dropUnusedAlgorithm(final ShardingRuleConfiguration 
currentRuleConfig) {
+        Collection<String> inUsedAlgorithms = 
currentRuleConfig.getTables().stream().map(each -> 
Arrays.asList(each.getTableShardingStrategy(), 
each.getDatabaseShardingStrategy()))
+                
.flatMap(Collection::stream).filter(Objects::nonNull).map(ShardingStrategyConfiguration::getShardingAlgorithmName).collect(Collectors.toSet());
+        
inUsedAlgorithms.addAll(currentRuleConfig.getAutoTables().stream().map(each -> 
each.getShardingStrategy().getShardingAlgorithmName()).collect(Collectors.toSet()));
+        if (null != currentRuleConfig.getDefaultTableShardingStrategy()) {
+            
inUsedAlgorithms.add(currentRuleConfig.getDefaultTableShardingStrategy().getShardingAlgorithmName());
+        }
+        if (null != currentRuleConfig.getDefaultDatabaseShardingStrategy()) {
+            
inUsedAlgorithms.add(currentRuleConfig.getDefaultDatabaseShardingStrategy().getShardingAlgorithmName());
+        }
+        Collection<String> unusedAlgorithms = 
currentRuleConfig.getShardingAlgorithms().keySet().stream().filter(each -> 
!inUsedAlgorithms.contains(each)).collect(Collectors.toSet());
+        unusedAlgorithms.forEach(each -> 
currentRuleConfig.getShardingAlgorithms().remove(each));
+    }
+}
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropDefaultStrategyStatementUpdater.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropDefaultStrategyStatementUpdater.java
index 387323bcbe9..7aac168c60f 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropDefaultStrategyStatementUpdater.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropDefaultStrategyStatementUpdater.java
@@ -31,7 +31,7 @@ import java.util.Optional;
 /**
  * Drop sharding table rule statement updater.
  */
-public final class DropDefaultStrategyStatementUpdater implements 
RuleDefinitionDropUpdater<DropDefaultShardingStrategyStatement, 
ShardingRuleConfiguration> {
+public final class DropDefaultStrategyStatementUpdater extends 
AbstractDropShardingRuleUpdater implements 
RuleDefinitionDropUpdater<DropDefaultShardingStrategyStatement, 
ShardingRuleConfiguration> {
     
     @Override
     public void checkSQLStatement(final ShardingSphereDatabase database, final 
DropDefaultShardingStrategyStatement sqlStatement,
@@ -79,6 +79,7 @@ public final class DropDefaultStrategyStatementUpdater 
implements RuleDefinition
         } else {
             currentRuleConfig.setDefaultDatabaseShardingStrategy(null);
         }
+        dropUnusedAlgorithm(currentRuleConfig);
         return false;
     }
     
diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingTableRuleStatementUpdater.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingTableRuleStatementUpdater.java
index 5d5ef03df53..4b32f68d0d9 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingTableRuleStatementUpdater.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingTableRuleStatementUpdater.java
@@ -28,10 +28,8 @@ import 
org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.DropShardingTableRuleStatement;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
@@ -41,7 +39,7 @@ import java.util.stream.Collectors;
 /**
  * Drop sharding table rule statement updater.
  */
-public final class DropShardingTableRuleStatementUpdater implements 
RuleDefinitionDropUpdater<DropShardingTableRuleStatement, 
ShardingRuleConfiguration> {
+public final class DropShardingTableRuleStatementUpdater extends 
AbstractDropShardingRuleUpdater implements 
RuleDefinitionDropUpdater<DropShardingTableRuleStatement, 
ShardingRuleConfiguration> {
     
     @Override
     public void checkSQLStatement(final ShardingSphereDatabase database,
@@ -116,26 +114,12 @@ public final class DropShardingTableRuleStatementUpdater 
implements RuleDefiniti
     public boolean updateCurrentRuleConfiguration(final 
DropShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration 
currentRuleConfig) {
         Collection<String> toBeDroppedShardingTableNames = 
getToBeDroppedShardingTableNames(sqlStatement);
         toBeDroppedShardingTableNames.forEach(each -> 
dropShardingTable(currentRuleConfig, each));
-        dropUnusedAlgorithms(currentRuleConfig);
+        dropUnusedAlgorithm(currentRuleConfig);
         dropUnusedKeyGenerator(currentRuleConfig);
         dropUnusedAuditor(currentRuleConfig);
         return false;
     }
-    
-    private void dropUnusedAlgorithms(final ShardingRuleConfiguration 
currentRuleConfig) {
-        Collection<String> inUsedAlgorithms = 
currentRuleConfig.getTables().stream().map(each -> 
Arrays.asList(each.getTableShardingStrategy(), 
each.getDatabaseShardingStrategy()))
-                
.flatMap(Collection::stream).filter(Objects::nonNull).map(ShardingStrategyConfiguration::getShardingAlgorithmName).collect(Collectors.toSet());
-        
inUsedAlgorithms.addAll(currentRuleConfig.getAutoTables().stream().map(each -> 
each.getShardingStrategy().getShardingAlgorithmName()).collect(Collectors.toSet()));
-        if (null != currentRuleConfig.getDefaultTableShardingStrategy()) {
-            
inUsedAlgorithms.add(currentRuleConfig.getDefaultTableShardingStrategy().getShardingAlgorithmName());
-        }
-        if (null != currentRuleConfig.getDefaultDatabaseShardingStrategy()) {
-            
inUsedAlgorithms.add(currentRuleConfig.getDefaultDatabaseShardingStrategy().getShardingAlgorithmName());
-        }
-        Collection<String> unusedAlgorithms = 
currentRuleConfig.getShardingAlgorithms().keySet().stream().filter(each -> 
!inUsedAlgorithms.contains(each)).collect(Collectors.toSet());
-        unusedAlgorithms.forEach(each -> 
currentRuleConfig.getShardingAlgorithms().remove(each));
-    }
-    
+
     private void dropUnusedKeyGenerator(final ShardingRuleConfiguration 
currentRuleConfig) {
         Collection<String> inUsedKeyGenerators = 
currentRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getKeyGenerateStrategy).filter(Objects::nonNull)
                 
.map(KeyGenerateStrategyConfiguration::getKeyGeneratorName).collect(Collectors.toSet());
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropDefaultShardingStrategyStatementUpdaterTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropDefaultShardingStrategyStatementUpdaterTest.java
index fc5726dc5fa..35258a805df 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropDefaultShardingStrategyStatementUpdaterTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropDefaultShardingStrategyStatementUpdaterTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.sharding.distsql.update;
 
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.distsql.exception.rule.MissingRequiredRuleException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
@@ -29,7 +30,14 @@ import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 @RunWith(MockitoJUnitRunner.class)
 public final class DropDefaultShardingStrategyStatementUpdaterTest {
@@ -60,6 +68,15 @@ public final class 
DropDefaultShardingStrategyStatementUpdaterTest {
         ShardingRuleConfiguration currentRuleConfig = 
createCurrentRuleConfiguration();
         updater.updateCurrentRuleConfiguration(createSQLStatement("Database"), 
currentRuleConfig);
         assertNull(currentRuleConfig.getDefaultDatabaseShardingStrategy());
+        assertTrue(currentRuleConfig.getShardingAlgorithms().isEmpty());
+    }
+    
+    @Test
+    public void assertUpdateCurrentRuleConfigurationWithInUsedAlgorithm() {
+        ShardingRuleConfiguration currentRuleConfig = 
createMultipleCurrentRuleConfiguration();
+        updater.updateCurrentRuleConfiguration(createSQLStatement("Table"), 
currentRuleConfig);
+        assertNull(currentRuleConfig.getDefaultTableShardingStrategy());
+        assertThat(currentRuleConfig.getShardingAlgorithms().size(), is(1));
     }
     
     private DropDefaultShardingStrategyStatement createSQLStatement(final 
String defaultType) {
@@ -69,6 +86,19 @@ public final class 
DropDefaultShardingStrategyStatementUpdaterTest {
     private ShardingRuleConfiguration createCurrentRuleConfiguration() {
         ShardingRuleConfiguration result = new ShardingRuleConfiguration();
         result.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "algorithm_name"));
+        Map<String, AlgorithmConfiguration> stringAlgorithms = new 
LinkedHashMap<>();
+        stringAlgorithms.put("algorithm_name", new 
AlgorithmConfiguration("INLINE", new Properties()));
+        result.setShardingAlgorithms(stringAlgorithms);
+        return result;
+    }
+    
+    private ShardingRuleConfiguration createMultipleCurrentRuleConfiguration() 
{
+        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+        result.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "algorithm_name"));
+        result.setDefaultTableShardingStrategy(new 
StandardShardingStrategyConfiguration("user_id", "algorithm_name"));
+        Map<String, AlgorithmConfiguration> stringAlgorithms = new 
LinkedHashMap<>();
+        stringAlgorithms.put("algorithm_name", new 
AlgorithmConfiguration("INLINE", new Properties()));
+        result.setShardingAlgorithms(stringAlgorithms);
         return result;
     }
 }

Reply via email to