You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2022/03/02 06:56:02 UTC
[shardingsphere] branch master updated: `Drop sharding binding table rules` syntax ignore the effect of sharding table order on drop binding rule (#15735)
This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 7d92ddd `Drop sharding binding table rules` syntax ignore the effect of sharding table order on drop binding rule (#15735)
7d92ddd is described below
commit 7d92ddd8531f28576d2546a6361702d8e4f22efd
Author: lanchengx <52...@users.noreply.github.com>
AuthorDate: Wed Mar 2 14:54:41 2022 +0800
`Drop sharding binding table rules` syntax ignore the effect of sharding table order on drop binding rule (#15735)
* `Drop sharding binding table rules` supports dropping specified rules when the order of sharding tables is inconsistent
* Rename method.
---
...opShardingBindingTableRuleStatementUpdater.java | 52 +++++++++++++++++-----
...ardingBindingTableRuleStatementUpdaterTest.java | 19 +++++++-
2 files changed, 59 insertions(+), 12 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingBindingTableRuleStatementUpdater.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingBindingTableRuleStatementUpdater.java
index dd69122..143552f 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingBindingTableRuleStatementUpdater.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/DropShardingBindingTableRuleStatementUpdater.java
@@ -17,47 +17,79 @@
package org.apache.shardingsphere.sharding.distsql.handler.update;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
import org.apache.shardingsphere.infra.distsql.exception.DistSQLException;
import org.apache.shardingsphere.infra.distsql.exception.rule.RequiredRuleMissedException;
import org.apache.shardingsphere.infra.distsql.update.RuleDefinitionDropUpdater;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
import org.apache.shardingsphere.sharding.distsql.parser.statement.DropShardingBindingTableRulesStatement;
+import java.util.Arrays;
import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.LinkedList;
-import java.util.stream.Collectors;
+import java.util.Map;
+import java.util.Optional;
/**
* Drop sharding binding table rule statement updater.
*/
public final class DropShardingBindingTableRuleStatementUpdater implements RuleDefinitionDropUpdater<DropShardingBindingTableRulesStatement, ShardingRuleConfiguration> {
+ private Map<String, String> bindingTableRules;
+
@Override
public void checkSQLStatement(final ShardingSphereMetaData shardingSphereMetaData, final DropShardingBindingTableRulesStatement sqlStatement,
final ShardingRuleConfiguration currentRuleConfig) throws DistSQLException {
String schemaName = shardingSphereMetaData.getName();
checkCurrentRuleConfiguration(schemaName, currentRuleConfig);
- checkBindingTableRuleExist(schemaName, sqlStatement, currentRuleConfig);
+ bindingTableRules = buildBindingTableRule(currentRuleConfig);
+ checkBindingTableRuleExist(schemaName, sqlStatement, bindingTableRules);
}
private void checkCurrentRuleConfiguration(final String schemaName, final ShardingRuleConfiguration currentRuleConfig) throws DistSQLException {
DistSQLException.predictionThrow(null != currentRuleConfig && !currentRuleConfig.getBindingTableGroups().isEmpty(), new RequiredRuleMissedException("Binding", schemaName));
}
+ private Map<String, String> buildBindingTableRule(final ShardingRuleConfiguration configuration) {
+ Map<String, String> result = new LinkedHashMap<>();
+ configuration.getBindingTableGroups().forEach(each -> Arrays.stream(each.split(",")).forEach(each1 -> result.put(each1, each)));
+ return result;
+ }
+
private void checkBindingTableRuleExist(final String schemaName, final DropShardingBindingTableRulesStatement sqlStatement,
- final ShardingRuleConfiguration currentRuleConfig) throws DistSQLException {
- Collection<String> bindingTableGroups = currentRuleConfig.getBindingTableGroups();
- Collection<String> notExistBindingGroup = sqlStatement.getBindingGroups().stream().filter(each -> !bindingTableGroups.contains(each)).collect(Collectors.toCollection(LinkedList::new));
- DistSQLException.predictionThrow(notExistBindingGroup.isEmpty(), new RequiredRuleMissedException("Binding", schemaName, notExistBindingGroup));
+ final Map<String, String> bindingRelationship) throws DistSQLException {
+ Collection<String> notExistBindingGroups = new LinkedList<>();
+ for (BindingTableRuleSegment each : sqlStatement.getRules()) {
+ if (!isToBeDroppedRuleExists(each, bindingRelationship)) {
+ notExistBindingGroups.add(each.getTableGroups());
+ }
+ }
+ DistSQLException.predictionThrow(notExistBindingGroups.isEmpty(), new RequiredRuleMissedException("Binding", schemaName, notExistBindingGroups));
+ }
+
+ private boolean isToBeDroppedRuleExists(final BindingTableRuleSegment bindingRule, final Map<String, String> bindingRelationship) {
+ Optional<String> anyTableInToBeAlteredRule = bindingRule.getBindingTables().stream().findAny();
+ if (anyTableInToBeAlteredRule.isPresent()) {
+ String currentBindingRule = bindingRelationship.get(anyTableInToBeAlteredRule.get());
+ if (!Strings.isNullOrEmpty(currentBindingRule)) {
+ Collection<String> currentBindingTables = Splitter.on(",").trimResults().splitToList(currentBindingRule);
+ return bindingRule.getBindingTables().containsAll(currentBindingTables);
+ }
+ }
+ return false;
}
@Override
public boolean updateCurrentRuleConfiguration(final DropShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
- if (sqlStatement.getRules().isEmpty()) {
- currentRuleConfig.getBindingTableGroups().clear();
- } else {
- currentRuleConfig.getBindingTableGroups().removeIf(sqlStatement.getBindingGroups()::contains);
+ currentRuleConfig.getBindingTableGroups().clear();
+ if (!sqlStatement.getRules().isEmpty()) {
+ sqlStatement.getRules().forEach(each -> each.getBindingTables().forEach(each1 -> bindingTableRules.remove(each1)));
+ currentRuleConfig.getBindingTableGroups().addAll(new LinkedHashSet<>(bindingTableRules.values()));
}
return false;
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingBindingTableRuleStatementUpdaterTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingBindingTableRuleStatementUpdaterTest.java
index 75a7aac..79ac8b9 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingBindingTableRuleStatementUpdaterTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/DropShardingBindingTableRuleStatementUpdaterTest.java
@@ -36,6 +36,7 @@ import java.util.LinkedList;
import java.util.stream.Collectors;
import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
@@ -71,14 +72,28 @@ public final class DropShardingBindingTableRuleStatementUpdaterTest {
}
@Test
- public void assertDropSpecifiedCurrentRuleConfiguration() {
+ public void assertDropSpecifiedCurrentRuleConfiguration() throws DistSQLException {
ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration();
currentRuleConfig.getBindingTableGroups().add("t_1,t_2");
- updater.updateCurrentRuleConfiguration(createSQLStatement("t_1,t_2"), currentRuleConfig);
+ DropShardingBindingTableRulesStatement sqlStatement = createSQLStatement("t_1,t_2");
+ updater.checkSQLStatement(shardingSphereMetaData, sqlStatement, currentRuleConfig);
+ updater.updateCurrentRuleConfiguration(sqlStatement, currentRuleConfig);
assertThat(currentRuleConfig.getBindingTableGroups().size(), is(1));
assertTrue(currentRuleConfig.getBindingTableGroups().contains("t_order,t_order_item"));
}
+ @Test
+ public void assertDropWrongOrderRulesCurrentRuleConfiguration() throws DistSQLException {
+ ShardingRuleConfiguration currentRuleConfig = createCurrentRuleConfiguration();
+ currentRuleConfig.getBindingTableGroups().add("t_1,t_2,t_3");
+ DropShardingBindingTableRulesStatement sqlStatement = createSQLStatement("t_3,t_2,t_1");
+ updater.checkSQLStatement(shardingSphereMetaData, sqlStatement, currentRuleConfig);
+ updater.updateCurrentRuleConfiguration(sqlStatement, currentRuleConfig);
+ assertThat(currentRuleConfig.getBindingTableGroups().size(), is(1));
+ assertTrue(currentRuleConfig.getBindingTableGroups().contains("t_order,t_order_item"));
+ assertFalse(currentRuleConfig.getBindingTableGroups().contains("t_1,t_2,t_3"));
+ }
+
private DropShardingBindingTableRulesStatement createSQLStatement(final String... group) {
LinkedList<BindingTableRuleSegment> segments = Arrays.stream(group).map(BindingTableRuleSegment::new).collect(Collectors.toCollection(LinkedList::new));
return new DropShardingBindingTableRulesStatement(segments);