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 c5bfe00d774 Add `IF NOT EXISTS` to `create default sharding strategy` 
(#23119)
c5bfe00d774 is described below

commit c5bfe00d77403f6dfcf42c7d800ba0ef928c52a6
Author: Zichao <[email protected]>
AuthorDate: Wed Dec 28 19:19:16 2022 +1300

    Add `IF NOT EXISTS` to `create default sharding strategy` (#23119)
    
    * Add `IF NOT EXISTS` to `create default sharding strategy`
    
    * Add `IF NOT EXISTS` to `create default sharding strategy`
---
 ...ateDefaultShardingStrategyStatementUpdater.java | 13 ++++--
 ...efaultShardingStrategyStatementUpdaterTest.java | 50 +++++++++++++++++++---
 .../main/antlr4/imports/sharding/RDLStatement.g4   |  2 +-
 .../core/ShardingDistSQLStatementVisitor.java      |  2 +-
 .../CreateDefaultShardingStrategyStatement.java    | 11 ++++-
 5 files changed, 64 insertions(+), 14 deletions(-)

diff --git 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyStatementUpdater.java
 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyStatementUpdater.java
index 733292f2c7c..d13a20d032a 100644
--- 
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyStatementUpdater.java
+++ 
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/CreateDefaultShardingStrategyStatementUpdater.java
@@ -45,7 +45,9 @@ public final class 
CreateDefaultShardingStrategyStatementUpdater implements Rule
         String databaseName = database.getName();
         checkCurrentRuleConfiguration(databaseName, currentRuleConfig);
         checkAlgorithm(databaseName, currentRuleConfig, sqlStatement);
-        checkExist(databaseName, sqlStatement, currentRuleConfig);
+        if (!sqlStatement.isIfNotExists()) {
+            checkExist(databaseName, sqlStatement, currentRuleConfig);
+        }
     }
     
     private void checkCurrentRuleConfiguration(final String databaseName, 
final ShardingRuleConfiguration currentRuleConfig) {
@@ -114,14 +116,17 @@ public final class 
CreateDefaultShardingStrategyStatementUpdater implements Rule
     
     @Override
     public void updateCurrentRuleConfiguration(final ShardingRuleConfiguration 
currentRuleConfig, final ShardingRuleConfiguration toBeCreatedRuleConfig) {
-        if (!toBeCreatedRuleConfig.getShardingAlgorithms().isEmpty()) {
-            
currentRuleConfig.getShardingAlgorithms().putAll(toBeCreatedRuleConfig.getShardingAlgorithms());
-        }
         if (null != toBeCreatedRuleConfig.getDefaultTableShardingStrategy() && 
null == currentRuleConfig.getDefaultTableShardingStrategy()) {
             
currentRuleConfig.setDefaultTableShardingStrategy(toBeCreatedRuleConfig.getDefaultTableShardingStrategy());
+            if (!toBeCreatedRuleConfig.getShardingAlgorithms().isEmpty()) {
+                
currentRuleConfig.getShardingAlgorithms().putAll(toBeCreatedRuleConfig.getShardingAlgorithms());
+            }
         }
         if (null != toBeCreatedRuleConfig.getDefaultDatabaseShardingStrategy() 
&& null == currentRuleConfig.getDefaultDatabaseShardingStrategy()) {
             
currentRuleConfig.setDefaultDatabaseShardingStrategy(toBeCreatedRuleConfig.getDefaultDatabaseShardingStrategy());
+            if (!toBeCreatedRuleConfig.getShardingAlgorithms().isEmpty()) {
+                
currentRuleConfig.getShardingAlgorithms().putAll(toBeCreatedRuleConfig.getShardingAlgorithms());
+            }
         }
     }
     
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyStatementUpdaterTest.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyStatementUpdaterTest.java
index e84ae40c2d6..4bd5199b43c 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyStatementUpdaterTest.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/CreateDefaultShardingStrategyStatementUpdaterTest.java
@@ -54,19 +54,19 @@ public final class 
CreateDefaultShardingStrategyStatementUpdaterTest {
     
     @Test(expected = InvalidAlgorithmConfigurationException.class)
     public void assertExecuteWithInvalidStrategyType() {
-        updater.checkSQLStatement(database, new 
CreateDefaultShardingStrategyStatement("TABLE", "invalidType", null, null), new 
ShardingRuleConfiguration());
+        updater.checkSQLStatement(database, new 
CreateDefaultShardingStrategyStatement(false, "TABLE", "invalidType", null, 
null), new ShardingRuleConfiguration());
     }
     
     @Test(expected = MissingRequiredRuleException.class)
     public void assertExecuteWithoutCurrentConfiguration() {
-        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement("TABLE", "standard", "order_id", null);
+        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement(false, "TABLE", "standard", "order_id", 
null);
         updater.checkSQLStatement(database, statement, null);
     }
     
     @Test(expected = DuplicateRuleException.class)
     public void assertExecuteWithExist() {
         AlgorithmSegment algorithm = new 
AlgorithmSegment("order_id_algorithm", new Properties());
-        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement("TABLE", "standard", "order_id", 
algorithm);
+        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement(false, "TABLE", "standard", "order_id", 
algorithm);
         ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
         currentRuleConfig.setDefaultTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
         currentRuleConfig.getShardingAlgorithms().put("order_id_algorithm", 
null);
@@ -75,7 +75,7 @@ public final class 
CreateDefaultShardingStrategyStatementUpdaterTest {
     
     @Test(expected = InvalidAlgorithmConfigurationException.class)
     public void assertExecuteWithUnmatchedStrategy() {
-        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement("TABLE", "standard", "order_id,user_id", 
null);
+        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement(false, "TABLE", "standard", 
"order_id,user_id", null);
         ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
         currentRuleConfig.setDefaultTableShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
         currentRuleConfig.getShardingAlgorithms().put("order_id_algorithm", 
null);
@@ -85,7 +85,7 @@ public final class 
CreateDefaultShardingStrategyStatementUpdaterTest {
     @Test
     public void assertCreateDefaultTableShardingStrategy() {
         AlgorithmSegment algorithm = new 
AlgorithmSegment("order_id_algorithm", new Properties());
-        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement("TABLE", "standard", "order_id", 
algorithm);
+        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement(false, "TABLE", "standard", "order_id", 
algorithm);
         ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
         currentRuleConfig.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
         currentRuleConfig.getShardingAlgorithms().put("order_id_algorithm", 
null);
@@ -100,7 +100,7 @@ public final class 
CreateDefaultShardingStrategyStatementUpdaterTest {
     @Test
     public void assertCreateDefaultDatabaseShardingStrategy() {
         AlgorithmSegment databaseAlgorithmSegment = 
getAutoCreativeAlgorithmSegment("inline", newProperties("algorithm-expression", 
"ds_${user_id% 2}"));
-        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement("DATABASE", "standard", "user_id", 
databaseAlgorithmSegment);
+        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement(false, "DATABASE", "standard", 
"user_id", databaseAlgorithmSegment);
         ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
         updater.checkSQLStatement(database, statement, currentRuleConfig);
         ShardingRuleConfiguration toBeCreatedRuleConfig = 
updater.buildToBeCreatedRuleConfiguration(statement);
@@ -110,6 +110,44 @@ public final class 
CreateDefaultShardingStrategyStatementUpdaterTest {
         assertThat(defaultDatabaseShardingStrategy.getShardingColumn(), 
is("user_id"));
     }
     
+    @Test
+    public void assertCreateDefaultTableShardingStrategyWithIfNotExists() {
+        AlgorithmSegment algorithm = new 
AlgorithmSegment("order_id_algorithm", new Properties());
+        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement(false, "TABLE", "standard", "order_id", 
algorithm);
+        ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
+        currentRuleConfig.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "orderAlgorithm"));
+        currentRuleConfig.getShardingAlgorithms().put("order_id_algorithm", 
null);
+        updater.checkSQLStatement(database, statement, currentRuleConfig);
+        ShardingRuleConfiguration toBeCreatedRuleConfig = 
updater.buildToBeCreatedRuleConfiguration(statement);
+        updater.updateCurrentRuleConfiguration(currentRuleConfig, 
toBeCreatedRuleConfig);
+        algorithm = new AlgorithmSegment("user_id_algorithm", new 
Properties());
+        CreateDefaultShardingStrategyStatement statementWithIfNotExists = new 
CreateDefaultShardingStrategyStatement(true, "TABLE", "standard", "order_id", 
algorithm);
+        updater.checkSQLStatement(database, statementWithIfNotExists, 
currentRuleConfig);
+        toBeCreatedRuleConfig = 
updater.buildToBeCreatedRuleConfiguration(statementWithIfNotExists);
+        updater.updateCurrentRuleConfiguration(currentRuleConfig, 
toBeCreatedRuleConfig);
+        StandardShardingStrategyConfiguration defaultTableShardingStrategy = 
(StandardShardingStrategyConfiguration) 
currentRuleConfig.getDefaultTableShardingStrategy();
+        assertThat(defaultTableShardingStrategy.getShardingAlgorithmName(), 
is("default_table_order_id_algorithm"));
+        assertThat(defaultTableShardingStrategy.getShardingColumn(), 
is("order_id"));
+    }
+    
+    @Test
+    public void assertCreateDefaultDatabaseShardingStrategyWithIfNotExists() {
+        AlgorithmSegment databaseAlgorithmSegment = 
getAutoCreativeAlgorithmSegment("inline", newProperties("algorithm-expression", 
"ds_${user_id% 2}"));
+        CreateDefaultShardingStrategyStatement statement = new 
CreateDefaultShardingStrategyStatement(false, "DATABASE", "standard", 
"user_id", databaseAlgorithmSegment);
+        ShardingRuleConfiguration currentRuleConfig = new 
ShardingRuleConfiguration();
+        updater.checkSQLStatement(database, statement, currentRuleConfig);
+        ShardingRuleConfiguration toBeCreatedRuleConfig = 
updater.buildToBeCreatedRuleConfiguration(statement);
+        updater.updateCurrentRuleConfiguration(currentRuleConfig, 
toBeCreatedRuleConfig);
+        databaseAlgorithmSegment = getAutoCreativeAlgorithmSegment("inline", 
newProperties("algorithm-expression", "ds_${order_id% 2}"));
+        CreateDefaultShardingStrategyStatement statementWithIfNotExists = new 
CreateDefaultShardingStrategyStatement(true, "TABLE", "standard", "order_id", 
databaseAlgorithmSegment);
+        updater.checkSQLStatement(database, statementWithIfNotExists, 
currentRuleConfig);
+        toBeCreatedRuleConfig = 
updater.buildToBeCreatedRuleConfiguration(statementWithIfNotExists);
+        updater.updateCurrentRuleConfiguration(currentRuleConfig, 
toBeCreatedRuleConfig);
+        StandardShardingStrategyConfiguration defaultDatabaseShardingStrategy 
= (StandardShardingStrategyConfiguration) 
currentRuleConfig.getDefaultDatabaseShardingStrategy();
+        assertThat(defaultDatabaseShardingStrategy.getShardingAlgorithmName(), 
is("default_database_inline"));
+        assertThat(defaultDatabaseShardingStrategy.getShardingColumn(), 
is("user_id"));
+    }
+    
     private AlgorithmSegment getAutoCreativeAlgorithmSegment(final String 
name, final Properties props) {
         return new AlgorithmSegment(name, props);
     }
diff --git 
a/features/sharding/distsql/parser/src/main/antlr4/imports/sharding/RDLStatement.g4
 
b/features/sharding/distsql/parser/src/main/antlr4/imports/sharding/RDLStatement.g4
index 8d97b5d56d8..c2a54c8c05a 100644
--- 
a/features/sharding/distsql/parser/src/main/antlr4/imports/sharding/RDLStatement.g4
+++ 
b/features/sharding/distsql/parser/src/main/antlr4/imports/sharding/RDLStatement.g4
@@ -56,7 +56,7 @@ dropShardingAlgorithm
     ;
 
 createDefaultShardingStrategy
-    : CREATE DEFAULT SHARDING type=(DATABASE | TABLE) STRATEGY LP_ 
shardingStrategy RP_
+    : CREATE DEFAULT SHARDING type=(DATABASE | TABLE) STRATEGY ifNotExists? 
LP_ shardingStrategy RP_
     ;
 
 alterDefaultShardingStrategy
diff --git 
a/features/sharding/distsql/parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java
 
b/features/sharding/distsql/parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java
index 1ae81d1de6a..ae79c7d6259 100644
--- 
a/features/sharding/distsql/parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java
+++ 
b/features/sharding/distsql/parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java
@@ -196,7 +196,7 @@ public final class ShardingDistSQLStatementVisitor extends 
ShardingDistSQLStatem
         String defaultType = new 
IdentifierValue(ctx.type.getText()).getValue();
         String strategyType = 
getIdentifierValue(shardingStrategyContext.strategyType());
         String shardingColumn = 
buildShardingColumn(ctx.shardingStrategy().shardingColumnDefinition());
-        return new CreateDefaultShardingStrategyStatement(defaultType, 
strategyType, shardingColumn, algorithmSegment);
+        return new CreateDefaultShardingStrategyStatement(null != 
ctx.ifNotExists(), defaultType, strategyType, shardingColumn, algorithmSegment);
     }
     
     @Override
diff --git 
a/features/sharding/distsql/statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateDefaultShardingStrategyStatement.java
 
b/features/sharding/distsql/statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateDefaultShardingStrategyStatement.java
index ea165e6c741..cf3ed7b35c2 100644
--- 
a/features/sharding/distsql/statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateDefaultShardingStrategyStatement.java
+++ 
b/features/sharding/distsql/statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateDefaultShardingStrategyStatement.java
@@ -18,14 +18,12 @@
 package org.apache.shardingsphere.sharding.distsql.parser.statement;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.distsql.parser.segment.AlgorithmSegment;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.create.CreateRuleStatement;
 
 /**
  * Create default sharding strategy statement.
  */
-@RequiredArgsConstructor
 @Getter
 public final class CreateDefaultShardingStrategyStatement extends 
CreateRuleStatement {
     
@@ -36,4 +34,13 @@ public final class CreateDefaultShardingStrategyStatement 
extends CreateRuleStat
     private final String shardingColumn;
     
     private final AlgorithmSegment algorithmSegment;
+    
+    public CreateDefaultShardingStrategyStatement(final boolean ifNotExists, 
final String defaultType, final String strategyType,
+                                                  final String shardingColumn, 
final AlgorithmSegment algorithmSegment) {
+        super(ifNotExists);
+        this.defaultType = defaultType;
+        this.strategyType = strategyType;
+        this.shardingColumn = shardingColumn;
+        this.algorithmSegment = algorithmSegment;
+    }
 }

Reply via email to