You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2024/08/04 12:08:12 UTC

(shardingsphere) branch master updated: Add like support for DistSQL show storage units (#32388)

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 <ra...@gmail.com>
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.
      *