You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2020/12/14 06:21:34 UTC

[shardingsphere] branch master updated: Support SHOW (SHARDING | REPLICA_QUERY | ENCRYPT | SHADOW) RULE FROM schema_name (#8609)

This is an automated email from the ASF dual-hosted git repository.

menghaoran 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 7258e9b  Support SHOW (SHARDING | REPLICA_QUERY | ENCRYPT | SHADOW) RULE FROM schema_name (#8609)
7258e9b is described below

commit 7258e9b5ba75518276497cdfbf3363c92bb063ce
Author: Liang Zhang <te...@163.com>
AuthorDate: Mon Dec 14 14:21:09 2020 +0800

    Support SHOW (SHARDING | REPLICA_QUERY | ENCRYPT | SHADOW) RULE FROM schema_name (#8609)
---
 .../src/main/antlr4/imports/Keyword.g4             | 12 ++++++
 .../src/main/antlr4/imports/RDLStatement.g4        |  8 +++-
 .../distsql/parser/autogen/DistSQLStatement.g4     |  2 +-
 .../distsql/parser/core/DistSQLVisitor.java        |  8 ++--
 ...ngRuleStatement.java => ShowRuleStatement.java} |  6 ++-
 ...tContext.java => ShowRuleStatementContext.java} |  8 ++--
 .../text/metadata/rdl/RDLQueryBackendHandler.java  | 48 ++++++++++++++++------
 .../text/metadata/rdl/RDLUpdateBackendHandler.java |  5 ---
 8 files changed, 67 insertions(+), 30 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 420183e..61b2432 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
@@ -46,3 +46,15 @@ FROM
 SHARDING
     : S H A R D I N G
     ;
+   
+REPLICA_QUERY
+    : R E P L I C A UL_ Q U E R Y
+    ;
+
+ENCRYPT
+    : E N C R Y P T
+    ;
+
+SHADOW
+    : S H A D O W
+    ;
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 34c4885..453b308 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
@@ -95,8 +95,12 @@ columName
     : IDENTIFIER
     ;
 
-showShardingRule
-    : SHOW SHARDING RULE (FROM schemaName)?
+showRule
+    : SHOW ruleType RULE (FROM schemaName)?
+    ;
+
+ruleType
+    : SHARDING | REPLICA_QUERY | ENCRYPT | SHADOW
     ;
 
 schemaName
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 1933a3d..7ac8e8e 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
@@ -22,6 +22,6 @@ import Symbol, RDLStatement;
 execute
     : (createDataSources
     | createShardingRule
-    | showShardingRule
+    | showRule
     ) SEMI?
     ;
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 b73a701..f5770ee 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
@@ -23,7 +23,7 @@ import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.C
 import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.DataSourceContext;
 import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.DataSourceDefinitionContext;
 import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.SchemaNameContext;
-import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowShardingRuleContext;
+import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.ShowRuleContext;
 import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.StrategyPropContext;
 import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.StrategyPropsContext;
 import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.TableRuleContext;
@@ -31,7 +31,7 @@ import org.apache.shardingsphere.distsql.parser.segment.rdl.DataSourceConnection
 import org.apache.shardingsphere.distsql.parser.segment.rdl.TableRuleSegment;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateDataSourcesStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingRuleStatement;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowShardingRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowRuleStatement;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.SchemaSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
@@ -104,8 +104,8 @@ public final class DistSQLVisitor extends DistSQLStatementBaseVisitor<ASTNode> {
     }
     
     @Override
-    public ASTNode visitShowShardingRule(final ShowShardingRuleContext ctx) {
-        return null == ctx.schemaName() ? new ShowShardingRuleStatement(null) : new ShowShardingRuleStatement((SchemaSegment) visit(ctx.schemaName()));
+    public ASTNode visitShowRule(final ShowRuleContext ctx) {
+        return new ShowRuleStatement(ctx.ruleType().getText(), null == ctx.schemaName() ? null : (SchemaSegment) visit(ctx.schemaName()));
     }
 
     @Override
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/show/impl/ShowShardingRuleStatement.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/show/impl/ShowRuleStatement.java
similarity index 90%
rename from shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/show/impl/ShowShardingRuleStatement.java
rename to shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/show/impl/ShowRuleStatement.java
index ec7fb3b..e30ff47 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/show/impl/ShowShardingRuleStatement.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/show/impl/ShowRuleStatement.java
@@ -23,11 +23,13 @@ import org.apache.shardingsphere.distsql.parser.statement.rdl.show.ShowRDLStatem
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.SchemaSegment;
 
 /**
- * Show sharding rule statement.
+ * Show rule statement.
  */
 @RequiredArgsConstructor
 @Getter
-public final class ShowShardingRuleStatement extends ShowRDLStatement {
+public final class ShowRuleStatement extends ShowRDLStatement {
+    
+    private final String ruleType;
     
     private final SchemaSegment schemaName;
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/ShowShardingRuleStatementContext.java b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/ShowRuleStatementContext.java
similarity index 78%
rename from shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/ShowShardingRuleStatementContext.java
rename to shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/ShowRuleStatementContext.java
index c8a4c5b..9b46f1c 100644
--- a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/ShowShardingRuleStatementContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/ShowRuleStatementContext.java
@@ -17,15 +17,15 @@
 
 package org.apache.shardingsphere.infra.binder.statement.rdl;
 
-import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowShardingRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowRuleStatement;
 import org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
 
 /**
- * Show sharding rule statement context.
+ * Show rule statement context.
  */
-public final class ShowShardingRuleStatementContext extends CommonSQLStatementContext<ShowShardingRuleStatement> {
+public final class ShowRuleStatementContext extends CommonSQLStatementContext<ShowRuleStatement> {
     
-    public ShowShardingRuleStatementContext(final ShowShardingRuleStatement sqlStatement) {
+    public ShowRuleStatementContext(final ShowRuleStatement sqlStatement) {
         super(sqlStatement);
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLQueryBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLQueryBackendHandler.java
index 8569ec3..311a77e 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLQueryBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLQueryBackendHandler.java
@@ -18,9 +18,10 @@
 package org.apache.shardingsphere.proxy.backend.text.metadata.rdl;
 
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowShardingRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowRuleStatement;
+import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.infra.binder.statement.rdl.ShowShardingRuleStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.rdl.ShowRuleStatementContext;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.yaml.config.YamlRuleConfiguration;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
@@ -31,6 +32,8 @@ import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.replicaquery.api.config.ReplicaQueryRuleConfiguration;
+import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
@@ -58,32 +61,53 @@ public final class RDLQueryBackendHandler implements TextProtocolBackendHandler
         return getResponseHeader(context);
     }
     
-    private ResponseHeader execute(final ShowShardingRuleStatementContext context) {
+    private ResponseHeader execute(final ShowRuleStatementContext context) {
         String schemaName = null == context.getSqlStatement().getSchemaName() ? backendConnection.getSchemaName() : context.getSqlStatement().getSchemaName().getIdentifier().getValue();
-        QueryHeader queryHeader = new QueryHeader(schemaName, "", "ShardingRule", "ShardingRule", Types.CHAR, "CHAR", 255, 0, false, false, false, false);
-        Optional<RuleConfiguration> ruleConfig = 
-                ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations().stream().filter(each -> each instanceof ShardingRuleConfiguration).findAny();
-        ruleConfig.ifPresent(shardingSphereRule -> ruleConfigData = Collections.singleton(shardingSphereRule).iterator());
+        String ruleType = context.getSqlStatement().getRuleType();
+        QueryHeader queryHeader = new QueryHeader(schemaName, "", ruleType, ruleType, Types.CHAR, "CHAR", 255, 0, false, false, false, false);
+        ruleConfigData = loadRuleConfiguration(schemaName, ruleType);
         return new QueryResponseHeader(Collections.singletonList(queryHeader));
     }
     
+    private Iterator<RuleConfiguration> loadRuleConfiguration(final String schemaName, final String ruleType) {
+        Class<? extends RuleConfiguration> ruleConfigurationClass = getRuleConfigurationClass(ruleType);
+        Optional<RuleConfiguration> ruleConfig = ProxyContext.getInstance().getMetaData(schemaName).getRuleMetaData().getConfigurations()
+                .stream().filter(each -> ruleConfigurationClass.isAssignableFrom(each.getClass())).findAny();
+        return ruleConfig.map(optional -> Collections.singleton(optional).iterator()).orElse(Collections.emptyIterator());
+    }
+    
+    private Class<? extends RuleConfiguration> getRuleConfigurationClass(final String ruleType) {
+        switch (ruleType.toUpperCase()) {
+            case "SHARDING":
+                return ShardingRuleConfiguration.class;
+            case "REPLICA_QUERY":
+                return ReplicaQueryRuleConfiguration.class;
+            case "ENCRYPT":
+                return EncryptRuleConfiguration.class;
+            case "SHADOW":
+                return ShadowRuleConfiguration.class;
+            default:
+                throw new UnsupportedOperationException(ruleType);
+        }
+    }
+    
     private SQLStatementContext<?> getSQLStatementContext() {
-        if (sqlStatement instanceof ShowShardingRuleStatement) {
-            return new ShowShardingRuleStatementContext((ShowShardingRuleStatement) sqlStatement);
+        if (sqlStatement instanceof ShowRuleStatement) {
+            return new ShowRuleStatementContext((ShowRuleStatement) sqlStatement);
         }
         throw new UnsupportedOperationException(sqlStatement.getClass().getName());
     }
     
     private ResponseHeader getResponseHeader(final SQLStatementContext<?> context) {
-        if (context instanceof ShowShardingRuleStatementContext) {
-            return execute((ShowShardingRuleStatementContext) context);
+        if (context instanceof ShowRuleStatementContext) {
+            return execute((ShowRuleStatementContext) context);
         }
         throw new UnsupportedOperationException(context.getClass().getName());
     }
     
     @Override
     public boolean next() {
-        return null != ruleConfigData && ruleConfigData.hasNext();
+        return ruleConfigData.hasNext();
     }
     
     @Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLUpdateBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLUpdateBackendHandler.java
index edc98d8..c06dfd9 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLUpdateBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/metadata/rdl/RDLUpdateBackendHandler.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.proxy.backend.text.metadata.rdl;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateDataSourcesStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingRuleStatement;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.show.impl.ShowShardingRuleStatement;
 import org.apache.shardingsphere.governance.core.event.model.datasource.DataSourcePersistEvent;
 import org.apache.shardingsphere.governance.core.event.model.rule.RuleConfigurationsPersistEvent;
 import org.apache.shardingsphere.governance.core.event.model.schema.SchemaNamePersistEvent;
@@ -29,7 +28,6 @@ import org.apache.shardingsphere.infra.binder.statement.ddl.CreateDatabaseStatem
 import org.apache.shardingsphere.infra.binder.statement.ddl.DropDatabaseStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.rdl.CreateDataSourcesStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.rdl.CreateShardingRuleStatementContext;
-import org.apache.shardingsphere.infra.binder.statement.rdl.ShowShardingRuleStatementContext;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration;
 import org.apache.shardingsphere.infra.context.metadata.impl.StandardMetaDataContexts;
@@ -124,9 +122,6 @@ public final class RDLUpdateBackendHandler implements TextProtocolBackendHandler
         if (sqlStatement instanceof DropDatabaseStatement) {
             return new DropDatabaseStatementContext((DropDatabaseStatement) sqlStatement);
         }
-        if (sqlStatement instanceof ShowShardingRuleStatement) {
-            return new ShowShardingRuleStatementContext((ShowShardingRuleStatement) sqlStatement);
-        }
         throw new UnsupportedOperationException(sqlStatement.getClass().getName());
     }