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/15 03:25:04 UTC

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

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 66e107df766 Make `ShowReadwriteSplittingRule`support query specified rule (#24165)
66e107df766 is described below

commit 66e107df766990fc3ca2b19d8e278f9b61778d0a
Author: Zichao <57...@users.noreply.github.com>
AuthorDate: Wed Feb 15 11:24:57 2023 +0800

    Make `ShowReadwriteSplittingRule`support query specified rule (#24165)
    
    * Make `ShowReadwriteSplittingRule`support query specified rule
    
    * Make `ShowReadwriteSplittingRule`support query specified rule
---
 .../query/ShowDatabaseDiscoveryRuleExecutor.java    |  4 +---
 .../query/ShowReadwriteSplittingRuleExecutor.java   |  8 +++++---
 .../ShowReadwriteSplittingRuleExecutorTest.java     | 21 +++++++++++++++++++++
 .../imports/readwrite-splitting/RQLStatement.g4     |  6 +++++-
 .../ReadwriteSplittingDistSQLStatementVisitor.java  |  3 ++-
 .../ShowReadwriteSplittingRulesStatement.java       |  7 ++++++-
 6 files changed, 40 insertions(+), 9 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 b73de16e474..0055cfa139e 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
@@ -70,9 +70,7 @@ 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);
-            if (null == sqlStatement.getRuleName()) {
-                result.add(new LocalDataQueryResultRow(groupName, String.join(",", dataSourceRuleConfig.getDataSourceNames()), primaryDataSourceName, typeMap, heartbeatMap));
-            } else if (sqlStatement.getRuleName().equalsIgnoreCase(groupName)) {
+            if (null == sqlStatement.getRuleName() || sqlStatement.getRuleName().equalsIgnoreCase(groupName)) {
                 result.add(new LocalDataQueryResultRow(groupName, String.join(",", dataSourceRuleConfig.getDataSourceNames()), primaryDataSourceName, typeMap, heartbeatMap));
             }
         }
diff --git a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/ShowReadwriteSplittingRuleExecutor.java b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/ShowReadwriteSplittingRuleExecutor.java
index f55b60f2dfd..32f3971b264 100644
--- a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/ShowReadwriteSplittingRuleExecutor.java
+++ b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/ShowReadwriteSplittingRuleExecutor.java
@@ -52,7 +52,7 @@ public final class ShowReadwriteSplittingRuleExecutor implements RQLExecutor<Sho
         Collection<LocalDataQueryResultRow> result = new LinkedList<>();
         if (rule.isPresent()) {
             buildExportableMap(rule.get());
-            result = buildData(rule.get());
+            result = buildData(rule.get(), sqlStatement);
         }
         return result;
     }
@@ -64,11 +64,13 @@ public final class ShowReadwriteSplittingRuleExecutor implements RQLExecutor<Sho
         exportableDataSourceMap = (Map<String, Map<String, String>>) exportedData.get(ExportableConstants.EXPORT_STATIC_READWRITE_SPLITTING_RULE);
     }
     
