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()