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

jiangmaolin 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 ee6734330ae Add InUsedStorageUnitRetriever for single rule (#35131)
ee6734330ae is described below

commit ee6734330ae64fb7a226375a7ae1516c295a5f6e
Author: Raigor <raigor.ji...@gmail.com>
AuthorDate: Sun Apr 6 20:35:58 2025 +0800

    Add InUsedStorageUnitRetriever for single rule (#35131)
    
    * Add InUsedStorageUnitRetriever for single rule
    
    * Fix result name in InUsedSingleStorageUnitRetriever
    
    * Update RELEASE-NOTES.md
---
 RELEASE-NOTES.md                                   |  3 +-
 ...UsedReadwriteSplittingStorageUnitRetriever.java |  8 +---
 ...ReadwriteSplittingStorageUnitRetrieverTest.java |  7 ---
 .../query/InUsedShadowStorageUnitRetriever.java    |  8 +---
 .../InUsedShadowStorageUnitRetrieverTest.java      |  7 ---
 .../resource/ShowRulesUsedStorageUnitExecutor.java |  3 +-
 .../query/InUsedSingleStorageUnitRetriever.java    | 53 ++++++++++++++++++++++
 ...xecutor.rql.resource.InUsedStorageUnitRetriever | 18 ++++++++
 .../InUsedSingleStorageUnitRetrieverTest.java      | 42 +++++++----------
 .../ShowRulesUsedStorageUnitStatement.java         | 13 +-----
 10 files changed, 96 insertions(+), 66 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 940c7f6b5dc..49f7c9b580a 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -29,7 +29,8 @@
 1. Encrypt: Add quotes to encrypt rewrite derived columns - 
[#34950](https://github.com/apache/shardingsphere/pull/34950)
 1. SQL Router: Add check for select with union all routing to multi data 
sources - [#35037](https://github.com/apache/shardingsphere/pull/35037)
 1. DistSQL: Add job sharding nodes to the result set of `SHOW MIGRATION LIST` 
- [#35053](https://github.com/apache/shardingsphere/pull/35053)
-2. SQL Parser: Enhance combineType in Oracle to support EXCEPT ALL and 
INTERSECT ALL - [#35099](https://github.com/apache/shardingsphere/pull/35099)
+1. SQL Parser: Enhance combineType in Oracle to support EXCEPT ALL and 
INTERSECT ALL - [#35099](https://github.com/apache/shardingsphere/pull/35099)
+1. DistSQL: Add InUsedStorageUnitRetriever for single rule - 
[#35131](https://github.com/apache/shardingsphere/pull/35131)
 
 ### Bug Fixes
 
diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/InUsedReadwriteSplittingStorageUnitRetriever.java
 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/InUsedReadwriteSplittingStorageUnitRetriever.java
index 898ade8f2d5..f3a34ef8873 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/InUsedReadwriteSplittingStorageUnitRetriever.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/InUsedReadwriteSplittingStorageUnitRetriever.java
@@ -24,7 +24,6 @@ import 
org.apache.shardingsphere.readwritesplitting.config.rule.ReadwriteSplitti
 import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 
 /**
@@ -34,15 +33,12 @@ public final class 
InUsedReadwriteSplittingStorageUnitRetriever implements InUse
     
     @Override
     public Collection<String> getInUsedResources(final 
ShowRulesUsedStorageUnitStatement sqlStatement, final ReadwriteSplittingRule 
rule) {
-        if (!sqlStatement.getStorageUnitName().isPresent()) {
-            return Collections.emptyList();
-        }
         Collection<String> result = new HashSet<>(1, 1F);
         for (ReadwriteSplittingDataSourceGroupRuleConfiguration each : 
rule.getConfiguration().getDataSourceGroups()) {
-            if 
(each.getWriteDataSourceName().equalsIgnoreCase(sqlStatement.getStorageUnitName().get()))
 {
+            if 
(each.getWriteDataSourceName().equalsIgnoreCase(sqlStatement.getStorageUnitName()))
 {
                 result.add(each.getName());
             }
-            if (new 
CaseInsensitiveSet<>(each.getReadDataSourceNames()).contains(sqlStatement.getStorageUnitName().get()))
 {
+            if (new 
CaseInsensitiveSet<>(each.getReadDataSourceNames()).contains(sqlStatement.getStorageUnitName()))
 {
                 result.add(each.getName());
             }
         }
diff --git 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/InUsedReadwriteSplittingStorageUnitRetrieverTest.java
 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/InUsedReadwriteSplittingStorageUnitRetrieverTest.java
index bdad6bc2cd0..257fe78127e 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/InUsedReadwriteSplittingStorageUnitRetrieverTest.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/query/InUsedReadwriteSplittingStorageUnitRetrieverTest.java
@@ -28,7 +28,6 @@ import java.util.Collections;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -38,12 +37,6 @@ class InUsedReadwriteSplittingStorageUnitRetrieverTest {
     @SuppressWarnings("unchecked")
     private final InUsedStorageUnitRetriever<ReadwriteSplittingRule> retriever 
= TypedSPILoader.getService(InUsedStorageUnitRetriever.class, 
ReadwriteSplittingRule.class);
     
-    @Test
-    void assertGetInUsedResourcesWithoutStorageUnit() {
-        ShowRulesUsedStorageUnitStatement sqlStatement = new 
ShowRulesUsedStorageUnitStatement(null, null);
-        assertTrue(retriever.getInUsedResources(sqlStatement, 
mock(ReadwriteSplittingRule.class)).isEmpty());
-    }
-    
     @Test
     void assertGetInUsedResourcesWithWriteDataSource() {
         ShowRulesUsedStorageUnitStatement sqlStatement = new 
ShowRulesUsedStorageUnitStatement("foo_unit_write", null);
diff --git 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetriever.java
 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetriever.java
index 1b2ad9f90e5..877f65494b0 100644
--- 
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetriever.java
+++ 
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetriever.java
@@ -23,7 +23,6 @@ import 
org.apache.shardingsphere.shadow.config.datasource.ShadowDataSourceConfig
 import org.apache.shardingsphere.shadow.rule.ShadowRule;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.stream.Collectors;
 
 /**
@@ -33,12 +32,9 @@ public final class InUsedShadowStorageUnitRetriever 
implements InUsedStorageUnit
     
     @Override
     public Collection<String> getInUsedResources(final 
ShowRulesUsedStorageUnitStatement sqlStatement, final ShadowRule rule) {
-        if (!sqlStatement.getStorageUnitName().isPresent()) {
-            return Collections.emptyList();
-        }
         return rule.getConfiguration().getDataSources().stream()
-                .filter(each -> 
each.getShadowDataSourceName().equalsIgnoreCase(sqlStatement.getStorageUnitName().get())
-                        || 
each.getProductionDataSourceName().equalsIgnoreCase(sqlStatement.getStorageUnitName().get()))
+                .filter(each -> 
each.getShadowDataSourceName().equalsIgnoreCase(sqlStatement.getStorageUnitName())
+                        || 
each.getProductionDataSourceName().equalsIgnoreCase(sqlStatement.getStorageUnitName()))
                 
.map(ShadowDataSourceConfiguration::getName).collect(Collectors.toList());
     }
     
diff --git 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetrieverTest.java
 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetrieverTest.java
index a9808066345..964f545b683 100644
--- 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetrieverTest.java
+++ 
b/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetrieverTest.java
@@ -28,7 +28,6 @@ import java.util.Collections;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -38,12 +37,6 @@ class InUsedShadowStorageUnitRetrieverTest {
     @SuppressWarnings("unchecked")
     private final InUsedStorageUnitRetriever<ShadowRule> retriever = 
TypedSPILoader.getService(InUsedStorageUnitRetriever.class, ShadowRule.class);
     
-    @Test
-    void assertGetInUsedResourcesWithoutStorageUnit() {
-        ShowRulesUsedStorageUnitStatement sqlStatement = new 
ShowRulesUsedStorageUnitStatement(null, null);
-        assertTrue(retriever.getInUsedResources(sqlStatement, 
mock(ShadowRule.class)).isEmpty());
-    }
-    
     @Test
     void assertGetInUsedResourcesWithShadowDataSource() {
         ShowRulesUsedStorageUnitStatement sqlStatement = new 
ShowRulesUsedStorageUnitStatement("prod_ds", null);
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowRulesUsedStorageUnitExecutor.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowRulesUsedStorageUnitExecutor.java
index ecaab9b2cee..1b66dcedf8a 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowRulesUsedStorageUnitExecutor.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowRulesUsedStorageUnitExecutor.java
@@ -49,8 +49,7 @@ public final class ShowRulesUsedStorageUnitExecutor 
implements DistSQLQueryExecu
     
     @Override
     public Collection<LocalDataQueryResultRow> getRows(final 
ShowRulesUsedStorageUnitStatement sqlStatement, final ContextManager 
contextManager) {
-        String resourceName = sqlStatement.getStorageUnitName().orElse(null);
-        return 
database.getResourceMetaData().getStorageUnits().containsKey(resourceName) ? 
getRows(sqlStatement) : Collections.emptyList();
+        return 
database.getResourceMetaData().getStorageUnits().containsKey(sqlStatement.getStorageUnitName())
 ? getRows(sqlStatement) : Collections.emptyList();
     }
     
     @SuppressWarnings("unchecked")
diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/InUsedSingleStorageUnitRetriever.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/InUsedSingleStorageUnitRetriever.java
new file mode 100644
index 00000000000..399d44393b4
--- /dev/null
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/InUsedSingleStorageUnitRetriever.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.single.distsql.handler.query;
+
+import 
org.apache.shardingsphere.distsql.handler.executor.rql.resource.InUsedStorageUnitRetriever;
+import 
org.apache.shardingsphere.distsql.statement.rql.rule.database.ShowRulesUsedStorageUnitStatement;
+import org.apache.shardingsphere.infra.datanode.DataNode;
+import org.apache.shardingsphere.single.rule.SingleDataNodeRuleAttribute;
+import org.apache.shardingsphere.single.rule.SingleRule;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+
+/**
+ * In used single storage unit retriever.
+ */
+public final class InUsedSingleStorageUnitRetriever implements 
InUsedStorageUnitRetriever<SingleRule> {
+    
+    @Override
+    public Collection<String> getInUsedResources(final 
ShowRulesUsedStorageUnitStatement sqlStatement, final SingleRule rule) {
+        SingleDataNodeRuleAttribute attribute = 
rule.getAttributes().getAttribute(SingleDataNodeRuleAttribute.class);
+        Map<String, Collection<DataNode>> dataNodes = 
attribute.getAllDataNodes();
+        Collection<String> result = new HashSet<>(dataNodes.size(), 1F);
+        for (Collection<DataNode> each : dataNodes.values()) {
+            String storageUnitName = 
each.iterator().next().getDataSourceName();
+            if 
(storageUnitName.equalsIgnoreCase(sqlStatement.getStorageUnitName())) {
+                result.add(each.iterator().next().getTableName());
+            }
+        }
+        return result;
+    }
+    
+    @Override
+    public Class<SingleRule> getType() {
+        return SingleRule.class;
+    }
+}
diff --git 
a/kernel/single/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.executor.rql.resource.InUsedStorageUnitRetriever
 
b/kernel/single/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.executor.rql.resource.InUsedStorageUnitRetriever
new file mode 100644
index 00000000000..348650f3dfa
--- /dev/null
+++ 
b/kernel/single/distsql/handler/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.executor.rql.resource.InUsedStorageUnitRetriever
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.shardingsphere.single.distsql.handler.query.InUsedSingleStorageUnitRetriever
diff --git 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetrieverTest.java
 
b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/query/InUsedSingleStorageUnitRetrieverTest.java
similarity index 50%
copy from 
features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetrieverTest.java
copy to 
kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/query/InUsedSingleStorageUnitRetrieverTest.java
index a9808066345..e939291b072 100644
--- 
a/features/shadow/distsql/handler/src/test/java/org/apache/shardingsphere/shadow/distsql/handler/query/InUsedShadowStorageUnitRetrieverTest.java
+++ 
b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/query/InUsedSingleStorageUnitRetrieverTest.java
@@ -15,51 +15,41 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.shadow.distsql.handler.query;
+package org.apache.shardingsphere.single.distsql.handler.query;
 
 import 
org.apache.shardingsphere.distsql.handler.executor.rql.resource.InUsedStorageUnitRetriever;
 import 
org.apache.shardingsphere.distsql.statement.rql.rule.database.ShowRulesUsedStorageUnitStatement;
+import org.apache.shardingsphere.infra.datanode.DataNode;
+import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import 
org.apache.shardingsphere.shadow.config.datasource.ShadowDataSourceConfiguration;
-import org.apache.shardingsphere.shadow.rule.ShadowRule;
+import org.apache.shardingsphere.single.rule.SingleDataNodeRuleAttribute;
+import org.apache.shardingsphere.single.rule.SingleRule;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-class InUsedShadowStorageUnitRetrieverTest {
+class InUsedSingleStorageUnitRetrieverTest {
     
     @SuppressWarnings("unchecked")
-    private final InUsedStorageUnitRetriever<ShadowRule> retriever = 
TypedSPILoader.getService(InUsedStorageUnitRetriever.class, ShadowRule.class);
+    private final InUsedStorageUnitRetriever<SingleRule> retriever = 
TypedSPILoader.getService(InUsedStorageUnitRetriever.class, SingleRule.class);
     
     @Test
-    void assertGetInUsedResourcesWithoutStorageUnit() {
-        ShowRulesUsedStorageUnitStatement sqlStatement = new 
ShowRulesUsedStorageUnitStatement(null, null);
-        assertTrue(retriever.getInUsedResources(sqlStatement, 
mock(ShadowRule.class)).isEmpty());
+    void assertGetInUsedResources() {
+        ShowRulesUsedStorageUnitStatement sqlStatement = new 
ShowRulesUsedStorageUnitStatement("foo_ds", null);
+        assertThat(retriever.getInUsedResources(sqlStatement, mockRule()), 
is(Collections.singleton("foo_table")));
     }
     
-    @Test
-    void assertGetInUsedResourcesWithShadowDataSource() {
-        ShowRulesUsedStorageUnitStatement sqlStatement = new 
ShowRulesUsedStorageUnitStatement("prod_ds", null);
-        assertThat(retriever.getInUsedResources(sqlStatement, mockRule()), 
is(Collections.singletonList("foo_ds")));
-    }
-    
-    @Test
-    void assertGetInUsedResourcesWithProductionDataSource() {
-        ShowRulesUsedStorageUnitStatement sqlStatement = new 
ShowRulesUsedStorageUnitStatement("shadow_ds", null);
-        assertThat(retriever.getInUsedResources(sqlStatement, mockRule()), 
is(Collections.singletonList("foo_ds")));
-    }
-    
-    private ShadowRule mockRule() {
-        ShadowRule result = mock(ShadowRule.class, RETURNS_DEEP_STUBS);
-        ShadowDataSourceConfiguration dataSourceConfig = new 
ShadowDataSourceConfiguration("foo_ds", "prod_ds", "shadow_ds");
-        
when(result.getConfiguration().getDataSources()).thenReturn(Collections.singleton(dataSourceConfig));
+    private SingleRule mockRule() {
+        SingleRule result = mock(SingleRule.class);
+        SingleDataNodeRuleAttribute attribute = 
mock(SingleDataNodeRuleAttribute.class);
+        DataNode dataNode = new DataNode("foo_ds", "foo_table");
+        
when(attribute.getAllDataNodes()).thenReturn(Collections.singletonMap("foo_table",
 Collections.singletonList(dataNode)));
+        when(result.getAttributes()).thenReturn(new RuleAttributes(attribute));
         return result;
     }
 }
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowRulesUsedStorageUnitStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowRulesUsedStorageUnitStatement.java
index 7a389b9fc62..30a355bf9d2 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowRulesUsedStorageUnitStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rql/rule/database/ShowRulesUsedStorageUnitStatement.java
@@ -17,13 +17,13 @@
 
 package org.apache.shardingsphere.distsql.statement.rql.rule.database;
 
+import lombok.Getter;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DatabaseSegment;
 
-import java.util.Optional;
-
 /**
  * Show rules used storage unit statement.
  */
+@Getter
 public final class ShowRulesUsedStorageUnitStatement extends 
ShowDatabaseRulesStatement {
     
     private final String storageUnitName;
@@ -32,13 +32,4 @@ public final class ShowRulesUsedStorageUnitStatement extends 
ShowDatabaseRulesSt
         super(database);
         this.storageUnitName = storageUnitName;
     }
-    
-    /**
-     * Get resource name.
-     *
-     * @return resource name
-     */
-    public Optional<String> getStorageUnitName() {
-        return Optional.ofNullable(storageUnitName);
-    }
 }

Reply via email to