You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/01/15 15:04:29 UTC
[shardingsphere] branch master updated: Refactor ifNotExists of CREATE SHARDING TABLE REFERENCE RULE. (#23556)
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 7645491e58d Refactor ifNotExists of CREATE SHARDING TABLE REFERENCE RULE. (#23556)
7645491e58d is described below
commit 7645491e58dc4574ac1421d7fe5064e6f496a4aa
Author: yx9o <ya...@163.com>
AuthorDate: Sun Jan 15 23:04:22 2023 +0800
Refactor ifNotExists of CREATE SHARDING TABLE REFERENCE RULE. (#23556)
---
...ShardingTableReferenceRuleStatementUpdater.java | 60 ++++++++++------------
...dingTableReferenceRuleStatementUpdaterTest.java | 6 ++-
2 files changed, 31 insertions(+), 35 deletions(-)
diff --git a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateShardingTableReferenceRuleStatementUpdater.java b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateShardingTableReferenceRuleStatementUpdater.java
index 29bbe420e2b..ab5734d4c02 100644
--- a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateShardingTableReferenceRuleStatementUpdater.java
+++ b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateShardingTableReferenceRuleStatementUpdater.java
@@ -35,7 +35,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
-import java.util.LinkedList;
import java.util.stream.Collectors;
/**
@@ -43,14 +42,11 @@ import java.util.stream.Collectors;
*/
public final class CreateShardingTableReferenceRuleStatementUpdater implements RuleDefinitionCreateUpdater<CreateShardingTableReferenceRuleStatement, ShardingRuleConfiguration> {
- private boolean ifNotExists;
-
@Override
public void checkSQLStatement(final ShardingSphereDatabase database, final CreateShardingTableReferenceRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
String databaseName = database.getName();
- ifNotExists = sqlStatement.isIfNotExists();
checkCurrentRuleConfiguration(databaseName, currentRuleConfig);
- if (!ifNotExists) {
+ if (!sqlStatement.isIfNotExists()) {
checkDuplicatedRuleNames(databaseName, sqlStatement, currentRuleConfig);
}
checkDuplicatedTablesInShardingTableReferenceRules(databaseName, sqlStatement, currentRuleConfig);
@@ -58,19 +54,39 @@ public final class CreateShardingTableReferenceRuleStatementUpdater implements R
checkShardingTableReferenceRulesValid(sqlStatement, currentRuleConfig);
}
- private void checkCurrentRuleConfiguration(final String databaseName, final ShardingRuleConfiguration currentRuleConfig) throws MissingRequiredRuleException {
- ShardingSpherePreconditions.checkNotNull(currentRuleConfig, () -> new MissingRequiredRuleException("Sharding", databaseName));
+ @Override
+ public ShardingRuleConfiguration buildToBeCreatedRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final CreateShardingTableReferenceRuleStatement sqlStatement) {
+ Collection<TableReferenceRuleSegment> segments = sqlStatement.getRules();
+ if (sqlStatement.isIfNotExists()) {
+ Collection<String> duplicatedRuleNames = getDuplicatedRuleNames(sqlStatement, currentRuleConfig);
+ segments.removeIf(each -> duplicatedRuleNames.contains(each.getName()));
+ }
+ ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+ segments.forEach(each -> result.getBindingTableGroups().add(new ShardingTableReferenceRuleConfiguration(each.getName(), each.getReference())));
+ return result;
}
- private void checkDuplicatedRuleNames(final String databaseName, final CreateShardingTableReferenceRuleStatement sqlStatement,
- final ShardingRuleConfiguration currentRuleConfig) throws DuplicateRuleException {
+ @Override
+ public void updateCurrentRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final ShardingRuleConfiguration toBeCreatedRuleConfig) {
+ currentRuleConfig.getBindingTableGroups().addAll(toBeCreatedRuleConfig.getBindingTableGroups());
+ }
+
+ private Collection<String> getDuplicatedRuleNames(final CreateShardingTableReferenceRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
Collection<String> currentRuleNames = currentRuleConfig.getBindingTableGroups().stream().map(ShardingTableReferenceRuleConfiguration::getName).collect(Collectors.toSet());
- Collection<String> duplicatedRuleNames = sqlStatement.getRules().stream().map(TableReferenceRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
+ return sqlStatement.getRules().stream().map(TableReferenceRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toSet());
+ }
+
+ private void checkCurrentRuleConfiguration(final String databaseName, final ShardingRuleConfiguration currentRuleConfig) {
+ ShardingSpherePreconditions.checkNotNull(currentRuleConfig, () -> new MissingRequiredRuleException("Sharding", databaseName));
+ }
+
+ private void checkDuplicatedRuleNames(final String databaseName, final CreateShardingTableReferenceRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ Collection<String> duplicatedRuleNames = getDuplicatedRuleNames(sqlStatement, currentRuleConfig);
ShardingSpherePreconditions.checkState(duplicatedRuleNames.isEmpty(), () -> new DuplicateRuleException("sharding table reference", databaseName, duplicatedRuleNames));
}
private void checkDuplicatedTablesInShardingTableReferenceRules(final String databaseName, final CreateShardingTableReferenceRuleStatement sqlStatement,
- final ShardingRuleConfiguration currentRuleConfig) throws DuplicateRuleException {
+ final ShardingRuleConfiguration currentRuleConfig) {
Collection<String> currentReferencedTableNames = getReferencedTableNames(currentRuleConfig);
Collection<String> duplicatedTableNames = sqlStatement.getTableNames().stream().filter(currentReferencedTableNames::contains).collect(Collectors.toSet());
ShardingSpherePreconditions.checkState(duplicatedTableNames.isEmpty(), () -> new DuplicateRuleException("sharding table reference", databaseName, duplicatedTableNames));
@@ -104,28 +120,6 @@ public final class CreateShardingTableReferenceRuleStatementUpdater implements R
return currentRules.stream().anyMatch(each -> each.equalsIgnoreCase(ruleName));
}
- @Override
- public ShardingRuleConfiguration buildToBeCreatedRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final CreateShardingTableReferenceRuleStatement sqlStatement) {
- ShardingRuleConfiguration result = new ShardingRuleConfiguration();
- sqlStatement.getRules().forEach(each -> result.getBindingTableGroups().add(new ShardingTableReferenceRuleConfiguration(each.getName(), each.getReference())));
- return result;
- }
-
- @Override
- public void updateCurrentRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final ShardingRuleConfiguration toBeCreatedRuleConfig) {
- if (ifNotExists) {
- Collection<String> currentReferenceRules = new LinkedList<>();
- currentRuleConfig.getBindingTableGroups().forEach(each -> currentReferenceRules.add(each.getName()));
- toBeCreatedRuleConfig.getBindingTableGroups().removeIf(each -> currentReferenceRules.contains(each.getName()));
- if (toBeCreatedRuleConfig.getBindingTableGroups().isEmpty()) {
- return;
- }
- }
- if (null != currentRuleConfig) {
- currentRuleConfig.getBindingTableGroups().addAll(toBeCreatedRuleConfig.getBindingTableGroups());
- }
- }
-
@Override
public Class<ShardingRuleConfiguration> getRuleConfigurationClass() {
return ShardingRuleConfiguration.class;
diff --git a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableReferenceRuleStatementUpdaterTest.java b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableReferenceRuleStatementUpdaterTest.java
index 12dca3e4603..70852125ef2 100644
--- a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableReferenceRuleStatementUpdaterTest.java
+++ b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableReferenceRuleStatementUpdaterTest.java
@@ -33,8 +33,8 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Collection;
-import java.util.Collections;
import java.util.Iterator;
+import java.util.LinkedList;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -53,7 +53,9 @@ public final class CreateShardingTableReferenceRuleStatementUpdaterTest {
}
private CreateShardingTableReferenceRuleStatement createSQLStatement(final boolean ifNotExists, final String name, final String reference) {
- return new CreateShardingTableReferenceRuleStatement(ifNotExists, Collections.singletonList(new TableReferenceRuleSegment(name, reference)));
+ Collection<TableReferenceRuleSegment> segments = new LinkedList<>();
+ segments.add(new TableReferenceRuleSegment(name, reference));
+ return new CreateShardingTableReferenceRuleStatement(ifNotExists, segments);
}
@Test(expected = DuplicateRuleException.class)