This is an automated email from the ASF dual-hosted git repository. jianglongtao pushed a commit to branch fix-33341 in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
commit 9668574f91f5ad8bb91b2ec68f009fe0250fd7a1 Author: RaigorJiang <[email protected]> AuthorDate: Wed Aug 7 15:44:47 2024 +0800 Pick #32388, Add like support for DistSQL show storage units --- .../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 b6f74cb6063..8f8520ef8c2 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 1365745643c..2b3d879d2ee 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 @@ -33,6 +33,7 @@ import org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUn import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.util.SphereEx; import org.apache.shardingsphere.infra.util.SphereEx.Type; +import org.apache.shardingsphere.infra.util.regex.RegexUtils; import org.apache.shardingsphere.mode.manager.ContextManager; import javax.sql.DataSource; @@ -44,6 +45,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. @@ -99,6 +101,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 3f0f8806687..a4dc97b437a 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 26e3b029b2b..908523ca816 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 @@ -229,8 +229,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 005e4e63752..e14eb3bb2fc 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. *
