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/20 13:56:34 UTC
[shardingsphere] branch master updated: Refactor ifNotExists of CREATE SHARDING TABLE RULE. (#23641)
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 adc6e013549 Refactor ifNotExists of CREATE SHARDING TABLE RULE. (#23641)
adc6e013549 is described below
commit adc6e01354904e10855320b375a5d449d9f3325c
Author: yx9o <ya...@163.com>
AuthorDate: Fri Jan 20 21:56:20 2023 +0800
Refactor ifNotExists of CREATE SHARDING TABLE RULE. (#23641)
---
.../CreateShardingTableRuleStatementUpdater.java | 39 +++++++++++++---------
...reateShardingTableRuleStatementUpdaterTest.java | 23 ++++---------
2 files changed, 31 insertions(+), 31 deletions(-)
diff --git a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateShardingTableRuleStatementUpdater.java b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateShardingTableRuleStatementUpdater.java
index cfbb2c84482..25cc271be49 100644
--- a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateShardingTableRuleStatementUpdater.java
+++ b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateShardingTableRuleStatementUpdater.java
@@ -20,43 +20,40 @@ package org.apache.shardingsphere.sharding.distsql.handler.update;
import org.apache.shardingsphere.distsql.handler.update.RuleDefinitionCreateUpdater;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
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.distsql.handler.checker.ShardingTableRuleStatementChecker;
import org.apache.shardingsphere.sharding.distsql.handler.converter.ShardingTableRuleStatementConverter;
+import org.apache.shardingsphere.sharding.distsql.parser.segment.table.AbstractTableRuleSegment;
import org.apache.shardingsphere.sharding.distsql.parser.statement.CreateShardingTableRuleStatement;
import java.util.Collection;
+import java.util.Collections;
import java.util.LinkedList;
+import java.util.stream.Collectors;
/**
* Create sharding table rule statement updater.
*/
public final class CreateShardingTableRuleStatementUpdater implements RuleDefinitionCreateUpdater<CreateShardingTableRuleStatement, ShardingRuleConfiguration> {
- private boolean ifNotExists;
-
@Override
public void checkSQLStatement(final ShardingSphereDatabase database, final CreateShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
- ifNotExists = sqlStatement.isIfNotExists();
- ShardingTableRuleStatementChecker.checkCreation(database, sqlStatement.getRules(), ifNotExists, currentRuleConfig);
+ ShardingTableRuleStatementChecker.checkCreation(database, sqlStatement.getRules(), sqlStatement.isIfNotExists(), currentRuleConfig);
}
@Override
public ShardingRuleConfiguration buildToBeCreatedRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final CreateShardingTableRuleStatement sqlStatement) {
- return ShardingTableRuleStatementConverter.convert(sqlStatement.getRules());
+ Collection<AbstractTableRuleSegment> segments = sqlStatement.getRules();
+ if (sqlStatement.isIfNotExists()) {
+ Collection<String> duplicatedRuleNames = getDuplicatedRuleNames(sqlStatement, currentRuleConfig);
+ segments.removeIf(each -> duplicatedRuleNames.contains(each.getLogicTable()));
+ }
+ return ShardingTableRuleStatementConverter.convert(segments);
}
@Override
public void updateCurrentRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final ShardingRuleConfiguration toBeCreatedRuleConfig) {
- if (ifNotExists) {
- Collection<String> currentTables = new LinkedList<>();
- currentRuleConfig.getTables().forEach(each -> currentTables.add(each.getLogicTable()));
- currentRuleConfig.getAutoTables().forEach(each -> currentTables.add(each.getLogicTable()));
- toBeCreatedRuleConfig.getTables().removeIf(each -> currentTables.contains(each.getLogicTable()));
- toBeCreatedRuleConfig.getAutoTables().removeIf(each -> currentTables.contains(each.getLogicTable()));
- if (toBeCreatedRuleConfig.getTables().isEmpty() && toBeCreatedRuleConfig.getAutoTables().isEmpty()) {
- return;
- }
- }
currentRuleConfig.getTables().addAll(toBeCreatedRuleConfig.getTables());
currentRuleConfig.getAutoTables().addAll(toBeCreatedRuleConfig.getAutoTables());
currentRuleConfig.getShardingAlgorithms().putAll(toBeCreatedRuleConfig.getShardingAlgorithms());
@@ -64,6 +61,18 @@ public final class CreateShardingTableRuleStatementUpdater implements RuleDefini
currentRuleConfig.getAuditors().putAll(toBeCreatedRuleConfig.getAuditors());
}
+ private Collection<String> getDuplicatedRuleNames(final CreateShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ Collection<String> currentShardingTables = null == currentRuleConfig ? Collections.emptyList() : getCurrentShardingTables(currentRuleConfig);
+ return sqlStatement.getRules().stream().map(AbstractTableRuleSegment::getLogicTable).filter(currentShardingTables::contains).collect(Collectors.toSet());
+ }
+
+ private Collection<String> getCurrentShardingTables(final ShardingRuleConfiguration currentRuleConfig) {
+ Collection<String> result = new LinkedList<>();
+ result.addAll(currentRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toSet()));
+ result.addAll(currentRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toSet()));
+ return result;
+ }
+
@Override
public Class<ShardingRuleConfiguration> getRuleConfigurationClass() {
return ShardingRuleConfiguration.class;
diff --git a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableRuleStatementUpdaterTest.java b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableRuleStatementUpdaterTest.java
index 8bb7fd4d4a8..03bdbc93c1a 100644
--- a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableRuleStatementUpdaterTest.java
+++ b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateShardingTableRuleStatementUpdaterTest.java
@@ -39,6 +39,7 @@ import org.apache.shardingsphere.sharding.distsql.handler.update.CreateShardingT
import org.apache.shardingsphere.sharding.distsql.parser.facade.ShardingDistSQLStatementParserFacade;
import org.apache.shardingsphere.sharding.distsql.parser.segment.strategy.KeyGenerateStrategySegment;
import org.apache.shardingsphere.sharding.distsql.parser.segment.strategy.ShardingStrategySegment;
+import org.apache.shardingsphere.sharding.distsql.parser.segment.table.AbstractTableRuleSegment;
import org.apache.shardingsphere.sharding.distsql.parser.segment.table.AutoTableRuleSegment;
import org.apache.shardingsphere.sharding.distsql.parser.segment.table.TableRuleSegment;
import org.apache.shardingsphere.sharding.distsql.parser.statement.CreateShardingTableRuleStatement;
@@ -61,6 +62,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.Map;
import java.util.Properties;
@@ -157,23 +159,12 @@ public final class CreateShardingTableRuleStatementUpdaterTest {
@Test
public void assertUpdateWithIfNotExistsStatement() {
- CreateShardingTableRuleStatement statement = new CreateShardingTableRuleStatement(false, Arrays.asList(createCompleteAutoTableRule(), createCompleteTableRule()));
- updater.checkSQLStatement(database, statement, currentRuleConfig);
- ShardingRuleConfiguration toBeCreatedRuleConfig = updater.buildToBeCreatedRuleConfiguration(currentRuleConfig, statement);
- updater.updateCurrentRuleConfiguration(currentRuleConfig, toBeCreatedRuleConfig);
- AutoTableRuleSegment autoTableRuleSegment = new AutoTableRuleSegment("t_order_item_input", Collections.singletonList("logic_ds"));
- autoTableRuleSegment.setKeyGenerateStrategySegment(new KeyGenerateStrategySegment("test_product_id", new AlgorithmSegment("DISTSQL.FIXTURE", new Properties())));
- autoTableRuleSegment.setShardingColumn("custom_id");
- autoTableRuleSegment.setShardingAlgorithmSegment(new AlgorithmSegment("FOO.DISTSQL.FIXTURE", PropertiesBuilder.build(new Property("", ""))));
- KeyGenerateStrategySegment keyGenerator = new KeyGenerateStrategySegment("order_id", new AlgorithmSegment("DISTSQL.FIXTURE", new Properties()));
- TableRuleSegment tableRuleSegment = new TableRuleSegment("t_order_input", Collections.singletonList("ds_${0..1}.t_order_${0..5}"), keyGenerator, null);
- tableRuleSegment.setTableStrategySegment(new ShardingStrategySegment("standard", "user_id", new AlgorithmSegment("CORE.STANDARD.FIXTURE", new Properties())));
- AlgorithmSegment databaseAlgorithmSegment = new AlgorithmSegment("inline", PropertiesBuilder.build(new Property("algorithm-expression", "ds_${user_id % 2}")));
- tableRuleSegment.setDatabaseStrategySegment(new ShardingStrategySegment("standard", "order_id", databaseAlgorithmSegment));
- CreateShardingTableRuleStatement statementWithIfNotExists = new CreateShardingTableRuleStatement(true, Arrays.asList(autoTableRuleSegment, tableRuleSegment));
+ Collection<AbstractTableRuleSegment> segments = new LinkedList<>();
+ segments.add(createCompleteAutoTableRule());
+ segments.add(createCompleteTableRule());
+ CreateShardingTableRuleStatement statementWithIfNotExists = new CreateShardingTableRuleStatement(true, segments);
updater.checkSQLStatement(database, statementWithIfNotExists, currentRuleConfig);
- ShardingRuleConfiguration toBeCreatedRuleConfigWithIfNotExists = updater.buildToBeCreatedRuleConfiguration(currentRuleConfig, statement);
- updater.updateCurrentRuleConfiguration(currentRuleConfig, toBeCreatedRuleConfigWithIfNotExists);
+ updater.updateCurrentRuleConfiguration(currentRuleConfig, updater.buildToBeCreatedRuleConfiguration(currentRuleConfig, statementWithIfNotExists));
assertThat(currentRuleConfig.getTables().size(), is(2));
Iterator<ShardingTableRuleConfiguration> tableRuleIterator = currentRuleConfig.getTables().iterator();
ShardingTableRuleConfiguration tableRule = tableRuleIterator.next();