You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/06/27 07:26:26 UTC
[shardingsphere] branch master updated: Refactor and
standardization of AlterRuleStatementUpdater (#11034)
This is an automated email from the ASF dual-hosted git repository.
panjuan 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 53509a4 Refactor and standardization of AlterRuleStatementUpdater (#11034)
53509a4 is described below
commit 53509a498edf593f1a68e2332e9ddfb59f121762
Author: Liang Zhang <te...@163.com>
AuthorDate: Sun Jun 27 15:25:46 2021 +0800
Refactor and standardization of AlterRuleStatementUpdater (#11034)
* Refactor AlterEncryptRuleStatementUpdater
* Refactor AlterReadwriteSplittingRuleStatementUpdater
* Refactor AlterShardingBindingTableRuleStatementUpdater
* Refactor AlterShardingBroadcastTableRuleStatementUpdater
* Refactor AlterShardingTableRuleStatementUpdater
* Refactor AlterShardingTableRuleStatementUpdater
* Refactor AlterShardingBindingTableRuleStatementUpdater
* Refactor CreateShardingBindingTableRuleStatementUpdater
---
.../converter/ShardingRuleStatementConverter.java | 4 +-
.../parser/segment/BindingTableRuleSegment.java | 15 ++-
.../AlterShardingBindingTableRulesStatement.java | 16 ++-
.../CreateShardingBindingTableRulesStatement.java | 16 ++-
.../updater/AlterEncryptRuleStatementUpdater.java | 62 +++++----
...lterReadwriteSplittingRuleStatementUpdater.java | 87 +++++++------
...erShardingBindingTableRuleStatementUpdater.java | 67 +++++-----
...ShardingBroadcastTableRuleStatementUpdater.java | 19 ++-
.../AlterShardingTableRuleStatementUpdater.java | 140 +++++++++++++--------
...teShardingBindingTableRuleStatementUpdater.java | 40 +++---
.../AlterShardingTableRuleBackendHandlerTest.java | 3 +-
...hardingBindingTableRulesBackendHandlerTest.java | 14 +--
.../rdl/ShardingBindingTableRuleAssert.java | 2 +-
13 files changed, 282 insertions(+), 203 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
index af5a7f2..2100ab9 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
@@ -73,7 +73,7 @@ public final class ShardingRuleStatementConverter {
public static YamlShardingRuleConfiguration convert(final CreateShardingBindingTableRulesStatement sqlStatement) {
YamlShardingRuleConfiguration result = new YamlShardingRuleConfiguration();
for (BindingTableRuleSegment each : sqlStatement.getRules()) {
- result.getBindingTables().add(each.getTables());
+ result.getBindingTables().add(each.getTableGroups());
}
return result;
}
@@ -87,7 +87,7 @@ public final class ShardingRuleStatementConverter {
public static YamlShardingRuleConfiguration convert(final AlterShardingBindingTableRulesStatement sqlStatement) {
YamlShardingRuleConfiguration result = new YamlShardingRuleConfiguration();
for (BindingTableRuleSegment each : sqlStatement.getRules()) {
- result.getBindingTables().add(each.getTables());
+ result.getBindingTables().add(each.getTableGroups());
}
return result;
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
index e482d40..5ed41be 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
@@ -21,6 +21,10 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
/**
* Binding table rule segment.
*/
@@ -28,5 +32,14 @@ import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
@Getter
public final class BindingTableRuleSegment implements ASTNode {
- private final String tables;
+ private final String tableGroups;
+
+ /**
+ * Get binding tables.
+ *
+ * @return binding tables
+ */
+ public Collection<String> getBindingTables() {
+ return Arrays.stream(tableGroups.split(",")).map(String::trim).collect(Collectors.toList());
+ }
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
index 37f6d97..b6fbd48 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
@@ -19,10 +19,11 @@ package org.apache.shardingsphere.sharding.distsql.parser.statement;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterRuleStatement;
+import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
import java.util.Collection;
+import java.util.LinkedList;
/**
* Alter sharding binding table rules statement.
@@ -32,4 +33,17 @@ import java.util.Collection;
public final class AlterShardingBindingTableRulesStatement extends AlterRuleStatement {
private final Collection<BindingTableRuleSegment> rules;
+
+ /**
+ * Get binding tables.
+ *
+ * @return binding tables
+ */
+ public Collection<String> getBindingTables() {
+ Collection<String> result = new LinkedList<>();
+ for (BindingTableRuleSegment each : rules) {
+ result.addAll(each.getBindingTables());
+ }
+ return result;
+ }
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
index d1f2d94..3eca763 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
@@ -19,10 +19,11 @@ package org.apache.shardingsphere.sharding.distsql.parser.statement;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.CreateRuleStatement;
+import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
import java.util.Collection;
+import java.util.LinkedList;
/**
* Create sharding binding table rules statement.
@@ -32,4 +33,17 @@ import java.util.Collection;
public final class CreateShardingBindingTableRulesStatement extends CreateRuleStatement {
private final Collection<BindingTableRuleSegment> rules;
+
+ /**
+ * Get binding tables.
+ *
+ * @return binding tables
+ */
+ public Collection<String> getBindingTables() {
+ Collection<String> result = new LinkedList<>();
+ for (BindingTableRuleSegment each : rules) {
+ result.addAll(each.getBindingTables());
+ }
+ return result;
+ }
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
index bd00057..d498638 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
+import com.google.common.base.Preconditions;
import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
import org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
import org.apache.shardingsphere.encrypt.distsql.parser.segment.EncryptRuleSegment;
@@ -34,6 +35,7 @@ import org.apache.shardingsphere.proxy.backend.exception.InvalidEncryptorsExcept
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
+import java.util.Optional;
import java.util.Properties;
import java.util.stream.Collectors;
@@ -49,29 +51,34 @@ public final class AlterEncryptRuleStatementUpdater implements RDLUpdater<AlterE
@Override
public void checkSQLStatement(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
+ checkCurrentRuleConfiguration(schemaName, sqlStatement, currentRuleConfig);
+ checkToBeAlteredRules(schemaName, sqlStatement, currentRuleConfig);
+ checkToBeAlteredEncryptors(sqlStatement);
+ }
+
+ private void checkCurrentRuleConfiguration(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
if (null == currentRuleConfig) {
- throw new EncryptRuleNotExistedException(schemaName, getAlteredRuleNames(sqlStatement));
+ throw new EncryptRuleNotExistedException(schemaName, getToBeAlteredEncryptTableNames(sqlStatement));
}
- checkAlteredTables(schemaName, sqlStatement, currentRuleConfig);
- checkEncryptors(sqlStatement);
}
- private void checkAlteredTables(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
- Collection<String> existTables = getExistTables(currentRuleConfig);
- Collection<String> notExistTables = getAlteredRuleNames(sqlStatement).stream().filter(each -> !existTables.contains(each)).collect(Collectors.toList());
- if (!notExistTables.isEmpty()) {
- throw new EncryptRuleNotExistedException(schemaName, notExistTables);
+ private void checkToBeAlteredRules(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
+ Collection<String> currentEncryptTableNames = currentRuleConfig.getTables().stream().map(EncryptTableRuleConfiguration::getName).collect(Collectors.toList());
+ Collection<String> notExistEncryptTableNames = getToBeAlteredEncryptTableNames(sqlStatement).stream().filter(each -> !currentEncryptTableNames.contains(each)).collect(Collectors.toList());
+ if (!notExistEncryptTableNames.isEmpty()) {
+ throw new EncryptRuleNotExistedException(schemaName, notExistEncryptTableNames);
}
}
- private Collection<String> getExistTables(final EncryptRuleConfiguration encryptRuleConfig) {
- return encryptRuleConfig.getTables().stream().map(EncryptTableRuleConfiguration::getName).collect(Collectors.toList());
+ private Collection<String> getToBeAlteredEncryptTableNames(final AlterEncryptRuleStatement sqlStatement) {
+ return sqlStatement.getRules().stream().map(EncryptRuleSegment::getTableName).collect(Collectors.toList());
}
- private void checkEncryptors(final AlterEncryptRuleStatement sqlStatement) {
+ private void checkToBeAlteredEncryptors(final AlterEncryptRuleStatement sqlStatement) {
Collection<String> encryptors = new LinkedHashSet<>();
- sqlStatement.getRules().forEach(each -> encryptors.addAll(each.getColumns().stream()
- .map(column -> column.getEncryptor().getName()).collect(Collectors.toSet())));
+ for (EncryptRuleSegment each : sqlStatement.getRules()) {
+ encryptors.addAll(each.getColumns().stream().map(column -> column.getEncryptor().getName()).collect(Collectors.toSet()));
+ }
Collection<String> invalidEncryptors = encryptors.stream().filter(
each -> !TypedSPIRegistry.findRegisteredService(EncryptAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
if (!invalidEncryptors.isEmpty()) {
@@ -81,24 +88,25 @@ public final class AlterEncryptRuleStatementUpdater implements RDLUpdater<AlterE
@Override
public void updateCurrentRuleConfiguration(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
- EncryptRuleConfiguration alteredEncryptRuleConfiguration = new YamlRuleConfigurationSwapperEngine()
- .swapToRuleConfigurations(Collections.singleton(EncryptRuleStatementConverter.convert(sqlStatement.getRules()))).stream()
- .map(each -> (EncryptRuleConfiguration) each).findFirst().get();
- drop(sqlStatement, currentRuleConfig);
- currentRuleConfig.getTables().addAll(alteredEncryptRuleConfiguration.getTables());
- currentRuleConfig.getEncryptors().putAll(alteredEncryptRuleConfiguration.getEncryptors());
+ dropRuleConfiguration(sqlStatement, currentRuleConfig);
+ addRuleConfiguration(sqlStatement, currentRuleConfig);
}
- private void drop(final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration encryptRuleConfig) {
- getAlteredRuleNames(sqlStatement).forEach(each -> {
- EncryptTableRuleConfiguration encryptTableRuleConfig = encryptRuleConfig.getTables().stream().filter(tableRule -> tableRule.getName().equals(each)).findAny().get();
- encryptRuleConfig.getTables().remove(encryptTableRuleConfig);
- encryptTableRuleConfig.getColumns().forEach(column -> encryptRuleConfig.getEncryptors().remove(column.getEncryptorName()));
- });
+ private void dropRuleConfiguration(final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
+ for (String each : getToBeAlteredEncryptTableNames(sqlStatement)) {
+ Optional<EncryptTableRuleConfiguration> toBeRemovedEncryptTableRuleConfig = currentRuleConfig.getTables().stream().filter(tableRule -> tableRule.getName().equals(each)).findAny();
+ Preconditions.checkState(toBeRemovedEncryptTableRuleConfig.isPresent());
+ currentRuleConfig.getTables().remove(toBeRemovedEncryptTableRuleConfig.get());
+ toBeRemovedEncryptTableRuleConfig.get().getColumns().forEach(column -> currentRuleConfig.getEncryptors().remove(column.getEncryptorName()));
+ }
}
- private Collection<String> getAlteredRuleNames(final AlterEncryptRuleStatement sqlStatement) {
- return sqlStatement.getRules().stream().map(EncryptRuleSegment::getTableName).collect(Collectors.toList());
+ private void addRuleConfiguration(final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
+ Optional<EncryptRuleConfiguration> toBeAlteredRuleConfig = new YamlRuleConfigurationSwapperEngine()
+ .swapToRuleConfigurations(Collections.singleton(EncryptRuleStatementConverter.convert(sqlStatement.getRules()))).stream().map(each -> (EncryptRuleConfiguration) each).findFirst();
+ Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+ currentRuleConfig.getTables().addAll(toBeAlteredRuleConfig.get().getTables());
+ currentRuleConfig.getEncryptors().putAll(toBeAlteredRuleConfig.get().getEncryptors());
}
@Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
index 0e98c41..8621309 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
+import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import org.apache.shardingsphere.infra.distsql.RDLUpdater;
import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
@@ -36,8 +37,8 @@ import org.apache.shardingsphere.readwritesplitting.yaml.converter.ReadwriteSpli
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
+import java.util.Optional;
import java.util.Properties;
-import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -53,69 +54,73 @@ public final class AlterReadwriteSplittingRuleStatementUpdater implements RDLUpd
@Override
public void checkSQLStatement(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement,
final ReadwriteSplittingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
+ checkCurrentRuleConfiguration(schemaName, sqlStatement, currentRuleConfig);
+ checkToBeAlteredRules(schemaName, sqlStatement, currentRuleConfig);
+ checkToBeAlteredResources(schemaName, sqlStatement, resource);
+ checkToBeAlteredLoadBalancer(sqlStatement);
+ }
+
+ private void checkCurrentRuleConfiguration(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
if (null == currentRuleConfig) {
- throw new ReadwriteSplittingRuleNotExistedException(schemaName, getAlteredRuleNames(sqlStatement));
+ throw new ReadwriteSplittingRuleNotExistedException(schemaName, getToBeAlteredRuleNames(sqlStatement));
+ }
+ }
+
+ private void checkToBeAlteredRules(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+ Collection<String> currentRuleNames = currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
+ Collection<String> notExistedRuleNames = getToBeAlteredRuleNames(sqlStatement).stream().filter(each -> !currentRuleNames.contains(each)).collect(Collectors.toList());
+ if (!notExistedRuleNames.isEmpty()) {
+ throw new ReadwriteSplittingRuleNotExistedException(schemaName, notExistedRuleNames);
}
- check(schemaName, sqlStatement, getAlteredRuleNames(sqlStatement), currentRuleConfig, resource);
}
- private void check(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement,
- final Collection<String> alteredRuleNames, final ReadwriteSplittingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
- checkAlteredRules(schemaName, alteredRuleNames, currentRuleConfig);
- checkResources(schemaName, sqlStatement, resource);
- checkLoadBalancer(sqlStatement);
+ private Collection<String> getToBeAlteredRuleNames(final AlterReadwriteSplittingRuleStatement sqlStatement) {
+ return sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toSet());
}
- private void checkAlteredRules(final String schemaName, final Collection<String> alteredRuleNames, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
- Set<String> existRuleNames = currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
- Collection<String> notExistRuleNames = alteredRuleNames.stream()
- .filter(each -> !existRuleNames.contains(each)).collect(Collectors.toList());
- if (!notExistRuleNames.isEmpty()) {
- throw new ReadwriteSplittingRuleNotExistedException(schemaName, notExistRuleNames);
+ private void checkToBeAlteredLoadBalancer(final AlterReadwriteSplittingRuleStatement sqlStatement) {
+ Collection<String> invalidLoadBalances = sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getLoadBalancer).distinct()
+ .filter(each -> !TypedSPIRegistry.findRegisteredService(ReplicaLoadBalanceAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
+ if (!invalidLoadBalances.isEmpty()) {
+ throw new InvalidLoadBalancersException(invalidLoadBalances);
}
}
- private void checkResources(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ShardingSphereResource resource) {
+ private void checkToBeAlteredResources(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ShardingSphereResource resource) {
Collection<String> resources = new LinkedHashSet<>();
sqlStatement.getRules().stream().filter(each -> Strings.isNullOrEmpty(each.getAutoAwareResource())).forEach(each -> {
resources.add(each.getWriteDataSource());
resources.addAll(each.getReadDataSources());
});
- Collection<String> notExistResources = resource.getNotExistedResources(resources);
- if (!notExistResources.isEmpty()) {
- throw new ResourceNotExistedException(schemaName, notExistResources);
- }
- }
-
- private void checkLoadBalancer(final AlterReadwriteSplittingRuleStatement sqlStatement) {
- Collection<String> invalidLoadBalances = sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getLoadBalancer).distinct()
- .filter(each -> !TypedSPIRegistry.findRegisteredService(ReplicaLoadBalanceAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
- if (!invalidLoadBalances.isEmpty()) {
- throw new InvalidLoadBalancersException(invalidLoadBalances);
+ Collection<String> notExistedResources = resource.getNotExistedResources(resources);
+ if (!notExistedResources.isEmpty()) {
+ throw new ResourceNotExistedException(schemaName, notExistedResources);
}
}
@Override
public void updateCurrentRuleConfiguration(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
- ReadwriteSplittingRuleConfiguration alterReadwriteSplittingRuleConfig = new YamlRuleConfigurationSwapperEngine()
- .swapToRuleConfigurations(Collections.singletonList(ReadwriteSplittingRuleStatementConverter.convert(sqlStatement))).stream()
- .map(each -> (ReadwriteSplittingRuleConfiguration) each).findFirst().get();
- drop(sqlStatement, currentRuleConfig);
- currentRuleConfig.getDataSources().addAll(alterReadwriteSplittingRuleConfig.getDataSources());
- currentRuleConfig.getLoadBalancers().putAll(alterReadwriteSplittingRuleConfig.getLoadBalancers());
+ dropRuleConfiguration(sqlStatement, currentRuleConfig);
+ addRuleConfiguration(sqlStatement, currentRuleConfig);
}
- private void drop(final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration ruleConfig) {
- getAlteredRuleNames(sqlStatement).forEach(each -> {
- ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig = ruleConfig.getDataSources().stream().filter(dataSource -> each.equals(dataSource.getName())).findAny().get();
- ruleConfig.getDataSources().remove(dataSourceRuleConfig);
- ruleConfig.getLoadBalancers().remove(dataSourceRuleConfig.getLoadBalancerName());
- });
+ private void dropRuleConfiguration(final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+ for (String each : getToBeAlteredRuleNames(sqlStatement)) {
+ Optional<ReadwriteSplittingDataSourceRuleConfiguration> toBeRemovedDataSourceRuleConfig
+ = currentRuleConfig.getDataSources().stream().filter(dataSource -> each.equals(dataSource.getName())).findAny();
+ Preconditions.checkState(toBeRemovedDataSourceRuleConfig.isPresent());
+ currentRuleConfig.getDataSources().remove(toBeRemovedDataSourceRuleConfig.get());
+ currentRuleConfig.getLoadBalancers().remove(toBeRemovedDataSourceRuleConfig.get().getLoadBalancerName());
+ }
}
- private Collection<String> getAlteredRuleNames(final AlterReadwriteSplittingRuleStatement sqlStatement) {
- return sqlStatement.getRules()
- .stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toSet());
+ private void addRuleConfiguration(final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+ Optional<ReadwriteSplittingRuleConfiguration> toBeAlteredRuleConfig = new YamlRuleConfigurationSwapperEngine()
+ .swapToRuleConfigurations(Collections.singletonList(ReadwriteSplittingRuleStatementConverter.convert(sqlStatement))).stream()
+ .map(each -> (ReadwriteSplittingRuleConfiguration) each).findFirst();
+ Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+ currentRuleConfig.getDataSources().addAll(toBeAlteredRuleConfig.get().getDataSources());
+ currentRuleConfig.getLoadBalancers().putAll(toBeAlteredRuleConfig.get().getLoadBalancers());
}
@Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
index 3d82a14..b722ab6 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
-import com.google.common.base.Splitter;
import org.apache.shardingsphere.infra.distsql.RDLUpdater;
import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
import org.apache.shardingsphere.proxy.backend.exception.DuplicateBindingTablesException;
@@ -31,7 +30,6 @@ import org.apache.shardingsphere.sharding.distsql.parser.statement.AlterSharding
import java.util.Collection;
import java.util.HashSet;
-import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
@@ -42,55 +40,52 @@ public final class AlterShardingBindingTableRuleStatementUpdater implements RDLU
@Override
public void checkSQLStatement(final String schemaName, final AlterShardingBindingTableRulesStatement sqlStatement,
final ShardingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
+ checkCurrentRuleConfiguration(schemaName, currentRuleConfig);
+ checkToBeAlertedBindingTables(schemaName, sqlStatement, currentRuleConfig);
+ checkToBeAlteredDuplicateBindingTables(sqlStatement);
+ }
+
+ private void checkCurrentRuleConfiguration(final String schemaName, final ShardingRuleConfiguration currentRuleConfig) {
if (null == currentRuleConfig) {
throw new ShardingBindingTableRuleNotExistsException(schemaName);
}
- Collection<String> invalidBindingTables = new HashSet<>();
- Collection<String> existLogicTables = getLogicTables(currentRuleConfig);
- Collection<String> bindingTables = ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables();
- for (String bindingTable : bindingTables) {
- for (String logicTable : Splitter.on(",").splitToList(bindingTable)) {
- if (!existLogicTables.contains(logicTable.trim())) {
- invalidBindingTables.add(logicTable);
- }
- }
- }
- if (!invalidBindingTables.isEmpty()) {
- throw new ShardingTableRuleNotExistedException(schemaName, invalidBindingTables);
- }
- Collection<String> duplicateBindingTables = bindingTables.stream().filter(distinct()).collect(Collectors.toList());
- if (!duplicateBindingTables.isEmpty()) {
- throw new DuplicateBindingTablesException(duplicateBindingTables);
- }
}
- @Override
- public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
- Collection<String> bindingTableGroups = currentRuleConfig.getBindingTableGroups();
- bindingTableGroups.clear();
- bindingTableGroups.addAll(ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables());
+ private void checkToBeAlertedBindingTables(final String schemaName, final AlterShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ Collection<String> currentLogicTables = getCurrentLogicTables(currentRuleConfig);
+ Collection<String> notExistedBindingTables = sqlStatement.getBindingTables().stream().filter(each -> !currentLogicTables.contains(each)).collect(Collectors.toSet());
+ if (!notExistedBindingTables.isEmpty()) {
+ throw new ShardingTableRuleNotExistedException(schemaName, notExistedBindingTables);
+ }
}
- private Collection<String> getLogicTables(final ShardingRuleConfiguration currentRuleConfig) {
+ private Collection<String> getCurrentLogicTables(final ShardingRuleConfiguration currentRuleConfig) {
Collection<String> result = new HashSet<>();
result.addAll(currentRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toSet()));
result.addAll(currentRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toSet()));
return result;
}
- private Predicate<String> distinct() {
- Collection<String> tables = new HashSet<>();
- return table -> notEquals(table, tables);
+ private void checkToBeAlteredDuplicateBindingTables(final AlterShardingBindingTableRulesStatement sqlStatement) {
+ Collection<String> toBeAlteredBindingTables = new HashSet<>();
+ Collection<String> duplicateBindingTables = sqlStatement.getBindingTables().stream().filter(each -> !toBeAlteredBindingTables.add(each)).collect(Collectors.toSet());
+ if (!duplicateBindingTables.isEmpty()) {
+ throw new DuplicateBindingTablesException(duplicateBindingTables);
+ }
}
- private boolean notEquals(final String table, final Collection<String> tables) {
- for (String each : tables) {
- if (table.equals(each) || (table.length() == each.length() && Splitter.on(",").splitToList(each).containsAll(Splitter.on(",").splitToList(table)))) {
- return true;
- }
- }
- tables.add(table);
- return false;
+ @Override
+ public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ dropRuleConfiguration(currentRuleConfig);
+ addRuleConfiguration(sqlStatement, currentRuleConfig);
+ }
+
+ private void dropRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig) {
+ currentRuleConfig.getBindingTableGroups().clear();
+ }
+
+ private void addRuleConfiguration(final AlterShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ currentRuleConfig.getBindingTableGroups().addAll(ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables());
}
@Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
index 38b2c50..8f2f43d 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
@@ -23,8 +23,6 @@ import org.apache.shardingsphere.proxy.backend.exception.ShardingBroadcastTableR
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import org.apache.shardingsphere.sharding.distsql.parser.statement.AlterShardingBroadcastTableRulesStatement;
-import java.util.Collection;
-
/**
* Alter sharding broadcast table rule statement updater.
*/
@@ -33,6 +31,10 @@ public final class AlterShardingBroadcastTableRuleStatementUpdater implements RD
@Override
public void checkSQLStatement(final String schemaName, final AlterShardingBroadcastTableRulesStatement sqlStatement,
final ShardingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
+ checkCurrentRuleConfiguration(schemaName, currentRuleConfig);
+ }
+
+ private void checkCurrentRuleConfiguration(final String schemaName, final ShardingRuleConfiguration currentRuleConfig) {
if (null == currentRuleConfig) {
throw new ShardingBroadcastTableRuleNotExistsException(schemaName);
}
@@ -40,9 +42,16 @@ public final class AlterShardingBroadcastTableRuleStatementUpdater implements RD
@Override
public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingBroadcastTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
- Collection<String> broadcastTables = currentRuleConfig.getBroadcastTables();
- broadcastTables.clear();
- broadcastTables.addAll(sqlStatement.getTables());
+ dropRuleConfiguration(currentRuleConfig);
+ addRuleConfiguration(sqlStatement, currentRuleConfig);
+ }
+
+ private void dropRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig) {
+ currentRuleConfig.getBroadcastTables().clear();
+ }
+
+ private void addRuleConfiguration(final AlterShardingBroadcastTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ currentRuleConfig.getBroadcastTables().addAll(sqlStatement.getTables());
}
@Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
index 2fee8ab..7d574b1 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
+import com.google.common.base.Preconditions;
import org.apache.shardingsphere.infra.distsql.RDLUpdater;
import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
@@ -41,7 +42,7 @@ import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map.Entry;
-import java.util.Objects;
+import java.util.Optional;
import java.util.Properties;
import java.util.stream.Collectors;
@@ -59,84 +60,113 @@ public final class AlterShardingTableRuleStatementUpdater implements RDLUpdater<
@Override
public void checkSQLStatement(final String schemaName, final AlterShardingTableRuleStatement sqlStatement,
final ShardingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
- Collection<String> notExistResources = resource.getNotExistedResources(getResources(sqlStatement));
+ checkCurrentRuleConfiguration(schemaName, sqlStatement, currentRuleConfig);
+ checkToBeAlteredResources(schemaName, sqlStatement, resource);
+ checkToBeAlteredShardingTables(schemaName, sqlStatement, currentRuleConfig);
+ checkToBeAlteredShardingAlgorithm(sqlStatement);
+ checkToBeAlteredKeyGenerators(sqlStatement);
+ checkToBeAlteredDuplicateShardingTables(sqlStatement);
+ }
+
+ private void checkCurrentRuleConfiguration(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ if (null == currentRuleConfig) {
+ throw new ShardingTableRuleNotExistedException(schemaName, getToBeAlteredTableNames(sqlStatement));
+ }
+ }
+
+ private Collection<String> getToBeAlteredTableNames(final AlterShardingTableRuleStatement sqlStatement) {
+ return sqlStatement.getRules().stream().map(TableRuleSegment::getLogicTable).collect(Collectors.toList());
+ }
+
+ private void checkToBeAlteredResources(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingSphereResource resource) {
+ Collection<String> notExistResources = resource.getNotExistedResources(getToBeAlteredResources(sqlStatement));
if (!notExistResources.isEmpty()) {
throw new ResourceNotExistedException(schemaName, notExistResources);
}
- Collection<String> duplicateTables = getDuplicateTables(sqlStatement);
- if (!duplicateTables.isEmpty()) {
- throw new DuplicateTablesException(duplicateTables);
- }
- Collection<String> alteredTables = getAlteredTables(sqlStatement);
- if (null == currentRuleConfig) {
- throw new ShardingTableRuleNotExistedException(schemaName, alteredTables);
- }
- Collection<String> existTables = getShardingTables(currentRuleConfig);
- Collection<String> notExistTables = alteredTables.stream().filter(each -> !existTables.contains(each)).collect(Collectors.toList());
- if (!notExistTables.isEmpty()) {
- throw new ShardingTableRuleNotExistedException(schemaName, notExistTables);
+ }
+
+ private Collection<String> getToBeAlteredResources(final AlterShardingTableRuleStatement sqlStatement) {
+ Collection<String> result = new LinkedHashSet<>();
+ sqlStatement.getRules().forEach(each -> result.addAll(each.getDataSources()));
+ return result;
+ }
+
+ private void checkToBeAlteredShardingTables(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ Collection<String> currentShardingTables = getCurrentShardingTables(currentRuleConfig);
+ Collection<String> notExistedShardingTables = getToBeAlteredTableNames(sqlStatement).stream().filter(each -> !currentShardingTables.contains(each)).collect(Collectors.toList());
+ if (!notExistedShardingTables.isEmpty()) {
+ throw new ShardingTableRuleNotExistedException(schemaName, notExistedShardingTables);
}
- Collection<String> invalidTableAlgorithms = sqlStatement.getRules().stream().map(each -> each.getTableStrategy().getName()).distinct()
+ }
+
+ private Collection<String> getCurrentShardingTables(final ShardingRuleConfiguration currentRuleConfig) {
+ Collection<String> result = new LinkedList<>();
+ result.addAll(currentRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
+ result.addAll(currentRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
+ return result;
+ }
+
+ private void checkToBeAlteredShardingAlgorithm(final AlterShardingTableRuleStatement sqlStatement) {
+ Collection<String> notExistedShardingAlgorithms = sqlStatement.getRules().stream().map(each -> each.getTableStrategy().getName()).distinct()
.filter(each -> !TypedSPIRegistry.findRegisteredService(ShardingAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
- if (!invalidTableAlgorithms.isEmpty()) {
- throw new InvalidShardingAlgorithmsException(invalidTableAlgorithms);
+ if (!notExistedShardingAlgorithms.isEmpty()) {
+ throw new InvalidShardingAlgorithmsException(notExistedShardingAlgorithms);
}
- Collection<String> invalidKeyGenerators = getKeyGenerators(sqlStatement).stream()
+ }
+
+ private void checkToBeAlteredKeyGenerators(final AlterShardingTableRuleStatement sqlStatement) {
+ Collection<String> notExistedKeyGenerators = getToBeAlteredKeyGenerators(sqlStatement).stream().distinct()
.filter(each -> !TypedSPIRegistry.findRegisteredService(KeyGenerateAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
- if (!invalidKeyGenerators.isEmpty()) {
- throw new InvalidKeyGeneratorsException(invalidKeyGenerators);
+ if (!notExistedKeyGenerators.isEmpty()) {
+ throw new InvalidKeyGeneratorsException(notExistedKeyGenerators);
}
}
- @Override
- public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
- ShardingRuleConfiguration alteredShardingRuleConfig = new YamlRuleConfigurationSwapperEngine()
- .swapToRuleConfigurations(Collections.singletonList(ShardingRuleStatementConverter.convert(sqlStatement))).stream().map(each -> (ShardingRuleConfiguration) each).findFirst().get();
- drop(sqlStatement, currentRuleConfig);
- currentRuleConfig.getAutoTables().addAll(alteredShardingRuleConfig.getAutoTables());
- currentRuleConfig.getShardingAlgorithms().putAll(alteredShardingRuleConfig.getShardingAlgorithms());
- currentRuleConfig.getKeyGenerators().putAll(alteredShardingRuleConfig.getKeyGenerators());
- }
-
- private void drop(final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
- getAlteredTables(sqlStatement).forEach(each -> {
- ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig = currentRuleConfig.getAutoTables().stream().filter(tableRule -> each.equals(tableRule.getLogicTable())).findAny().get();
- currentRuleConfig.getAutoTables().remove(shardingAutoTableRuleConfig);
- currentRuleConfig.getShardingAlgorithms().remove(shardingAutoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName());
- if (Objects.nonNull(shardingAutoTableRuleConfig.getKeyGenerateStrategy())) {
- currentRuleConfig.getKeyGenerators().remove(shardingAutoTableRuleConfig.getKeyGenerateStrategy().getKeyGeneratorName());
- }
- });
+ private Collection<String> getToBeAlteredKeyGenerators(final AlterShardingTableRuleStatement sqlStatement) {
+ return sqlStatement.getRules().stream().filter(each -> null != each.getKeyGenerateStrategy()).map(each -> each.getKeyGenerateStrategy().getName()).collect(Collectors.toSet());
+ }
+
+ private void checkToBeAlteredDuplicateShardingTables(final AlterShardingTableRuleStatement sqlStatement) {
+ Collection<String> duplicateTables = getDuplicateTables(sqlStatement);
+ if (!duplicateTables.isEmpty()) {
+ throw new DuplicateTablesException(duplicateTables);
+ }
}
private Collection<String> getDuplicateTables(final AlterShardingTableRuleStatement sqlStatement) {
return sqlStatement.getRules().stream()
- .collect(Collectors.toMap(TableRuleSegment::getLogicTable, e -> 1, Integer::sum))
+ .collect(Collectors.toMap(TableRuleSegment::getLogicTable, entry -> 1, Integer::sum))
.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.map(Entry::getKey)
.collect(Collectors.toList());
}
- private Collection<String> getAlteredTables(final AlterShardingTableRuleStatement sqlStatement) {
- return sqlStatement.getRules().stream().map(TableRuleSegment::getLogicTable).collect(Collectors.toList());
- }
-
- private Collection<String> getShardingTables(final ShardingRuleConfiguration shardingRuleConfig) {
- Collection<String> result = new LinkedList<>();
- result.addAll(shardingRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
- result.addAll(shardingRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
- return result;
+ @Override
+ public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ dropRuleConfiguration(sqlStatement, currentRuleConfig);
+ addRuleConfiguration(sqlStatement, currentRuleConfig);
}
- private Collection<String> getResources(final AlterShardingTableRuleStatement sqlStatement) {
- Collection<String> result = new LinkedHashSet<>();
- sqlStatement.getRules().forEach(each -> result.addAll(each.getDataSources()));
- return result;
+ private void dropRuleConfiguration(final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ for (String each : getToBeAlteredTableNames(sqlStatement)) {
+ Optional<ShardingAutoTableRuleConfiguration> shardingAutoTableRuleConfig = currentRuleConfig.getAutoTables().stream().filter(tableRule -> each.equals(tableRule.getLogicTable())).findAny();
+ Preconditions.checkState(shardingAutoTableRuleConfig.isPresent());
+ currentRuleConfig.getAutoTables().remove(shardingAutoTableRuleConfig.get());
+ currentRuleConfig.getShardingAlgorithms().remove(shardingAutoTableRuleConfig.get().getShardingStrategy().getShardingAlgorithmName());
+ if (null != shardingAutoTableRuleConfig.get().getKeyGenerateStrategy()) {
+ currentRuleConfig.getKeyGenerators().remove(shardingAutoTableRuleConfig.get().getKeyGenerateStrategy().getKeyGeneratorName());
+ }
+ }
}
- private Collection<String> getKeyGenerators(final AlterShardingTableRuleStatement sqlStatement) {
- return sqlStatement.getRules().stream().filter(each -> Objects.nonNull(each.getKeyGenerateStrategy())).map(each -> each.getKeyGenerateStrategy().getName()).collect(Collectors.toSet());
+ private void addRuleConfiguration(final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ Optional<ShardingRuleConfiguration> toBeAlteredRuleConfig = new YamlRuleConfigurationSwapperEngine()
+ .swapToRuleConfigurations(Collections.singleton(ShardingRuleStatementConverter.convert(sqlStatement))).stream().map(each -> (ShardingRuleConfiguration) each).findFirst();
+ Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+ currentRuleConfig.getAutoTables().addAll(toBeAlteredRuleConfig.get().getAutoTables());
+ currentRuleConfig.getShardingAlgorithms().putAll(toBeAlteredRuleConfig.get().getShardingAlgorithms());
+ currentRuleConfig.getKeyGenerators().putAll(toBeAlteredRuleConfig.get().getKeyGenerators());
}
@Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
index 72354bf..bb4b23d 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
-import com.google.common.base.Splitter;
import org.apache.shardingsphere.infra.distsql.RDLUpdater;
import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
import org.apache.shardingsphere.proxy.backend.exception.DuplicateBindingTablesException;
@@ -30,9 +29,9 @@ import org.apache.shardingsphere.sharding.converter.ShardingRuleStatementConvert
import org.apache.shardingsphere.sharding.distsql.parser.statement.CreateShardingBindingTableRulesStatement;
import org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
+import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
-import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
@@ -48,22 +47,16 @@ public final class CreateShardingBindingTableRuleStatementUpdater implements RDL
}
Collection<String> invalidBindingTables = new HashSet<>();
Collection<String> existLogicTables = getLogicTables(currentRuleConfig);
- Collection<String> bindingTables = ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables();
- for (String bindingTable : bindingTables) {
- for (String logicTable : Splitter.on(",").splitToList(bindingTable)) {
- if (!existLogicTables.contains(logicTable.trim())) {
- invalidBindingTables.add(logicTable);
- }
+ Collection<String> bindingTables = sqlStatement.getBindingTables();
+ for (String each : bindingTables) {
+ if (!existLogicTables.contains(each)) {
+ invalidBindingTables.add(each);
}
}
if (!invalidBindingTables.isEmpty()) {
throw new ShardingTableRuleNotExistedException(schemaName, invalidBindingTables);
}
- bindingTables.addAll(currentRuleConfig.getBindingTableGroups());
- Collection<String> duplicateBindingTables = bindingTables.stream().filter(distinct()).collect(Collectors.toList());
- if (!duplicateBindingTables.isEmpty()) {
- throw new DuplicateBindingTablesException(duplicateBindingTables);
- }
+ checkToBeCreatedDuplicateBindingTables(sqlStatement, currentRuleConfig);
}
private Collection<String> getLogicTables(final ShardingRuleConfiguration currentRuleConfig) {
@@ -73,20 +66,17 @@ public final class CreateShardingBindingTableRuleStatementUpdater implements RDL
return result;
}
- private Predicate<String> distinct() {
- Collection<String> tables = new HashSet<>();
- return table -> notEquals(table, tables);
+ private void checkToBeCreatedDuplicateBindingTables(final CreateShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+ Collection<String> toBeCreatedBindingTables = new HashSet<>();
+ Collection<String> duplicateBindingTables = sqlStatement.getBindingTables().stream().filter(each -> !toBeCreatedBindingTables.add(each)).collect(Collectors.toSet());
+ duplicateBindingTables.addAll(getCurrentBindingTables(currentRuleConfig).stream().filter(each -> !toBeCreatedBindingTables.add(each)).collect(Collectors.toSet()));
+ if (!duplicateBindingTables.isEmpty()) {
+ throw new DuplicateBindingTablesException(duplicateBindingTables);
+ }
}
- private boolean notEquals(final String table, final Collection<String> tables) {
- for (String each : tables) {
- if (table.equals(each) || (table.length() == each.length() && Splitter.on(",").splitToList(each)
- .containsAll(Splitter.on(",").splitToList(table)))) {
- return true;
- }
- }
- tables.add(table);
- return false;
+ private Collection<String> getCurrentBindingTables(final ShardingRuleConfiguration currentRuleConfig) {
+ return currentRuleConfig.getBindingTableGroups().stream().flatMap(each -> Arrays.stream(each.split(","))).map(String::trim).collect(Collectors.toList());
}
@Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
index 161d5d6..639a69f 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
@@ -109,7 +109,8 @@ public final class AlterShardingTableRuleBackendHandlerTest {
@Test(expected = DuplicateTablesException.class)
public void assertExecuteWithDuplicateTablesInRDL() {
- TableRuleSegment tableRuleSegment = new TableRuleSegment("t_order", Collections.emptyList(), null, null, null, null);
+ TableRuleSegment tableRuleSegment = new TableRuleSegment("t_order", Collections.emptyList(), null, new AlgorithmSegment("hash_mod", new Properties()), null, null);
+ when(ruleMetaData.getConfigurations()).thenReturn(buildShardingConfigurations());
when(sqlStatement.getRules()).thenReturn(Arrays.asList(tableRuleSegment, tableRuleSegment));
handler.execute("test", sqlStatement);
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
index 43ae8c8..bffc260 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
@@ -117,13 +117,13 @@ public final class CreateShardingBindingTableRulesBackendHandlerTest {
}
private ShardingRuleConfiguration buildShardingBindingTableRuleConfiguration() {
- ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
- shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_order"));
- shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_order_item"));
- shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_1"));
- shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_2"));
- shardingRuleConfig.getBindingTableGroups().add("t_order,t_order_item");
- return shardingRuleConfig;
+ ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+ result.getTables().add(new ShardingTableRuleConfiguration("t_order"));
+ result.getTables().add(new ShardingTableRuleConfiguration("t_order_item"));
+ result.getTables().add(new ShardingTableRuleConfiguration("t_1"));
+ result.getTables().add(new ShardingTableRuleConfiguration("t_2"));
+ result.getBindingTableGroups().add("t_order,t_order_item");
+ return result;
}
private CreateShardingBindingTableRulesStatement buildShardingTableRuleStatement() {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
index 33ae1c9..c6e68bd 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
@@ -47,7 +47,7 @@ public final class ShardingBindingTableRuleAssert {
} else {
assertNotNull(assertContext.getText("Actual should exist."), actual);
assertThat(assertContext.getText(String.format("`%s`'s sharding binding table rule segment assertion error: ",
- actual.getClass().getSimpleName())), actual.getTables(), is(expected.getTables()));
+ actual.getClass().getSimpleName())), actual.getTableGroups(), is(expected.getTables()));
}
}
}