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

zhaojinchao 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 e224fff5ff1 Fix set default single table storage unit to random failed 
(#31803)
e224fff5ff1 is described below

commit e224fff5ff18b82e360d9740266b5cf072f04ed9
Author: Raigor <[email protected]>
AuthorDate: Mon Jun 24 23:22:02 2024 +0800

    Fix set default single table storage unit to random failed (#31803)
    
    * Fix set default single table storage unit to random failed
    
    * Fix single tables missed when update default single table storage unit
---
 .../SetDefaultSingleTableStorageUnitExecutor.java  | 23 ++++++++++----
 .../handler/update/UnloadSingleTableExecutor.java  |  6 +++-
 ...tDefaultSingleTableStorageUnitExecutorTest.java | 35 ++++++++++------------
 .../mode/tuple/RepositoryTupleSwapperEngine.java   |  6 ++--
 4 files changed, 43 insertions(+), 27 deletions(-)

diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutor.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutor.java
index 283e76edc9c..708cebe3aca 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutor.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutor.java
@@ -19,7 +19,7 @@ package 
org.apache.shardingsphere.single.distsql.handler.update;
 
 import com.google.common.base.Strings;
 import lombok.Setter;
-import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleCreateExecutor;
+import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleAlterExecutor;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.MissingRequiredStorageUnitsException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -37,7 +37,7 @@ import java.util.stream.Collectors;
  * Set default single table storage unit executor.
  */
 @Setter
-public final class SetDefaultSingleTableStorageUnitExecutor implements 
DatabaseRuleCreateExecutor<SetDefaultSingleTableStorageUnitStatement, 
SingleRule, SingleRuleConfiguration> {
+public final class SetDefaultSingleTableStorageUnitExecutor implements 
DatabaseRuleAlterExecutor<SetDefaultSingleTableStorageUnitStatement, 
SingleRule, SingleRuleConfiguration> {
     
     private ShardingSphereDatabase database;
     
@@ -63,10 +63,23 @@ public final class SetDefaultSingleTableStorageUnitExecutor 
implements DatabaseR
     }
     
     @Override
-    public SingleRuleConfiguration buildToBeCreatedRuleConfiguration(final 
SetDefaultSingleTableStorageUnitStatement sqlStatement) {
+    public SingleRuleConfiguration buildToBeAlteredRuleConfiguration(final 
SetDefaultSingleTableStorageUnitStatement sqlStatement) {
         SingleRuleConfiguration result = new SingleRuleConfiguration();
-        result.setDefaultDataSource(sqlStatement.getDefaultStorageUnit());
-        result.getTables().addAll(rule.getConfiguration().getTables());
+        if (null != sqlStatement.getDefaultStorageUnit()) {
+            result.setDefaultDataSource(sqlStatement.getDefaultStorageUnit());
+        }
+        return result;
+    }
+    
+    @Override
+    public SingleRuleConfiguration buildToBeDroppedRuleConfiguration(final 
SingleRuleConfiguration toBeAlteredRuleConfig) {
+        if (toBeAlteredRuleConfig.getDefaultDataSource().isPresent()) {
+            return null;
+        }
+        SingleRuleConfiguration result = new SingleRuleConfiguration();
+        if (rule.getConfiguration().getDefaultDataSource().isPresent()) {
+            
result.setDefaultDataSource(rule.getConfiguration().getDefaultDataSource().get());
+        }
         return result;
     }
     
diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/UnloadSingleTableExecutor.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/UnloadSingleTableExecutor.java
index ec9e01c6ad2..d7c9edd39a3 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/UnloadSingleTableExecutor.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/UnloadSingleTableExecutor.java
@@ -93,7 +93,6 @@ public final class UnloadSingleTableExecutor implements 
DatabaseRuleAlterExecuto
     @Override
     public SingleRuleConfiguration buildToBeAlteredRuleConfiguration(final 
UnloadSingleTableStatement sqlStatement) {
         SingleRuleConfiguration result = new SingleRuleConfiguration();
-        
rule.getConfiguration().getDefaultDataSource().ifPresent(result::setDefaultDataSource);
         if (!sqlStatement.isUnloadAllTables()) {
             result.getTables().addAll(rule.getConfiguration().getTables());
             result.getTables().removeIf(each -> 
sqlStatement.getTables().contains(extractTableName(each)));
@@ -103,6 +102,11 @@ public final class UnloadSingleTableExecutor implements 
DatabaseRuleAlterExecuto
     
     @Override
     public SingleRuleConfiguration buildToBeDroppedRuleConfiguration(final 
SingleRuleConfiguration toBeAlteredRuleConfig) {
+        if (toBeAlteredRuleConfig.getTables().isEmpty()) {
+            SingleRuleConfiguration result = new SingleRuleConfiguration();
+            result.getTables().addAll(rule.getConfiguration().getTables());
+            return result;
+        }
         return null;
     }
     
diff --git 
a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java
 
b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java
index 4958719bd47..979ea776070 100644
--- 
a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java
+++ 
b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/update/SetDefaultSingleTableStorageUnitExecutorTest.java
@@ -33,6 +33,8 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
@@ -63,34 +65,29 @@ class SetDefaultSingleTableStorageUnitExecutorTest {
         assertDoesNotThrow(() -> executor.checkBeforeUpdate(new 
SetDefaultSingleTableStorageUnitStatement("logic_ds")));
     }
     
-    @Test
-    void assertBuild() {
-        SingleRule rule = mock(SingleRule.class);
-        when(rule.getConfiguration()).thenReturn(new 
SingleRuleConfiguration());
-        executor.setRule(rule);
-        SingleRuleConfiguration toBeCreatedRuleConfig = 
executor.buildToBeCreatedRuleConfiguration(new 
SetDefaultSingleTableStorageUnitStatement("foo_ds"));
-        assertTrue(toBeCreatedRuleConfig.getDefaultDataSource().isPresent());
-        assertThat(toBeCreatedRuleConfig.getDefaultDataSource().get(), 
is("foo_ds"));
-    }
-    
     @Test
     void assertUpdate() {
-        SingleRuleConfiguration currentConfig = new SingleRuleConfiguration();
-        SingleRule rule = mock(SingleRule.class);
-        when(rule.getConfiguration()).thenReturn(currentConfig);
-        executor.setRule(rule);
-        SingleRuleConfiguration toBeCreatedRuleConfig = 
executor.buildToBeCreatedRuleConfiguration(new 
SetDefaultSingleTableStorageUnitStatement("foo_ds"));
-        assertTrue(toBeCreatedRuleConfig.getDefaultDataSource().isPresent());
-        assertThat(toBeCreatedRuleConfig.getDefaultDataSource().get(), 
is("foo_ds"));
+        executor.setRule(mock(SingleRule.class));
+        SingleRuleConfiguration toBeAlteredRuleConfig = 
executor.buildToBeAlteredRuleConfiguration(new 
SetDefaultSingleTableStorageUnitStatement("foo_ds"));
+        assertTrue(toBeAlteredRuleConfig.getDefaultDataSource().isPresent());
+        assertThat(toBeAlteredRuleConfig.getDefaultDataSource().get(), 
is("foo_ds"));
+        assertTrue(toBeAlteredRuleConfig.getTables().isEmpty());
+        
assertNull(executor.buildToBeDroppedRuleConfiguration(toBeAlteredRuleConfig));
     }
     
     @Test
     void assertRandom() {
         SingleRuleConfiguration currentConfig = new SingleRuleConfiguration();
+        currentConfig.setDefaultDataSource("foo_ds");
         SingleRule rule = mock(SingleRule.class);
         when(rule.getConfiguration()).thenReturn(currentConfig);
         executor.setRule(rule);
-        SingleRuleConfiguration toBeCreatedRuleConfig = 
executor.buildToBeCreatedRuleConfiguration(new 
SetDefaultSingleTableStorageUnitStatement(null));
-        assertFalse(toBeCreatedRuleConfig.getDefaultDataSource().isPresent());
+        SingleRuleConfiguration toBeAlteredRuleConfig = 
executor.buildToBeAlteredRuleConfiguration(new 
SetDefaultSingleTableStorageUnitStatement(null));
+        assertFalse(toBeAlteredRuleConfig.getDefaultDataSource().isPresent());
+        SingleRuleConfiguration toBeDroppedRuleConfig = 
executor.buildToBeDroppedRuleConfiguration(toBeAlteredRuleConfig);
+        assertNotNull(toBeDroppedRuleConfig);
+        assertTrue(toBeDroppedRuleConfig.getDefaultDataSource().isPresent());
+        assertThat(toBeDroppedRuleConfig.getDefaultDataSource().get(), 
is("foo_ds"));
+        assertTrue(toBeDroppedRuleConfig.getTables().isEmpty());
     }
 }
diff --git 
a/mode/api/src/main/java/org/apache/shardingsphere/mode/tuple/RepositoryTupleSwapperEngine.java
 
b/mode/api/src/main/java/org/apache/shardingsphere/mode/tuple/RepositoryTupleSwapperEngine.java
index 37763eb66cf..ac4fc77c8c6 100644
--- 
a/mode/api/src/main/java/org/apache/shardingsphere/mode/tuple/RepositoryTupleSwapperEngine.java
+++ 
b/mode/api/src/main/java/org/apache/shardingsphere/mode/tuple/RepositoryTupleSwapperEngine.java
@@ -105,8 +105,10 @@ public final class RepositoryTupleSwapperEngine {
             }
             return result;
         }
-        if (fieldValue instanceof Collection && !((Collection) 
fieldValue).isEmpty()) {
-            return Collections.singleton(new 
RepositoryTuple(ruleNodePath.getUniqueItem(tupleName).getPath(), 
YamlEngine.marshal(fieldValue)));
+        if (fieldValue instanceof Collection) {
+            return ((Collection) fieldValue).isEmpty()
+                    ? Collections.emptyList()
+                    : Collections.singleton(new 
RepositoryTuple(ruleNodePath.getUniqueItem(tupleName).getPath(), 
YamlEngine.marshal(fieldValue)));
         }
         if (fieldValue instanceof String && !((String) fieldValue).isEmpty()) {
             return Collections.singleton(new 
RepositoryTuple(ruleNodePath.getUniqueItem(tupleName).getPath(), 
fieldValue.toString()));

Reply via email to