Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
Expand Down Expand Up @@ -112,12 +113,26 @@ public void doConditionPreProcessing(final RuleQueryCondition condition) {
}
}


@Override
public PageInfo<RuleVO> searchByPage(final PageCondition<RuleQueryCondition> pageCondition) {
RuleQueryCondition condition = pageCondition.getCondition();
doConditionPreProcessing(condition);
PageHelper.startPage(pageCondition.getPageNum(), pageCondition.getPageSize());
condition.init();
List<String> namespaceSelectors = Optional.ofNullable(selectorMapper.selectAllByNamespaceId(condition.getNamespaceId()))
.map(list -> list.stream().map(SelectorDO::getId).collect(Collectors.toList()))
.orElse(Collections.emptyList());

List<String> finalSelectors = Optional.ofNullable(condition.getSelectors())
.orElseGet(Collections::emptyList);

if (!namespaceSelectors.isEmpty()) {
Set<String> selectorSet = new LinkedHashSet<>(finalSelectors);
selectorSet.addAll(namespaceSelectors);
finalSelectors = new ArrayList<>(selectorSet);
}
condition.setSelectors(finalSelectors);
PageHelper.startPage(pageCondition.getPageNum(), pageCondition.getPageSize());
final Page<RuleDO> doList = CastUtils.cast(ruleMapper.selectByCondition(condition));
Comment on lines 118 to 136
Copy link

Copilot AI Feb 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change modifies the paging search behavior and adds an extra selector lookup, but there are no accompanying unit tests to cover the new logic/edge cases (e.g., when selectors are already set, when the namespace has 0 selectors, etc.). Please add/update tests in the existing RuleServiceTest suite to lock in the intended behavior and prevent regressions.

Copilot uses AI. Check for mistakes.
PageInfo<RuleVO> doPageInfo = doList.toPageInfo(RuleVO::buildRuleVO);
for (RuleVO rule : doPageInfo.getList()) {
Expand Down Expand Up @@ -253,12 +268,12 @@ public List<RuleData> listAllByNamespaceId(final String namespaceId) {
public List<RuleVO> listAllData() {
return this.buildRuleVOList(ruleMapper.selectAll());
}

@Override
public List<RuleVO> listAllDataByNamespaceId(final String namespaceId) {
return this.buildRuleVOList(ruleMapper.selectAllByNamespaceId(namespaceId));
}

@Override
public List<RuleData> findBySelectorId(final String selectorId) {
return this.buildRuleDataList(ruleMapper.findBySelectorId(selectorId));
Expand Down Expand Up @@ -322,7 +337,7 @@ public ConfigImportResult importData(final List<RuleDTO> ruleList) {
}
return ConfigImportResult.success(successCount);
}

@Override
@Transactional(rollbackFor = Exception.class)
public ConfigImportResult importData(final String namespace, final List<RuleDTO> ruleList, final ConfigsImportContext context) {
Expand All @@ -334,7 +349,7 @@ public ConfigImportResult importData(final String namespace, final List<RuleDTO>
.selectAllByNamespaceId(namespace)
.stream()
.collect(Collectors.groupingBy(RuleDO::getSelectorId));

int successCount = 0;
StringBuilder errorMsgBuilder = new StringBuilder();
for (RuleDTO ruleDTO : ruleList) {
Expand All @@ -353,7 +368,7 @@ public ConfigImportResult importData(final String namespace, final List<RuleDTO>
.stream()
.map(RuleDO::getRuleName)
.collect(Collectors.toSet());

if (existRuleNameSet.contains(ruleName)) {
errorMsgBuilder
.append(ruleName)
Expand All @@ -367,10 +382,10 @@ public ConfigImportResult importData(final String namespace, final List<RuleDTO>
RuleDO ruleDO = RuleDO.buildRuleDO(ruleDTO);
final int ruleCount = ruleMapper.insertSelective(ruleDO);
Optional.ofNullable(ruleDTO.getRuleConditions())
.orElse(Collections.emptyList()).forEach(c -> {
c.setRuleId(ruleId);
c.setId(null);
});
.orElse(Collections.emptyList()).forEach(c -> {
c.setRuleId(ruleId);
c.setId(null);
});
addCondition(ruleDO, ruleDTO.getRuleConditions());
if (ruleCount > 0) {
successCount++;
Expand Down
1 change: 0 additions & 1 deletion shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,6 @@
</if>
</where>
</select>

<select id="getPluginNameBySelectorId" resultType="java.lang.String">
select p.name
from plugin p
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package org.apache.shenyu.admin.service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.apache.commons.lang3.StringUtils;
Expand All @@ -35,9 +37,11 @@
import org.apache.shenyu.admin.model.entity.RuleDO;
import org.apache.shenyu.admin.model.entity.SelectorDO;
import org.apache.shenyu.admin.model.page.CommonPager;
import org.apache.shenyu.admin.model.page.PageCondition;
import org.apache.shenyu.admin.model.page.PageParameter;
import org.apache.shenyu.admin.model.query.RuleConditionQuery;
import org.apache.shenyu.admin.model.query.RuleQuery;
import org.apache.shenyu.admin.model.query.RuleQueryCondition;
import org.apache.shenyu.admin.model.result.ConfigImportResult;
import org.apache.shenyu.admin.model.vo.RuleVO;
import org.apache.shenyu.admin.service.impl.RuleServiceImpl;
Expand All @@ -57,6 +61,7 @@

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
Expand All @@ -67,9 +72,11 @@
import static org.apache.shenyu.common.constant.Constants.SYS_DEFAULT_NAMESPACE_ID;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
Expand Down Expand Up @@ -257,6 +264,74 @@ public void testFindBySelectorIdList() {
assertEquals(ruleDOList.size(), dataList.size());
}

@Test
public void testSearchByPage() {
testSelectorMergeScenario(
null,
Arrays.asList(buildSelectorDO()),
1,
Collections.singletonList(buildSelectorDO().getId())
);

SelectorDO selectorDO1 = SelectorDO.builder().id("s1").build();
SelectorDO selectorDO2 = SelectorDO.builder().id("s2").build();
testSelectorMergeScenario(
new ArrayList<>(Arrays.asList("s1", "s3")),
Arrays.asList(selectorDO1, selectorDO2),
3,
Arrays.asList("s1", "s2", "s3")
);

testSelectorMergeScenario(
new ArrayList<>(Arrays.asList("s1", "s2")),
Collections.emptyList(),
2,
Arrays.asList("s1", "s2")
);

testSelectorMergeScenario(
new ArrayList<>(Arrays.asList("s1", "s2")),
null,
2,
Arrays.asList("s1", "s2")
);
}

private void testSelectorMergeScenario(final List<String> userSelectors,
final List<SelectorDO> namespaceSelectorDOs,
final int expectedSize,
final List<String> expectedContains) {
Page<RuleDO> emptyPage = new Page<>();
// 1. 构建分页条件
PageCondition<RuleQueryCondition> pageCondition = buildPageCondition();
RuleQueryCondition condition = pageCondition.getCondition();
condition.setSelectors(userSelectors);

// 2. Mock依赖行为
given(this.selectorMapper.selectAllByNamespaceId(anyString())).willReturn(namespaceSelectorDOs);
given(this.ruleMapper.selectByCondition(any(RuleQueryCondition.class))).willReturn(emptyPage);

// 3. 执行测试方法
PageInfo<RuleVO> result = ruleService.searchByPage(pageCondition);

// 4. 统一验证
assertNotNull(result);
List<String> finalSelectors = condition.getSelectors();
assertEquals(expectedSize, finalSelectors.size());
assertTrue(finalSelectors.containsAll(expectedContains));
}


private PageCondition<RuleQueryCondition> buildPageCondition() {
RuleQueryCondition condition = new RuleQueryCondition();
condition.setNamespaceId("test-namespace");
PageCondition<RuleQueryCondition> pageCondition = new PageCondition<>();
pageCondition.setCondition(condition);
pageCondition.setPageNum(1);
pageCondition.setPageSize(10);
return pageCondition;
}

private void publishEvent() {
PluginDO pluginDO = buildPluginDO();
SelectorDO selectorDO = buildSelectorDO();
Expand Down
Loading