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

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


The following commit(s) were added to refs/heads/master by this push:
     new 968719afe41 Fix partial update algorithms for mask rule (#38673)
968719afe41 is described below

commit 968719afe4198d009ed8527faa93e2a3370483ae
Author: Haoran Meng <[email protected]>
AuthorDate: Wed May 6 18:23:09 2026 +0800

    Fix partial update algorithms for mask rule (#38673)
    
    * Fix partial update algorithms for mask rule
    
    * Fix MaskRuleTest
---
 .../apache/shardingsphere/mask/rule/MaskRule.java  |  6 +++
 .../shardingsphere/mask/rule/MaskRuleTest.java     | 63 +++++++++++++++++++---
 2 files changed, 62 insertions(+), 7 deletions(-)

diff --git 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/MaskRule.java
 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/MaskRule.java
index e683bcf1946..41d624e12d0 100644
--- 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/MaskRule.java
+++ 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/rule/MaskRule.java
@@ -86,6 +86,7 @@ public final class MaskRule implements DatabaseRule, 
PartialRuleUpdateSupported<
     public boolean partialUpdate(final MaskRuleConfiguration 
toBeUpdatedRuleConfig) {
         handleAddedMaskAlgorithm(toBeUpdatedRuleConfig);
         handleRemovedMaskAlgorithm(toBeUpdatedRuleConfig);
+        handleUpdatedMaskAlgorithm(toBeUpdatedRuleConfig);
         Collection<String> toBeUpdatedTablesNames = 
toBeUpdatedRuleConfig.getTables().stream().map(MaskTableRuleConfiguration::getName).collect(Collectors.toCollection(CaseInsensitiveSet::new));
         Collection<String> toBeRemovedTableNames = 
tables.keySet().stream().filter(each -> 
!toBeUpdatedTablesNames.contains(each)).collect(Collectors.toList());
         if (!toBeRemovedTableNames.isEmpty()) {
@@ -110,6 +111,11 @@ public final class MaskRule implements DatabaseRule, 
PartialRuleUpdateSupported<
                 .forEach(entry -> maskAlgorithms.remove(entry.getKey()));
     }
     
+    private void handleUpdatedMaskAlgorithm(final MaskRuleConfiguration 
toBeUpdatedRuleConfig) {
+        toBeUpdatedRuleConfig.getMaskAlgorithms().forEach((key1, value1) -> 
maskAlgorithms
+                .computeIfPresent(key1, (key, value) -> 
TypedSPILoader.getService(MaskAlgorithm.class, value1.getType(), 
value1.getProps())));
+    }
+    
     @Override
     public int getOrder() {
         return MaskOrder.ORDER;
diff --git 
a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/MaskRuleTest.java
 
b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/MaskRuleTest.java
index bfe9178c67e..d26e1e6903d 100644
--- 
a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/MaskRuleTest.java
+++ 
b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/rule/MaskRuleTest.java
@@ -22,10 +22,12 @@ import 
org.apache.shardingsphere.mask.config.MaskRuleConfiguration;
 import org.apache.shardingsphere.mask.config.rule.MaskColumnRuleConfiguration;
 import org.apache.shardingsphere.mask.config.rule.MaskTableRuleConfiguration;
 import org.apache.shardingsphere.mask.constant.MaskOrder;
+import 
org.apache.shardingsphere.mask.rule.attribute.MaskTableMapperRuleAttribute;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.Optional;
 import java.util.Properties;
 
@@ -33,44 +35,71 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
 
 class MaskRuleTest {
     
     private MaskRule maskRule;
     
+    private MaskRuleConfiguration maskRuleConfiguration;
+    
     @BeforeEach
     void setUp() {
-        maskRule = new MaskRule(createMaskRuleConfiguration());
+        maskRuleConfiguration = createMaskRuleConfiguration();
+        maskRule = new MaskRule(maskRuleConfiguration);
     }
     
     private MaskRuleConfiguration createMaskRuleConfiguration() {
         MaskColumnRuleConfiguration maskColumnRuleConfig = new 
MaskColumnRuleConfiguration("foo_id", "t_mask_foo_id_md5");
         MaskTableRuleConfiguration maskTableRuleConfig = new 
MaskTableRuleConfiguration("foo_tbl", 
Collections.singleton(maskColumnRuleConfig));
-        AlgorithmConfiguration algorithmConfig = new 
AlgorithmConfiguration("md5", new Properties());
+        AlgorithmConfiguration algorithmConfig = new 
AlgorithmConfiguration("KEEP_FIRST_N_LAST_M", 
createMaskAlgorithmProperties("2", "2", "*"));
         return new 
MaskRuleConfiguration(Collections.singleton(maskTableRuleConfig), 
Collections.singletonMap("t_mask_foo_id_md5", algorithmConfig));
     }
     
+    private Properties createMaskAlgorithmProperties(final String firstN, 
final String lastM, final String replaceChar) {
+        Properties result = new Properties();
+        result.setProperty("first-n", firstN);
+        result.setProperty("last-m", lastM);
+        result.setProperty("replace-char", replaceChar);
+        return result;
+    }
+    
     @Test
     void assertFindMaskTableWhenTableNameExists() {
         assertTrue(maskRule.findMaskTable("foo_tbl").isPresent());
     }
     
+    @Test
+    void assertFindMaskTableWhenTableNameCaseInsensitive() {
+        assertTrue(maskRule.findMaskTable("FOO_TBL").isPresent());
+    }
+    
     @Test
     void assertFindMaskTableWhenTableNameDoesNotExist() {
         assertFalse(maskRule.findMaskTable("non_existent_table").isPresent());
     }
     
+    @Test
+    void assertGetConfiguration() {
+        assertThat(maskRule.getConfiguration(), is(maskRuleConfiguration));
+    }
+    
+    @Test
+    void assertGetAttributes() {
+        Optional<MaskTableMapperRuleAttribute> actual = 
maskRule.getAttributes().findAttribute(MaskTableMapperRuleAttribute.class);
+        assertTrue(actual.isPresent());
+        assertThat(new LinkedList<>(actual.get().getLogicTableNames()), 
is(Collections.singletonList("foo_tbl")));
+    }
+    
     @Test
     void assertUpdateConfiguration() {
-        MaskRuleConfiguration toBeUpdatedRuleConfig = 
mock(MaskRuleConfiguration.class);
+        MaskRuleConfiguration toBeUpdatedRuleConfig = 
createPartialAddTablesMaskRuleConfiguration();
         maskRule.updateConfiguration(toBeUpdatedRuleConfig);
         assertThat(maskRule.getConfiguration(), is(toBeUpdatedRuleConfig));
     }
     
     @Test
     void assertPartialUpdateWithToBeAddedTables() {
-        maskRule.partialUpdate(createPartialAddTablesMaskRuleConfiguration());
+        
assertFalse(maskRule.partialUpdate(createPartialAddTablesMaskRuleConfiguration()));
         assertTrue(maskRule.findMaskTable("bar_tbl").isPresent());
     }
     
@@ -83,7 +112,7 @@ class MaskRuleTest {
     
     @Test
     void assertPartialUpdateWithToBeRemovedTables() {
-        
maskRule.partialUpdate(createPartialRemoveTablesMaskRuleConfiguration());
+        
assertFalse(maskRule.partialUpdate(createPartialRemoveTablesMaskRuleConfiguration()));
         assertFalse(maskRule.findMaskTable("foo_tbl").isPresent());
     }
     
@@ -94,7 +123,7 @@ class MaskRuleTest {
     
     @Test
     void assertPartialUpdateWithToBeRemovedAlgorithms() {
-        
maskRule.partialUpdate(createPartialRemovedAlgorithmsMaskRuleConfiguration());
+        
assertFalse(maskRule.partialUpdate(createPartialRemovedAlgorithmsMaskRuleConfiguration()));
         Optional<MaskTable> table = maskRule.findMaskTable("foo_tbl");
         assertTrue(table.isPresent());
         
assertFalse(table.get().findAlgorithm("t_mask_foo_id_md5").isPresent());
@@ -106,6 +135,26 @@ class MaskRuleTest {
         return new 
MaskRuleConfiguration(Collections.singleton(maskTableRuleConfig), 
Collections.emptyMap());
     }
     
+    @Test
+    void assertPartialUpdateWithToBeUpdatedAlgorithms() {
+        Optional<MaskTable> tableBeforeUpdate = 
maskRule.findMaskTable("foo_tbl");
+        assertTrue(tableBeforeUpdate.isPresent());
+        Object maskedValueBeforeUpdate = 
tableBeforeUpdate.get().findAlgorithm("foo_id").get().mask("123456");
+        
assertFalse(maskRule.partialUpdate(createPartialUpdatedAlgorithmsMaskRuleConfiguration()));
+        Optional<MaskTable> tableAfterUpdate = 
maskRule.findMaskTable("foo_tbl");
+        assertTrue(tableAfterUpdate.isPresent());
+        Object maskedValueAfterUpdate = 
tableAfterUpdate.get().findAlgorithm("foo_id").get().mask("123456");
+        assertThat(maskedValueBeforeUpdate, is("12**56"));
+        assertThat(maskedValueAfterUpdate, is("1####6"));
+    }
+    
+    private MaskRuleConfiguration 
createPartialUpdatedAlgorithmsMaskRuleConfiguration() {
+        MaskColumnRuleConfiguration maskColumnRuleConfig = new 
MaskColumnRuleConfiguration("foo_id", "t_mask_foo_id_md5");
+        MaskTableRuleConfiguration maskTableRuleConfig = new 
MaskTableRuleConfiguration("foo_tbl", 
Collections.singleton(maskColumnRuleConfig));
+        AlgorithmConfiguration algorithmConfig = new 
AlgorithmConfiguration("KEEP_FIRST_N_LAST_M", 
createMaskAlgorithmProperties("1", "1", "#"));
+        return new 
MaskRuleConfiguration(Collections.singleton(maskTableRuleConfig), 
Collections.singletonMap("t_mask_foo_id_md5", algorithmConfig));
+    }
+    
     @Test
     void assertGetOrder() {
         assertThat(maskRule.getOrder(), is(MaskOrder.ORDER));

Reply via email to