Skip to content

Commit fdb7360

Browse files
authored
Merge branch 'master' into fix-6138
2 parents c7a22da + c39506e commit fdb7360

File tree

3 files changed

+98
-9
lines changed

3 files changed

+98
-9
lines changed

shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import java.util.ArrayList;
6969
import java.util.Collections;
7070
import java.util.HashSet;
71+
import java.util.LinkedHashSet;
7172
import java.util.List;
7273
import java.util.Map;
7374
import java.util.Objects;
@@ -117,12 +118,26 @@ public void doConditionPreProcessing(final RuleQueryCondition condition) {
117118
}
118119
}
119120

121+
120122
@Override
121123
public PageInfo<RuleVO> searchByPage(final PageCondition<RuleQueryCondition> pageCondition) {
122124
RuleQueryCondition condition = pageCondition.getCondition();
123125
doConditionPreProcessing(condition);
124-
PageHelper.startPage(pageCondition.getPageNum(), pageCondition.getPageSize());
125126
condition.init();
127+
List<String> namespaceSelectors = Optional.ofNullable(selectorMapper.selectAllByNamespaceId(condition.getNamespaceId()))
128+
.map(list -> list.stream().map(SelectorDO::getId).collect(Collectors.toList()))
129+
.orElse(Collections.emptyList());
130+
131+
List<String> finalSelectors = Optional.ofNullable(condition.getSelectors())
132+
.orElseGet(Collections::emptyList);
133+
134+
if (!namespaceSelectors.isEmpty()) {
135+
Set<String> selectorSet = new LinkedHashSet<>(finalSelectors);
136+
selectorSet.addAll(namespaceSelectors);
137+
finalSelectors = new ArrayList<>(selectorSet);
138+
}
139+
condition.setSelectors(finalSelectors);
140+
PageHelper.startPage(pageCondition.getPageNum(), pageCondition.getPageSize());
126141
final Page<RuleDO> doList = CastUtils.cast(ruleMapper.selectByCondition(condition));
127142
PageInfo<RuleVO> doPageInfo = doList.toPageInfo(RuleVO::buildRuleVO);
128143
for (RuleVO rule : doPageInfo.getList()) {
@@ -327,7 +342,7 @@ public ConfigImportResult importData(final List<RuleDTO> ruleList) {
327342
}
328343
return ConfigImportResult.success(successCount);
329344
}
330-
345+
331346
@Override
332347
@Transactional(rollbackFor = Exception.class)
333348
public ConfigImportResult importData(final String namespace, final List<RuleDTO> ruleList, final ConfigsImportContext context) {
@@ -339,7 +354,7 @@ public ConfigImportResult importData(final String namespace, final List<RuleDTO>
339354
.selectAllByNamespaceId(namespace)
340355
.stream()
341356
.collect(Collectors.groupingBy(RuleDO::getSelectorId));
342-
357+
343358
int successCount = 0;
344359
StringBuilder errorMsgBuilder = new StringBuilder();
345360
for (RuleDTO ruleDTO : ruleList) {
@@ -358,7 +373,7 @@ public ConfigImportResult importData(final String namespace, final List<RuleDTO>
358373
.stream()
359374
.map(RuleDO::getRuleName)
360375
.collect(Collectors.toSet());
361-
376+
362377
if (existRuleNameSet.contains(ruleName)) {
363378
errorMsgBuilder
364379
.append(ruleName)
@@ -372,10 +387,10 @@ public ConfigImportResult importData(final String namespace, final List<RuleDTO>
372387
RuleDO ruleDO = RuleDO.buildRuleDO(ruleDTO);
373388
final int ruleCount = ruleMapper.insertSelective(ruleDO);
374389
Optional.ofNullable(ruleDTO.getRuleConditions())
375-
.orElse(Collections.emptyList()).forEach(c -> {
376-
c.setRuleId(ruleId);
377-
c.setId(null);
378-
});
390+
.orElse(Collections.emptyList()).forEach(c -> {
391+
c.setRuleId(ruleId);
392+
c.setId(null);
393+
});
379394
addCondition(ruleDO, ruleDTO.getRuleConditions());
380395
if (ruleCount > 0) {
381396
successCount++;

shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,6 @@
193193
</if>
194194
</where>
195195
</select>
196-
197196
<select id="getPluginNameBySelectorId" resultType="java.lang.String">
198197
select p.name
199198
from plugin p

shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.apache.shenyu.admin.service;
1919

20+
import com.github.pagehelper.Page;
21+
import com.github.pagehelper.PageInfo;
2022
import com.google.common.collect.Lists;
2123
import com.google.common.collect.Sets;
2224
import org.apache.commons.lang3.StringUtils;
@@ -36,9 +38,11 @@
3638
import org.apache.shenyu.admin.model.entity.RuleDO;
3739
import org.apache.shenyu.admin.model.entity.SelectorDO;
3840
import org.apache.shenyu.admin.model.page.CommonPager;
41+
import org.apache.shenyu.admin.model.page.PageCondition;
3942
import org.apache.shenyu.admin.model.page.PageParameter;
4043
import org.apache.shenyu.admin.model.query.RuleConditionQuery;
4144
import org.apache.shenyu.admin.model.query.RuleQuery;
45+
import org.apache.shenyu.admin.model.query.RuleQueryCondition;
4246
import org.apache.shenyu.admin.model.result.ConfigImportResult;
4347
import org.apache.shenyu.admin.model.vo.RuleVO;
4448
import org.apache.shenyu.admin.service.impl.RuleServiceImpl;
@@ -58,6 +62,7 @@
5862

5963
import java.sql.Timestamp;
6064
import java.time.LocalDateTime;
65+
import java.util.ArrayList;
6166
import java.util.Arrays;
6267
import java.util.Collections;
6368
import java.util.List;
@@ -68,9 +73,11 @@
6873
import static org.apache.shenyu.common.constant.Constants.SYS_DEFAULT_NAMESPACE_ID;
6974
import static org.hamcrest.MatcherAssert.assertThat;
7075
import static org.hamcrest.Matchers.greaterThan;
76+
import static org.junit.Assert.assertTrue;
7177
import static org.junit.jupiter.api.Assertions.assertEquals;
7278
import static org.junit.jupiter.api.Assertions.assertNotNull;
7379
import static org.mockito.ArgumentMatchers.any;
80+
import static org.mockito.ArgumentMatchers.anyString;
7481
import static org.mockito.BDDMockito.given;
7582
import static org.mockito.Mockito.mockStatic;
7683
import static org.mockito.Mockito.when;
@@ -261,6 +268,74 @@ public void testFindBySelectorIdList() {
261268
assertEquals(ruleDOList.size(), dataList.size());
262269
}
263270

271+
@Test
272+
public void testSearchByPage() {
273+
testSelectorMergeScenario(
274+
null,
275+
Arrays.asList(buildSelectorDO()),
276+
1,
277+
Collections.singletonList(buildSelectorDO().getId())
278+
);
279+
280+
SelectorDO selectorDO1 = SelectorDO.builder().id("s1").build();
281+
SelectorDO selectorDO2 = SelectorDO.builder().id("s2").build();
282+
testSelectorMergeScenario(
283+
new ArrayList<>(Arrays.asList("s1", "s3")),
284+
Arrays.asList(selectorDO1, selectorDO2),
285+
3,
286+
Arrays.asList("s1", "s2", "s3")
287+
);
288+
289+
testSelectorMergeScenario(
290+
new ArrayList<>(Arrays.asList("s1", "s2")),
291+
Collections.emptyList(),
292+
2,
293+
Arrays.asList("s1", "s2")
294+
);
295+
296+
testSelectorMergeScenario(
297+
new ArrayList<>(Arrays.asList("s1", "s2")),
298+
null,
299+
2,
300+
Arrays.asList("s1", "s2")
301+
);
302+
}
303+
304+
private void testSelectorMergeScenario(final List<String> userSelectors,
305+
final List<SelectorDO> namespaceSelectorDOs,
306+
final int expectedSize,
307+
final List<String> expectedContains) {
308+
Page<RuleDO> emptyPage = new Page<>();
309+
// 1. 构建分页条件
310+
PageCondition<RuleQueryCondition> pageCondition = buildPageCondition();
311+
RuleQueryCondition condition = pageCondition.getCondition();
312+
condition.setSelectors(userSelectors);
313+
314+
// 2. Mock依赖行为
315+
given(this.selectorMapper.selectAllByNamespaceId(anyString())).willReturn(namespaceSelectorDOs);
316+
given(this.ruleMapper.selectByCondition(any(RuleQueryCondition.class))).willReturn(emptyPage);
317+
318+
// 3. 执行测试方法
319+
PageInfo<RuleVO> result = ruleService.searchByPage(pageCondition);
320+
321+
// 4. 统一验证
322+
assertNotNull(result);
323+
List<String> finalSelectors = condition.getSelectors();
324+
assertEquals(expectedSize, finalSelectors.size());
325+
assertTrue(finalSelectors.containsAll(expectedContains));
326+
}
327+
328+
329+
private PageCondition<RuleQueryCondition> buildPageCondition() {
330+
RuleQueryCondition condition = new RuleQueryCondition();
331+
condition.setNamespaceId("test-namespace");
332+
PageCondition<RuleQueryCondition> pageCondition = new PageCondition<>();
333+
pageCondition.setCondition(condition);
334+
pageCondition.setPageNum(1);
335+
pageCondition.setPageSize(10);
336+
return pageCondition;
337+
}
338+
264339
private void publishEvent() {
265340
PluginDO pluginDO = buildPluginDO();
266341
SelectorDO selectorDO = buildSelectorDO();

0 commit comments

Comments
 (0)