-    private Collection<LocalDataQueryResultRow> buildData(final ReadwriteSplittingRule rule) {
+    private Collection<LocalDataQueryResultRow> buildData(final ReadwriteSplittingRule rule, final ShowReadwriteSplittingRulesStatement sqlStatement) {
         Collection<LocalDataQueryResultRow> result = new LinkedList<>();
         ((ReadwriteSplittingRuleConfiguration) rule.getConfiguration()).getDataSources().forEach(each -> {
             LocalDataQueryResultRow dataItem = buildDataItem(each, getLoadBalancers((ReadwriteSplittingRuleConfiguration) rule.getConfiguration()));
-            result.add(dataItem);
+            if (null == sqlStatement.getRuleName() || sqlStatement.getRuleName().equalsIgnoreCase(each.getName())) {
+                result.add(dataItem);
+            }
         });
         return result;
     }
diff --git a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/ShowReadwriteSplittingRuleExecutorTest.java b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/ShowReadwriteSplittingRuleExecutorTest.java
index 65afb6ee0b3..5cf54ab3c9a 100644
--- a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/ShowReadwriteSplittingRuleExecutorTest.java
+++ b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/ShowReadwriteSplittingRuleExecutorTest.java
@@ -82,6 +82,27 @@ public final class ShowReadwriteSplittingRuleExecutorTest {
         assertThat(row.getCell(7), is("read_weight=2:1"));
     }
     
+    @Test
+    public void assertGetRowDataWithSpecifiedRuleName() {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+        ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
+        when(rule.getConfiguration()).thenReturn(createRuleConfiguration());
+        when(rule.getExportData()).thenReturn(createExportedData());
+        when(database.getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.singleton(rule)));
+        RQLExecutor<ShowReadwriteSplittingRulesStatement> executor = new ShowReadwriteSplittingRuleExecutor();
+        Collection<LocalDataQueryResultRow> actual = executor.getRows(database, new ShowReadwriteSplittingRulesStatement("readwrite_ds", null));
+        assertThat(actual.size(), is(1));
+        Iterator<LocalDataQueryResultRow> iterator = actual.iterator();
+        LocalDataQueryResultRow row = iterator.next();
+        assertThat(row.getCell(1), is("readwrite_ds"));
+        assertThat(row.getCell(2), is(""));
+        assertThat(row.getCell(3), is(""));
+        assertThat(row.getCell(4), is("ds_primary"));
+        assertThat(row.getCell(5), is("ds_slave_0,ds_slave_1"));
+        assertThat(row.getCell(6), is("random"));
+        assertThat(row.getCell(7), is("read_weight=2:1"));
+    }
+    
     private Map<String, Object> createExportedData() {
         Map<String, Object> result = new HashMap<>(2, 1);
         result.put(ExportableConstants.EXPORT_DYNAMIC_READWRITE_SPLITTING_RULE, Collections.emptyMap());
diff --git a/features/readwrite-splitting/distsql/parser/src/main/antlr4/imports/readwrite-splitting/RQLStatement.g4 b/features/readwrite-splitting/distsql/parser/src/main/antlr4/imports/readwrite-splitting/RQLStatement.g4
index 05724fa2aa2..c28629199af 100644
--- a/features/readwrite-splitting/distsql/parser/src/main/antlr4/imports/readwrite-splitting/RQLStatement.g4
+++ b/features/readwrite-splitting/distsql/parser/src/main/antlr4/imports/readwrite-splitting/RQLStatement.g4
@@ -20,9 +20,13 @@ grammar RQLStatement;
 import BaseRule;
 
 showReadwriteSplittingRules
-    : SHOW READWRITE_SPLITTING RULES (FROM databaseName)?
+    : SHOW READWRITE_SPLITTING (RULE ruleName | RULES) (FROM databaseName)?
     ;
 
 countReadwriteSplittingRule
     : COUNT READWRITE_SPLITTING RULE (FROM databaseName)?
     ;
+
+ruleName
+    : IDENTIFIER_
+    ;
diff --git a/features/readwrite-splitting/distsql/parser/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/parser/core/ReadwriteSplittingDistSQLStatementVisitor.java b/features/readwrite-splitting/distsql/parser/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/parser/core/ReadwriteSplittingDistSQLStatementVisitor.java
index 69e60b46d2b..9b1309c9da0 100644
--- a/features/readwrite-splitting/distsql/parser/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/parser/core/ReadwriteSplittingDistSQLStatementVisitor.java
+++ b/features/readwrite-splitting/distsql/parser/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/parser/core/ReadwriteSplittingDistSQLStatementVisitor.java
@@ -88,7 +88,8 @@ public final class ReadwriteSplittingDistSQLStatementVisitor extends ReadwriteSp
     
     @Override
     public ASTNode visitShowReadwriteSplittingRules(final ShowReadwriteSplittingRulesContext ctx) {
-        return new ShowReadwriteSplittingRulesStatement(Objects.nonNull(ctx.databaseName()) ? (DatabaseSegment) visit(ctx.databaseName()) : null);
+        return new ShowReadwriteSplittingRulesStatement(null == ctx.ruleName() ? null : getIdentifierValue(ctx.ruleName()),
+                Objects.nonNull(ctx.databaseName()) ? (DatabaseSegment) visit(ctx.databaseName()) : null);
     }
     
     @Override
diff --git a/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/parser/statement/ShowReadwriteSplittingRulesStatement.java b/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/parser/statement/ShowReadwriteSplittingRulesStatement.java
index 0e374025898..87295051399 100644
--- a/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/parser/statement/ShowReadwriteSplittingRulesStatement.java
+++ b/features/readwrite-splitting/distsql/statement/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/parser/statement/ShowReadwriteSplittingRulesStatement.java
@@ -17,15 +17,20 @@
 
 package org.apache.shardingsphere.readwritesplitting.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 readwrite splitting rules statement.
  */
+@Getter
 public final class ShowReadwriteSplittingRulesStatement extends ShowRulesStatement {
     
-    public ShowReadwriteSplittingRulesStatement(final DatabaseSegment database) {
+    private final String ruleName;
+    
+    public ShowReadwriteSplittingRulesStatement(final String ruleName, final DatabaseSegment database) {
         super(database);
+        this.ruleName = ruleName;
     }
 }