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()));