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;
}
}