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();

Reply via email to