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;

Reply via email to