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 e5a0f8446c7 Make CREATE SHARDING TABLE RULE support
NoneShardingStrategy (#24059)
e5a0f8446c7 is described below
commit e5a0f8446c76f3f38bfb9f23eff2531417c183a9
Author: Zichao <[email protected]>
AuthorDate: Tue Feb 14 10:26:26 2023 +0800
Make CREATE SHARDING TABLE RULE support NoneShardingStrategy (#24059)
---
.../checker/ShardingTableRuleStatementChecker.java | 4 ++--
.../ShardingTableRuleStatementConverter.java | 4 ++++
.../checker/ShardingRuleStatementCheckerTest.java | 16 ++++++++++++++++
.../ShardingRuleStatementConverterTest.java | 21 +++++++++++++++++++++
.../src/main/antlr4/imports/sharding/Keyword.g4 | 4 ++++
.../main/antlr4/imports/sharding/RDLStatement.g4 | 3 ++-
.../core/ShardingDistSQLStatementVisitor.java | 3 +++
7 files changed, 52 insertions(+), 3 deletions(-)
diff --git
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
index 36b346dc80b..c086c7b6040 100644
---
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
+++
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
@@ -305,7 +305,7 @@ public final class ShardingTableRuleStatementChecker {
private static void checkStrategy(final String databaseName, final
Collection<TableRuleSegment> rules) {
rules.forEach(each -> {
Optional<ShardingStrategySegment> databaseStrategySegment =
Optional.ofNullable(each.getDatabaseStrategySegment());
- if (databaseStrategySegment.isPresent()) {
+ if (databaseStrategySegment.isPresent() &&
!databaseStrategySegment.get().getType().equalsIgnoreCase("none")) {
AlgorithmSegment databaseShardingAlgorithm =
databaseStrategySegment.get().getShardingAlgorithm();
if (null != databaseShardingAlgorithm) {
ShardingAlgorithm shardingAlgorithm =
TypedSPILoader.getService(ShardingAlgorithm.class,
databaseShardingAlgorithm.getName(), databaseShardingAlgorithm.getProps());
@@ -318,7 +318,7 @@ public final class ShardingTableRuleStatementChecker {
null == databaseShardingAlgorithm ? null :
databaseShardingAlgorithm.getName()));
}
Optional<ShardingStrategySegment> tableStrategySegment =
Optional.ofNullable(each.getTableStrategySegment());
- if (tableStrategySegment.isPresent()) {
+ if (tableStrategySegment.isPresent() &&
!tableStrategySegment.get().getType().equalsIgnoreCase("none")) {
AlgorithmSegment tableShardingAlgorithm =
tableStrategySegment.get().getShardingAlgorithm();
if (null != tableShardingAlgorithm) {
ShardingAlgorithm shardingAlgorithm =
TypedSPILoader.getService(ShardingAlgorithm.class,
tableShardingAlgorithm.getName(), tableShardingAlgorithm.getProps());
diff --git
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/converter/ShardingTableRuleStatementConverter.java
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/converter/ShardingTableRuleStatementConverter.java
index dd3b43db298..ec9358260b7 100644
---
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/converter/ShardingTableRuleStatementConverter.java
+++
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/converter/ShardingTableRuleStatementConverter.java
@@ -26,6 +26,7 @@ import
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleC
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.distsql.handler.enums.ShardingStrategyLevelType;
import
org.apache.shardingsphere.sharding.distsql.handler.enums.ShardingStrategyType;
@@ -158,6 +159,9 @@ public final class ShardingTableRuleStatementConverter {
private static ShardingStrategyConfiguration
createShardingStrategyConfiguration(final String logicTable, final
ShardingStrategyLevelType strategyLevel, final String type,
final ShardingStrategySegment segment) {
+ if ("none".equalsIgnoreCase(type)) {
+ return new NoneShardingStrategyConfiguration();
+ }
String shardingAlgorithmName =
getTableShardingAlgorithmName(logicTable, strategyLevel,
segment.getShardingAlgorithm().getName());
return
createStrategyConfiguration(ShardingStrategyType.getValueOf(type).name(),
segment.getShardingColumn(), shardingAlgorithmName);
}
diff --git
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
index ef9e5116438..bc1a6d91e6f 100644
---
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
+++
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/checker/ShardingRuleStatementCheckerTest.java
@@ -266,6 +266,13 @@ public final class ShardingRuleStatementCheckerTest {
ShardingTableRuleStatementChecker.checkCreation(database, rules, true,
shardingRuleConfig);
}
+ @Test
+ public void assertCheckerTableRuleWithNoneStrategyTypeSuccess() {
+ Collection<AbstractTableRuleSegment> rules = new LinkedList<>();
+ rules.add(createCompleteTableRuleWithNoneTypeStrategy());
+ ShardingTableRuleStatementChecker.checkCreation(database, rules,
false, shardingRuleConfig);
+ }
+
private static ShardingRuleConfiguration createShardingRuleConfiguration()
{
ShardingRuleConfiguration result = new ShardingRuleConfiguration();
ShardingTableRuleConfiguration tableRuleConfig = new
ShardingTableRuleConfiguration("t_order", "ds_${0..1}.t_order${0..1}");
@@ -304,4 +311,13 @@ public final class ShardingRuleStatementCheckerTest {
result.setDatabaseStrategySegment(new ShardingStrategySegment("hint",
"product_id", new AlgorithmSegment("CORE.HINT.FIXTURE", props)));
return result;
}
+
+ private TableRuleSegment createCompleteTableRuleWithNoneTypeStrategy() {
+ Properties props = new Properties();
+ KeyGenerateStrategySegment keyGenerator = new
KeyGenerateStrategySegment("product_id", new
AlgorithmSegment("DISTSQL.FIXTURE", props));
+ TableRuleSegment result = new TableRuleSegment("t_product_1",
Collections.singletonList("ds_${0..1}.t_order${0..1}"), keyGenerator, null);
+ result.setTableStrategySegment(new ShardingStrategySegment("none",
null, null));
+ result.setDatabaseStrategySegment(new ShardingStrategySegment("none",
null, null));
+ return result;
+ }
}
diff --git
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/converter/ShardingRuleStatementConverterTest.java
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/converter/ShardingRuleStatementConverterTest.java
index e24102aaf01..04668213e31 100644
---
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/converter/ShardingRuleStatementConverterTest.java
+++
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/converter/ShardingRuleStatementConverterTest.java
@@ -75,6 +75,27 @@ public final class ShardingRuleStatementConverterTest {
assertThat(config.getAuditors().get("sharding_key_required_auditor").getType(),
is("DML_SHARDING_CONDITIONS"));
}
+ @Test
+ public void assertConvertWithNoneStrategyType() {
+ ShardingRuleConfiguration config =
ShardingTableRuleStatementConverter.convert(createNoneStrategyTypeTableRuleSegment());
+ assertThat(config.getTables().size(), is(1));
+ ShardingTableRuleConfiguration tableRule =
config.getTables().iterator().next();
+ assertThat(tableRule.getLogicTable(), is("t_order"));
+ assertThat(tableRule.getActualDataNodes(), is("ds0,ds1"));
+ assertThat(tableRule.getDatabaseShardingStrategy().getType(), is(""));
+ assertThat(tableRule.getKeyGenerateStrategy().getKeyGeneratorName(),
is("t_order_snowflake"));
+ assertThat(tableRule.getKeyGenerateStrategy().getColumn(),
is("order_id"));
+ }
+
+ private Collection<AbstractTableRuleSegment>
createNoneStrategyTypeTableRuleSegment() {
+ TableRuleSegment tableRuleSegment = new TableRuleSegment("t_order",
Arrays.asList("ds0", "ds1"),
+ new KeyGenerateStrategySegment("order_id", new
AlgorithmSegment("snowflake", PropertiesBuilder.build(new Property("", "")))),
+ new AuditStrategySegment(Collections.singleton(new
ShardingAuditorSegment("sharding_key_required_auditor",
+ new AlgorithmSegment("DML_SHARDING_CONDITIONS", new
Properties()))), true));
+ tableRuleSegment.setDatabaseStrategySegment(new
ShardingStrategySegment("none", null, null));
+ return Collections.singleton(tableRuleSegment);
+ }
+
private Collection<AbstractTableRuleSegment> createTableRuleSegment1() {
AutoTableRuleSegment autoTableRuleSegment1 = new
AutoTableRuleSegment("t_order", Arrays.asList("ds0", "ds1"));
autoTableRuleSegment1.setShardingColumn("order_id");
diff --git
a/features/sharding/distsql/parser/src/main/antlr4/imports/sharding/Keyword.g4
b/features/sharding/distsql/parser/src/main/antlr4/imports/sharding/Keyword.g4
index 80749198f99..70a9b540c04 100644
---
a/features/sharding/distsql/parser/src/main/antlr4/imports/sharding/Keyword.g4
+++
b/features/sharding/distsql/parser/src/main/antlr4/imports/sharding/Keyword.g4
@@ -326,3 +326,7 @@ DML_SHARDING_CONDITIONS
NOT
: N O T
;
+
+NONE
+ : N O N E
+ ;
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 c2a54c8c05a..5dfdf6974b6 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
@@ -136,7 +136,7 @@ shardingAlgorithm
;
shardingStrategy
- : TYPE EQ_ strategyType COMMA_ shardingColumnDefinition COMMA_
shardingAlgorithm
+ : TYPE EQ_ strategyType (COMMA_ shardingColumnDefinition COMMA_
shardingAlgorithm)?
;
databaseStrategy
@@ -183,6 +183,7 @@ buildInStrategyType
: STANDARD
| COMPLEX
| HINT
+ | NONE
;
ifExists
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 ae79c7d6259..a59bab21c89 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
@@ -324,6 +324,9 @@ public final class ShardingDistSQLStatementVisitor extends
ShardingDistSQLStatem
if (null == ctx) {
return null;
}
+ if ("none".equalsIgnoreCase(getIdentifierValue(ctx.strategyType()))) {
+ return new
ShardingStrategySegment(getIdentifierValue(ctx.strategyType()), null, null);
+ }
AlgorithmSegment algorithmSegment = null !=
ctx.shardingAlgorithm().algorithmDefinition() ? (AlgorithmSegment)
visitAlgorithmDefinition(ctx.shardingAlgorithm().algorithmDefinition()) : null;
return new
ShardingStrategySegment(getIdentifierValue(ctx.strategyType()),
buildShardingColumn(ctx.shardingColumnDefinition()), algorithmSegment);
}