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

liuhongyu 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 c39506e97c Fix: loggion console add rule bug (#6291)
c39506e97c is described below

commit c39506e97ceef9490a97c736fd5098ce97d6f3a0
Author: yangyx107 <[email protected]>
AuthorDate: Sat Feb 28 16:34:59 2026 +0800

    Fix: loggion console add rule bug (#6291)
    
    * fix: loggionConsole-addRule-bug
    
    * fix: loggionConsole-addRule-bug
    
    * fix: loggionConsole-addRule-bug
    
    * fix: loggionConsole-addRule-bug
    
    ---------
    
    Co-authored-by: aias00 <[email protected]>
---
 .../shenyu/admin/service/impl/RuleServiceImpl.java | 35 +++++++---
 .../src/main/resources/mappers/rule-sqlmap.xml     |  1 -
 .../shenyu/admin/service/RuleServiceTest.java      | 75 ++++++++++++++++++++++
 3 files changed, 100 insertions(+), 11 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
index 0e903a943b..dabcc4fe10 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/RuleServiceImpl.java
@@ -67,6 +67,7 @@ import 
org.springframework.transaction.annotation.Transactional;
 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;
@@ -112,12 +113,26 @@ public class RuleServiceImpl implements RuleService {
         }
     }
 
+
     @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));
         PageInfo<RuleVO> doPageInfo = doList.toPageInfo(RuleVO::buildRuleVO);
         for (RuleVO rule : doPageInfo.getList()) {
@@ -253,12 +268,12 @@ public class RuleServiceImpl implements RuleService {
     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));
@@ -322,7 +337,7 @@ public class RuleServiceImpl implements RuleService {
         }
         return ConfigImportResult.success(successCount);
     }
-    
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ConfigImportResult importData(final String namespace, final 
List<RuleDTO> ruleList, final ConfigsImportContext context) {
@@ -334,7 +349,7 @@ public class RuleServiceImpl implements RuleService {
                 .selectAllByNamespaceId(namespace)
                 .stream()
                 .collect(Collectors.groupingBy(RuleDO::getSelectorId));
-        
+
         int successCount = 0;
         StringBuilder errorMsgBuilder = new StringBuilder();
         for (RuleDTO ruleDTO : ruleList) {
@@ -353,7 +368,7 @@ public class RuleServiceImpl implements RuleService {
                     .stream()
                     .map(RuleDO::getRuleName)
                     .collect(Collectors.toSet());
-            
+
             if (existRuleNameSet.contains(ruleName)) {
                 errorMsgBuilder
                         .append(ruleName)
@@ -367,10 +382,10 @@ public class RuleServiceImpl implements RuleService {
             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++;
diff --git a/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml 
b/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
index 56cccb983a..3c250a09eb 100644
--- a/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
+++ b/shenyu-admin/src/main/resources/mappers/rule-sqlmap.xml
@@ -193,7 +193,6 @@
             </if>
         </where>
     </select>
-
     <select id="getPluginNameBySelectorId" resultType="java.lang.String">
         select p.name
         from plugin p
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
index 518c52238f..6810d962e1 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/RuleServiceTest.java
@@ -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;
@@ -35,9 +37,11 @@ import org.apache.shenyu.admin.model.entity.RuleConditionDO;
 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;
@@ -57,6 +61,7 @@ import org.mockito.stubbing.Answer;
 
 import java.sql.Timestamp;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -67,9 +72,11 @@ import java.util.stream.IntStream;
 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;
@@ -257,6 +264,74 @@ public final class RuleServiceTest {
         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();

Reply via email to