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 2023/02/14 12:01:39 UTC

[shardingsphere] branch master updated: Make `ShowDatabaseDiscoveryRule`support query specified rule (#24162)

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 2fc47ab14dd Make `ShowDatabaseDiscoveryRule`support query specified rule (#24162)
2fc47ab14dd is described below

commit 2fc47ab14ddf57edf95cd6b3bef5d8c9b02c5cfd
Author: Zichao <57...@users.noreply.github.com>
AuthorDate: Tue Feb 14 20:01:23 2023 +0800

    Make `ShowDatabaseDiscoveryRule`support query specified rule (#24162)
---
 .../query/ShowDatabaseDiscoveryRuleExecutor.java       | 18 ++++++------------
 .../query/ShowDatabaseDiscoveryRuleExecutorTest.java   | 14 ++++++++++++++
 .../main/antlr4/imports/db-discovery/RQLStatement.g4   |  6 +++++-
 .../core/DatabaseDiscoveryDistSQLStatementVisitor.java |  3 ++-
 .../statement/ShowDatabaseDiscoveryRulesStatement.java |  7 ++++++-
 5 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/features/db-discovery/distsql/handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/query/ShowDatabaseDiscoveryRuleExecutor.java b/features/db-discovery/distsql/handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/query/ShowDatabaseDiscoveryRuleExecutor.java
index fdd05acf604..b73de16e474 100644
--- a/features/db-discovery/distsql/handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/query/ShowDatabaseDiscoveryRuleExecutor.java
+++ b/features/db-discovery/distsql/handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/query/ShowDatabaseDiscoveryRuleExecutor.java
@@ -44,18 +44,8 @@ import java.util.stream.Collectors;
  */
 public final class ShowDatabaseDiscoveryRuleExecutor implements RQLExecutor<ShowDatabaseDiscoveryRulesStatement> {
     
-    private static final String GROUP_NAME = "group_name";
-    
-    private static final String DATA_SOURCE_NAMES = "data_source_names";
-    
-    private static final String PRIMARY_DATA_SOURCE_NAME = "primary_data_source_name";
-    
     private static final String NAME = "name";
     
-    private static final String DISCOVER_TYPE = "discovery_type";
-    
-    private static final String HEARTBEAT = "discovery_heartbeat";
-    
     @Override
     public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereDatabase database, final ShowDatabaseDiscoveryRulesStatement sqlStatement) {
         Optional<DatabaseDiscoveryRule> rule = database.getRuleMetaData().findSingleRule(DatabaseDiscoveryRule.class);
@@ -80,14 +70,18 @@ public final class ShowDatabaseDiscoveryRuleExecutor implements RQLExecutor<Show
             heartbeatMap.putAll(convertToMap(discoveryHeartbeats.get(dataSourceRuleConfig.getDiscoveryHeartbeatName())));
             String groupName = dataSourceRuleConfig.getGroupName();
             String primaryDataSourceName = null == primaryDataSources.get(groupName) ? "" : primaryDataSources.get(groupName);
-            result.add(new LocalDataQueryResultRow(groupName, String.join(",", dataSourceRuleConfig.getDataSourceNames()), primaryDataSourceName, typeMap, heartbeatMap));
+            if (null == sqlStatement.getRuleName()) {
+                result.add(new LocalDataQueryResultRow(groupName, String.join(",", dataSourceRuleConfig.getDataSourceNames()), primaryDataSourceName, typeMap, heartbeatMap));
+            } else if (sqlStatement.getRuleName().equalsIgnoreCase(groupName)) {
+                result.add(new LocalDataQueryResultRow(groupName, String.join(",", dataSourceRuleConfig.getDataSourceNames()), primaryDataSourceName, typeMap, heartbeatMap));
+            }
         }
         return result;
     }
     
     @Override
     public Collection<String> getColumnNames() {
-        return Arrays.asList(GROUP_NAME, DATA_SOURCE_NAMES, PRIMARY_DATA_SOURCE_NAME, DISCOVER_TYPE, HEARTBEAT);
+        return Arrays.asList("group_name", "data_source_names", "primary_data_source_name", "discovery_type", "discovery_heartbeat");
     }
     
     @SuppressWarnings("unchecked")
diff --git a/features/db-discovery/distsql/handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/query/ShowDatabaseDiscoveryRuleExecutorTest.java b/features/db-discovery/distsql/handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/query/ShowDatabaseDiscoveryRuleExecutorTest.java
index 484690d778f..ebddf3b4d9c 100644
--- a/features/db-discovery/distsql/handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/query/ShowDatabaseDiscoveryRuleExecutorTest.java
+++ b/features/db-discovery/distsql/handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/query/ShowDatabaseDiscoveryRuleExecutorTest.java
@@ -60,6 +60,20 @@ public final class ShowDatabaseDiscoveryRuleExecutorTest {
         assertRowData(new ArrayList<>(executor.getRows(database, mock(ShowDatabaseDiscoveryRulesStatement.class))));
     }
     
+    @Test
+    public void assertGetRowsWithSpecifiedRuleName() {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+        DatabaseDiscoveryRule rule = mock(DatabaseDiscoveryRule.class, RETURNS_DEEP_STUBS);
+        when(rule.getConfiguration()).thenReturn(createRuleConfiguration());
+        DatabaseDiscoveryDataSourceRule dataSourceRule = mock(DatabaseDiscoveryDataSourceRule.class);
+        when(dataSourceRule.getPrimaryDataSourceName()).thenReturn("ds_0");
+        when(rule.getDataSourceRules()).thenReturn(Collections.singletonMap("ms_group", dataSourceRule));
+        when(database.getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.singleton(rule)));
+        RQLExecutor<ShowDatabaseDiscoveryRulesStatement> executor = new ShowDatabaseDiscoveryRuleExecutor();
+        assertColumns(executor.getColumnNames());
+        assertRowData(new ArrayList<>(executor.getRows(database, new ShowDatabaseDiscoveryRulesStatement("ms_group", null))));
+    }
+    
     @Test
     public void assertGetColumnNames() {
         RQLExecutor<ShowDatabaseDiscoveryRulesStatement> executor = new ShowDatabaseDiscoveryRuleExecutor();
diff --git a/features/db-discovery/distsql/parser/src/main/antlr4/imports/db-discovery/RQLStatement.g4 b/features/db-discovery/distsql/parser/src/main/antlr4/imports/db-discovery/RQLStatement.g4
index 7f8c7a814d3..25addc2d0a8 100644
--- a/features/db-discovery/distsql/parser/src/main/antlr4/imports/db-discovery/RQLStatement.g4
+++ b/features/db-discovery/distsql/parser/src/main/antlr4/imports/db-discovery/RQLStatement.g4
@@ -20,7 +20,7 @@ grammar RQLStatement;
 import BaseRule;
 
 showDatabaseDiscoveryRules
-    : SHOW DB_DISCOVERY RULES (FROM databaseName)?
+    : SHOW DB_DISCOVERY (RULE ruleName | RULES) (FROM databaseName)?
     ;
 
 showDatabaseDiscoveryTypes
@@ -35,6 +35,10 @@ countDatabaseDiscoveryRule
     : COUNT DB_DISCOVERY RULE (FROM databaseName)?
     ;
 
+ruleName
+    : IDENTIFIER_
+    ;
+
 databaseName
     : IDENTIFIER_
     ;
diff --git a/features/db-discovery/distsql/parser/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/core/DatabaseDiscoveryDistSQLStatementVisitor.java b/features/db-discovery/distsql/parser/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/core/DatabaseDiscoveryDistSQLStatementVisitor.java
index 57f4cef423f..178a16b291f 100644
--- a/features/db-discovery/distsql/parser/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/core/DatabaseDiscoveryDistSQLStatementVisitor.java
+++ b/features/db-discovery/distsql/parser/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/core/DatabaseDiscoveryDistSQLStatementVisitor.java
@@ -88,7 +88,8 @@ public final class DatabaseDiscoveryDistSQLStatementVisitor extends DatabaseDisc
     
     @Override
     public ASTNode visitShowDatabaseDiscoveryRules(final ShowDatabaseDiscoveryRulesContext ctx) {
-        return new ShowDatabaseDiscoveryRulesStatement(null == ctx.databaseName() ? null : (DatabaseSegment) visit(ctx.databaseName()));
+        return new ShowDatabaseDiscoveryRulesStatement(null == ctx.ruleName() ? null : getIdentifierValue(ctx.ruleName()),
+                null == ctx.databaseName() ? null : (DatabaseSegment) visit(ctx.databaseName()));
     }
     
     @Override
diff --git a/features/db-discovery/distsql/statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/ShowDatabaseDiscoveryRulesStatement.java b/features/db-discovery/distsql/statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/ShowDatabaseDiscoveryRulesStatement.java
index a0d508a4942..ac5f38d4093 100644
--- a/features/db-discovery/distsql/statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/ShowDatabaseDiscoveryRulesStatement.java
+++ b/features/db-discovery/distsql/statement/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/parser/statement/ShowDatabaseDiscoveryRulesStatement.java
@@ -17,15 +17,20 @@
 
 package org.apache.shardingsphere.dbdiscovery.distsql.parser.statement;
 
+import lombok.Getter;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowRulesStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
 
 /**
  * Show database discovery rules statement.
  */
+@Getter
 public final class ShowDatabaseDiscoveryRulesStatement extends ShowRulesStatement {
     
-    public ShowDatabaseDiscoveryRulesStatement(final DatabaseSegment database) {
+    private final String ruleName;
+    
+    public ShowDatabaseDiscoveryRulesStatement(final String ruleName, final DatabaseSegment database) {
         super(database);
+        this.ruleName = ruleName;
     }
 }