This is an automated email from the ASF dual-hosted git repository.
panjuan 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 f23d221 Add create readwrite splitting rule (#10330)
f23d221 is described below
commit f23d221bcc50b712ca8cbe137aeeca54fbf362fd
Author: Haoran Meng <[email protected]>
AuthorDate: Fri May 14 11:36:40 2021 +0800
Add create readwrite splitting rule (#10330)
* add readwrite splitting rule parser
* rename read_write_splitting to readwrite_splitting
* rename read_write_splitting to readwrite_splitting
Co-authored-by: menghaoranss <[email protected]>
---
.../src/main/antlr4/imports/Keyword.g4 | 18 ++++++++++-
.../src/main/antlr4/imports/RDLStatement.g4 | 26 ++++++++++++++-
.../distsql/parser/autogen/DistSQLStatement.g4 | 1 +
.../distsql/parser/core/DistSQLVisitor.java | 37 ++++++++++++++++++++++
.../api/DistSQLStatementParserEngineTest.java | 24 ++++++++++++++
.../segment/rdl/ReadwriteSplittingRuleSegment.java | 4 ++-
6 files changed, 107 insertions(+), 3 deletions(-)
diff --git
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/Keyword.g4
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/Keyword.g4
index 937f346..0b80011 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/Keyword.g4
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/Keyword.g4
@@ -82,7 +82,23 @@ FROM
SHARDING
: S H A R D I N G
;
-
+
+READWRITE_SPLITTING
+ : R E A D W R I T E UL_ S P L I T T I N G
+ ;
+
+WRITE_RESOURCE
+ : W R I T E UL_ R E S O U R C E
+ ;
+
+READ_RESOURCES
+ : R E A D UL_ R E S O U R C E S
+ ;
+
+AUTO_AWARE_RESOURCE
+ : A U T O UL_ A W A R E UL_ R E S O U R C E
+ ;
+
REPLICA_QUERY
: R E P L I C A UL_ Q U E R Y
;
diff --git
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RDLStatement.g4
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RDLStatement.g4
index 61d6751..aa85a4c 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RDLStatement.g4
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RDLStatement.g4
@@ -87,6 +87,22 @@ alterShardingBroadcastTableRules
: ALTER SHARDING BROADCAST TABLE RULES LP IDENTIFIER (COMMA IDENTIFIER)* RP
;
+createReadwriteSplittingRule
+ : CREATE READWRITE_SPLITTING RULE readwriteSplittingRuleDefinition (COMMA
readwriteSplittingRuleDefinition)*
+ ;
+
+readwriteSplittingRuleDefinition
+ : ruleName LP (staticReadwriteSplittingRuleDefinition |
dynamicReadwriteSplittingRuleDefinition) (COMMA functionDefinition)? RP
+ ;
+
+staticReadwriteSplittingRuleDefinition
+ : WRITE_RESOURCE EQ writeResourceName COMMA READ_RESOURCES LP resourceName
(COMMA resourceName)* RP
+ ;
+
+dynamicReadwriteSplittingRuleDefinition
+ : AUTO_AWARE_RESOURCE EQ IDENTIFIER
+ ;
+
createReplicaQueryRule
: CREATE REPLICA_QUERY RULE LP replicaQueryRuleDefinition (COMMA
replicaQueryRuleDefinition)* RP
;
@@ -115,6 +131,14 @@ resources
: RESOURCES LP IDENTIFIER (COMMA IDENTIFIER)* RP
;
+writeResourceName
+ : resourceName
+ ;
+
+resourceName
+ : IDENTIFIER
+ ;
+
shardingColumn
: SHARDING_COLUMN EQ columnName
;
@@ -196,7 +220,7 @@ schemaName
;
functionDefinition
- : TYPE LP NAME EQ functionName COMMA PROPERTIES LP algorithmProperties? RP
RP
+ : TYPE LP NAME EQ functionName (COMMA PROPERTIES LP algorithmProperties?
RP)? RP
;
functionName
diff --git
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
index 08835c1..b328604 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
@@ -25,6 +25,7 @@ execute
| createShardingTableRule
| createShardingBindingTableRules
| createShardingBroadcastTableRules
+ | createReadwriteSplittingRule
| alterShardingTableRule
| alterShardingBindingTableRules
| alterShardingBroadcastTableRules
diff --git
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
index 75c9c1a..89f1ea9 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
@@ -188,6 +188,43 @@ public final class DistSQLVisitor extends
DistSQLStatementBaseVisitor<ASTNode> {
}
@Override
+ public ASTNode visitCreateReadwriteSplittingRule(final
DistSQLStatementParser.CreateReadwriteSplittingRuleContext ctx) {
+ return new
CreateReadwriteSplittingRuleStatement(ctx.readwriteSplittingRuleDefinition()
+ .stream().map(each -> (ReadwriteSplittingRuleSegment)
visit(each)).collect(Collectors.toList()));
+ }
+
+ @Override
+ public ASTNode visitReadwriteSplittingRuleDefinition(final
DistSQLStatementParser.ReadwriteSplittingRuleDefinitionContext ctx) {
+ ReadwriteSplittingRuleSegment result = (ReadwriteSplittingRuleSegment)
(null != ctx.dynamicReadwriteSplittingRuleDefinition()
+ ? visit(ctx.dynamicReadwriteSplittingRuleDefinition())
+ : visit(ctx.staticReadwriteSplittingRuleDefinition()));
+ Properties props = new Properties();
+ if (null != ctx.functionDefinition().algorithmProperties()) {
+ ctx.functionDefinition().algorithmProperties().algorithmProperty()
+ .forEach(each -> props.setProperty(each.key.getText(),
each.value.getText()));
+ }
+ result.setName(ctx.ruleName().getText());
+
result.setLoadBalancer(ctx.functionDefinition().functionName().getText());
+ result.setProps(props);
+ return result;
+ }
+
+ @Override
+ public ASTNode visitStaticReadwriteSplittingRuleDefinition(final
DistSQLStatementParser.StaticReadwriteSplittingRuleDefinitionContext ctx) {
+ ReadwriteSplittingRuleSegment result = new
ReadwriteSplittingRuleSegment();
+ result.setWriteDataSource(ctx.writeResourceName().getText());
+ result.setReadDataSources(ctx.resourceName().stream().map(each ->
each.getText()).collect(Collectors.toList()));
+ return result;
+ }
+
+ @Override
+ public ASTNode visitDynamicReadwriteSplittingRuleDefinition(final
DistSQLStatementParser.DynamicReadwriteSplittingRuleDefinitionContext ctx) {
+ ReadwriteSplittingRuleSegment result = new
ReadwriteSplittingRuleSegment();
+ result.setAutoAwareResource(ctx.IDENTIFIER().getText());
+ return result;
+ }
+
+ @Override
public ASTNode visitReplicaQueryRuleDefinition(final
ReplicaQueryRuleDefinitionContext ctx) {
ReadwriteSplittingRuleSegment result = new
ReadwriteSplittingRuleSegment();
Collection<String> replicaDatasources = new LinkedList<>();
diff --git
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
index 3f0180d..006ffef 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardin
import
org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardingBroadcastTableRulesStatement;
import
org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardingTableRuleStatement;
import
org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
+import
org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateReadwriteSplittingRuleStatement;
import
org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingBindingTableRulesStatement;
import
org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingBroadcastTableRulesStatement;
import
org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingTableRuleStatement;
@@ -82,6 +83,17 @@ public final class DistSQLStatementParserEngineTest {
private static final String RDL_DROP_SHARDING_BROADCAST_TABLE_RULES =
"DROP SHARDING BROADCAST TABLE RULES";
+ private static final String RDL_CREATE_STATIC_READWRITE_SPLITTING_RULE =
"CREATE READWRITE_SPLITTING RULE ms_group_0 ("
+ + "WRITE_RESOURCE=primary_ds,"
+ + "READ_RESOURCES(replica_ds_0,replica_ds_1),"
+ + "TYPE(NAME=random)"
+ + ")";
+
+ private static final String RDL_CREATE_DYNAMIC_READWRITE_SPLITTING_RULE =
"CREATE READWRITE_SPLITTING RULE ms_group_1 ("
+ + "AUTO_AWARE_RESOURCE=group_0,"
+ + "TYPE(NAME=random,PROPERTIES(read_weight='2:1'))"
+ + ")";
+
private final DistSQLStatementParserEngine engine = new
DistSQLStatementParserEngine();
@Test
@@ -230,4 +242,16 @@ public final class DistSQLStatementParserEngineTest {
SQLStatement sqlStatement =
engine.parse(RDL_DROP_SHARDING_BROADCAST_TABLE_RULES);
assertTrue(sqlStatement instanceof
DropShardingBroadcastTableRulesStatement);
}
+
+ @Test
+ public void assertParseStaticReadwriteSplittingRule() {
+ SQLStatement sqlStatement =
engine.parse(RDL_CREATE_STATIC_READWRITE_SPLITTING_RULE);
+ assertTrue(sqlStatement instanceof
CreateReadwriteSplittingRuleStatement);
+ }
+
+ @Test
+ public void assertParseDynamicReadwriteSplittingRule() {
+ SQLStatement sqlStatement =
engine.parse(RDL_CREATE_DYNAMIC_READWRITE_SPLITTING_RULE);
+ assertTrue(sqlStatement instanceof
CreateReadwriteSplittingRuleStatement);
+ }
}
diff --git
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/ReadwriteSplittingRuleSegment.java
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/ReadwriteSplittingRuleSegment.java
index 86a7281..5500afb 100644
---
a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/ReadwriteSplittingRuleSegment.java
+++
b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/ReadwriteSplittingRuleSegment.java
@@ -32,7 +32,9 @@ import java.util.Properties;
public final class ReadwriteSplittingRuleSegment implements ASTNode {
private String name;
-
+
+ private String autoAwareResource;
+
private String writeDataSource;
private Collection<String> readDataSources;