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

Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new e93a2b6889 fix(admin): align permission counts with list filters 
(#7244)
e93a2b6889 is described below

commit e93a2b688908724cc361de45a29cf3b28ca830d8
Author: Liming Deng <[email protected]>
AuthorDate: Wed Sep 30 09:59:26 2026 +0800

    fix(admin): align permission counts with list filters (#7244)
---
 .../src/main/resources/mappers/rule-sqlmap.xml     |  3 ++-
 .../src/main/resources/mappers/selector-sqlmap.xml | 12 ++++++++--
 .../apache/shenyu/admin/mapper/RuleMapperTest.java | 24 ++++++++++++++++++++
 .../shenyu/admin/mapper/SelectorMapperTest.java    | 26 ++++++++++++++++++++++
 4 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
index e9b86b24ec..737045797a 100644
--- a/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
@@ -119,7 +119,8 @@
                 selector_id = #{selectorId, jdbcType=VARCHAR}
             </if>
             <if test="name != null and name != ''">
-                AND rule_name = #{name, jdbcType=VARCHAR}
+                <bind name="nameLike" value="('%' + name + '%')"/>
+                AND rule_name LIKE #{nameLike, jdbcType=VARCHAR}
             </if>
             <if test="filterIds != null">
                 AND id IN
diff --git a/shenyu-admin/src/main/resources/mappers/selector-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/selector-sqlmap.xml
index 86a2673f8f..9aa01836e8 100644
--- a/shenyu-admin/src/main/resources/mappers/selector-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/selector-sqlmap.xml
@@ -168,11 +168,19 @@
         SELECT COUNT(1)
           FROM selector
         <where>
+            namespace_id = #{namespaceId, jdbcType=VARCHAR}
             <if test="pluginId != null">
-                plugin_id = #{pluginId, jdbcType=VARCHAR}
+                AND plugin_id = #{pluginId, jdbcType=VARCHAR}
+            </if>
+            <if test="pluginIds != null and pluginIds.size > 0">
+                AND plugin_id IN
+                <foreach item="pluginId" collection="pluginIds" open="(" 
separator="," close=")">
+                    #{pluginId, jdbcType=VARCHAR}
+                </foreach>
             </if>
             <if test="name != null and name != ''">
-                AND selector_name = #{name, jdbcType=VARCHAR}
+                <bind name="nameLike" value="('%' + name + '%')"/>
+                AND selector_name LIKE #{nameLike, jdbcType=VARCHAR}
             </if>
             <if test="filterIds != null">
                 AND id IN
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/RuleMapperTest.java 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/RuleMapperTest.java
index 340a6e8e7f..7cc95bb557 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/RuleMapperTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/RuleMapperTest.java
@@ -22,6 +22,7 @@ import org.apache.shenyu.admin.model.entity.RuleDO;
 import org.apache.shenyu.admin.model.query.RuleQuery;
 import org.apache.shenyu.common.utils.UUIDUtils;
 import org.junit.jupiter.api.Test;
+import org.springframework.transaction.annotation.Transactional;
 import jakarta.annotation.Resource;
 import java.sql.Timestamp;
 import java.util.Arrays;
@@ -209,6 +210,29 @@ public final class RuleMapperTest extends 
AbstractSpringIntegrationTest {
         assertThat(ruleMapper.delete(ruleInAnotherNamespace.getId()), 
equalTo(1));
     }
 
+    @Test
+    @Transactional
+    public void testCountMatchesFilteredList() {
+        RuleDO first = buildRuleDO();
+        first.setRuleName("permission-keyword-first");
+        RuleDO second = buildRuleDO();
+        second.setRuleName("permission-keyword-second");
+        RuleDO otherSelector = buildRuleDO();
+        otherSelector.setRuleName("permission-keyword-other");
+        otherSelector.setSelectorId("other-selector");
+        Arrays.asList(first, second, 
otherSelector).forEach(ruleMapper::insert);
+        RuleQuery query = new RuleQuery();
+        query.setSelectorId(first.getSelectorId());
+        query.setName("keyword");
+        query.setFilterIds(Arrays.asList(first.getId(), second.getId(), 
otherSelector.getId()));
+        assertThat(ruleMapper.countByQuery(query), equalTo(2));
+        assertThat(ruleMapper.countByQuery(query), 
equalTo(ruleMapper.selectByQuery(query).size()));
+        query.setName(first.getRuleName());
+        assertThat(ruleMapper.countByQuery(query), equalTo(1));
+        query.setName("missing-keyword");
+        assertThat(ruleMapper.countByQuery(query), equalTo(0));
+    }
+
     private RuleDO buildRuleDO() {
         Timestamp now = new Timestamp(System.currentTimeMillis());
         String id = UUIDUtils.getInstance().generateShortUuid();
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/SelectorMapperTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/SelectorMapperTest.java
index 62a78ac26a..e0fc92f995 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/SelectorMapperTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/mapper/SelectorMapperTest.java
@@ -24,6 +24,7 @@ import org.apache.shenyu.admin.model.page.PageParameter;
 import org.apache.shenyu.admin.model.query.SelectorQuery;
 import org.apache.shenyu.common.utils.UUIDUtils;
 import org.junit.jupiter.api.Test;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.sql.Timestamp;
 import java.util.List;
@@ -221,6 +222,31 @@ public final class SelectorMapperTest extends 
AbstractSpringIntegrationTest {
         assertEquals(1, delete);
     }
 
+    @Test
+    @Transactional
+    public void testCountMatchesFilteredList() {
+        SelectorDO first = buildSelectorDO();
+        first.setSelectorName("permission-keyword-first");
+        SelectorDO second = buildSelectorDO();
+        second.setSelectorName("permission-keyword-second");
+        SelectorDO otherNamespace = buildSelectorDO();
+        otherNamespace.setSelectorName("permission-keyword-other");
+        otherNamespace.setNamespaceId("other-namespace");
+        SelectorDO otherPlugin = buildSelectorDO();
+        otherPlugin.setSelectorName("permission-keyword-plugin");
+        otherPlugin.setPluginId("other-plugin");
+        List<SelectorDO> selectors = List.of(first, second, otherNamespace, 
otherPlugin);
+        selectors.forEach(selectorMapper::insert);
+        SelectorQuery query = new SelectorQuery(List.of(first.getPluginId()), 
"keyword", new PageParameter(), SYS_DEFAULT_NAMESPACE_ID);
+        
query.setFilterIds(selectors.stream().map(SelectorDO::getId).collect(Collectors.toList()));
+        assertEquals(2, selectorMapper.countByQuery(query));
+        assertEquals(selectorMapper.selectByQuery(query).size(), 
selectorMapper.countByQuery(query));
+        query.setName(first.getSelectorName());
+        assertEquals(1, selectorMapper.countByQuery(query));
+        query.setName("missing-keyword");
+        assertEquals(0, selectorMapper.countByQuery(query));
+    }
+
     private SelectorDO buildSelectorDO() {
         Timestamp currentTime = new Timestamp(System.currentTimeMillis());
         return SelectorDO.builder()

Reply via email to