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 <[email protected]>
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();