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

zhaojinchao 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 249845c39d5 Add like support for DistSQL show storage units (#32388)
249845c39d5 is described below

commit 249845c39d5b9ee76b362823581b4f498d43d6fe
Author: Raigor <[email protected]>
AuthorDate: Sun Aug 4 20:08:06 2024 +0800

    Add like support for DistSQL show storage units (#32388)
---
 .../core/advice/SQLParseCountAdviceTest.java       |  2 +-
 .../rql/resource/ShowStorageUnitExecutor.java      |  6 ++++++
 .../rql/resource/ShowStorageUnitExecutorTest.java  | 23 ++++++++++++++++++++--
 .../engine/src/main/antlr4/imports/RQLStatement.g4 |  2 +-
 .../core/kernel/KernelDistSQLStatementVisitor.java |  3 ++-
 .../rql/resource/ShowStorageUnitsStatement.java    | 11 +++++++++++
 6 files changed, 42 insertions(+), 5 deletions(-)

diff --git 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/SQLParseCountAdviceTest.java
 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/SQLParseCountAdviceTest.java
index da5395622a9..475da88adcb 100644
--- 
a/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/SQLParseCountAdviceTest.java
+++ 
b/agent/plugins/metrics/core/src/test/java/org/apache/shardingsphere/agent/plugin/metrics/core/advice/SQLParseCountAdviceTest.java
@@ -97,7 +97,7 @@ class SQLParseCountAdviceTest {
     
     @Test
     void assertParseRQL() {
-        assertParse(new ShowStorageUnitsStatement(new DatabaseSegment(0, 0, 
null), null), "RQL=1");
+        assertParse(new ShowStorageUnitsStatement(new DatabaseSegment(0, 0, 
null), null, null), "RQL=1");
     }
     
     @Test
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowStorageUnitExecutor.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowStorageUnitExecutor.java
index bb9e7f702d9..914f8024316 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowStorageUnitExecutor.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowStorageUnitExecutor.java
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryRes
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.regex.RegexUtils;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 
 import javax.sql.DataSource;
@@ -41,6 +42,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Properties;
+import java.util.regex.Pattern;
 
 /**
  * Show storage unit executor.
@@ -94,6 +96,10 @@ public final class ShowStorageUnitExecutor implements 
DistSQLQueryExecutor<ShowS
         } else {
             result.putAll(database.getResourceMetaData().getStorageUnits());
         }
+        if (sqlStatement.getLikePattern().isPresent()) {
+            Pattern pattern = 
Pattern.compile(RegexUtils.convertLikePatternToRegex(sqlStatement.getLikePattern().get()),
 Pattern.CASE_INSENSITIVE);
+            result.keySet().removeIf(each -> !pattern.matcher(each).find());
+        }
         return result;
     }
     
diff --git 
a/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowStorageUnitExecutorTest.java
 
b/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowStorageUnitExecutorTest.java
index 0bad3ec74e0..2cb57920848 100644
--- 
a/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowStorageUnitExecutorTest.java
+++ 
b/infra/distsql-handler/src/test/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowStorageUnitExecutorTest.java
@@ -76,7 +76,7 @@ class ShowStorageUnitExecutorTest {
         nameMap.put(0, "ds_2");
         nameMap.put(1, "ds_1");
         nameMap.put(2, "ds_0");
-        Collection<LocalDataQueryResultRow> actual = executor.getRows(new 
ShowStorageUnitsStatement(mock(DatabaseSegment.class), null), 
mock(ContextManager.class));
+        Collection<LocalDataQueryResultRow> actual = executor.getRows(new 
ShowStorageUnitsStatement(mock(DatabaseSegment.class), null, null), 
mock(ContextManager.class));
         assertThat(actual.size(), is(3));
         Iterator<LocalDataQueryResultRow> rowData = actual.iterator();
         int index = 0;
@@ -98,11 +98,30 @@ class ShowStorageUnitExecutorTest {
         }
     }
     
+    @Test
+    void assertGetRowsWithLikePattern() {
+        Collection<LocalDataQueryResultRow> actual = executor.getRows(new 
ShowStorageUnitsStatement(mock(DatabaseSegment.class), "_0", null), 
mock(ContextManager.class));
+        assertThat(actual.size(), is(1));
+        LocalDataQueryResultRow data = actual.iterator().next();
+        assertThat(data.getCell(1), is("ds_0"));
+        assertThat(data.getCell(2), is("MySQL"));
+        assertThat(data.getCell(3), is("localhost"));
+        assertThat(data.getCell(4), is("3307"));
+        assertThat(data.getCell(5), is("ds_0"));
+        assertThat(data.getCell(6), is(""));
+        assertThat(data.getCell(7), is(""));
+        assertThat(data.getCell(8), is(""));
+        assertThat(data.getCell(9), is("100"));
+        assertThat(data.getCell(10), is("10"));
+        assertThat(data.getCell(11), is(""));
+        assertThat(data.getCell(12), 
is("{\"openedConnections\":[],\"closed\":false}"));
+    }
+    
     @Test
     void assertGetRowsWithUnusedStorageUnits() {
         RuleMetaData metaData = mockUnusedStorageUnitsRuleMetaData();
         when(database.getRuleMetaData()).thenReturn(metaData);
-        Collection<LocalDataQueryResultRow> actual = executor.getRows(new 
ShowStorageUnitsStatement(mock(DatabaseSegment.class), 0), 
mock(ContextManager.class));
+        Collection<LocalDataQueryResultRow> actual = executor.getRows(new 
ShowStorageUnitsStatement(mock(DatabaseSegment.class), null, 0), 
mock(ContextManager.class));
         assertThat(actual.size(), is(1));
         Iterator<LocalDataQueryResultRow> rowData = actual.iterator();
         LocalDataQueryResultRow data = rowData.next();
diff --git a/parser/distsql/engine/src/main/antlr4/imports/RQLStatement.g4 
b/parser/distsql/engine/src/main/antlr4/imports/RQLStatement.g4
index 981be702b66..faa74e7783d 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/RQLStatement.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/RQLStatement.g4
@@ -20,7 +20,7 @@ grammar RQLStatement;
 import BaseRule;
 
 showStorageUnits
-    : SHOW STORAGE UNITS (FROM databaseName)? (WHERE USAGE_COUNT EQ_ 
usageCount)?
+    : SHOW STORAGE UNITS (FROM databaseName)? showLike? (WHERE USAGE_COUNT EQ_ 
usageCount)?
     ;
 
 showRulesUsedStorageUnit
diff --git 
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
 
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
index fa7113f6acc..b583ea61b5c 100644
--- 
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
+++ 
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
@@ -220,8 +220,9 @@ public final class KernelDistSQLStatementVisitor extends 
KernelDistSQLStatementB
     @Override
     public ASTNode visitShowStorageUnits(final ShowStorageUnitsContext ctx) {
         DatabaseSegment database = null == ctx.databaseName() ? null : 
(DatabaseSegment) visit(ctx.databaseName());
+        String likePattern = null == ctx.showLike() ? null : 
getIdentifierValue(ctx.showLike().likePattern());
         Integer usageCount = null == ctx.usageCount() ? null : 
Integer.parseInt(ctx.usageCount().getText());
-        return new ShowStorageUnitsStatement(database, usageCount);
+        return new ShowStorageUnitsStatement(database, likePattern, 
usageCount);
     }
     
     @Override
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowStorageUnitsStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowStorageUnitsStatement.java
index 0db7c082a75..b11a2fbfcf5 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowStorageUnitsStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/resource/ShowStorageUnitsStatement.java
@@ -33,6 +33,8 @@ public final class ShowStorageUnitsStatement extends 
ResourceQueryStatement impl
     
     private final DatabaseSegment database;
     
+    private final String likePattern;
+    
     private final Integer usageCount;
     
     @Override
@@ -40,6 +42,15 @@ public final class ShowStorageUnitsStatement extends 
ResourceQueryStatement impl
         return Optional.ofNullable(database);
     }
     
+    /**
+     * Get like pattern.
+     *
+     * @return like pattern
+     */
+    public Optional<String> getLikePattern() {
+        return Optional.ofNullable(likePattern);
+    }
+    
     /**
      * Get usage count.
      *

Reply via email to