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 2022/12/28 06:19:23 UTC
[shardingsphere] branch master updated: Add `IF NOT EXISTS` to `create default sharding strategy` (#23119)
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 <57...@users.noreply.github.com>
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;
+ }
}