You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/05/26 11:22:08 UTC
[shardingsphere] branch master updated: ALTRE SHARDING TABLE RULE check binding table rules. (#17931)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 ec7822aba0a ALTRE SHARDING TABLE RULE check binding table rules. (#17931)
ec7822aba0a is described below
commit ec7822aba0a5b32890829bc46dec7a8bf9ebeee0
Author: yx9o <ya...@163.com>
AuthorDate: Thu May 26 19:22:02 2022 +0800
ALTRE SHARDING TABLE RULE check binding table rules. (#17931)
* Add check binding table rules.
* Check parameter list adjustment.
* Update check interface name.
* Update.
---
.../shardingsphere/sharding/rule/ShardingRule.java | 99 +++++++++++++++++-----
.../handler/checker/BindingTableCheckedConfig.java | 48 +++++++++++
.../checker/ShardingTableRuleStatementChecker.java | 70 +++++++++------
.../AlterShardingTableRuleStatementUpdater.java | 2 +-
.../infra/rule/identifier/type/CheckableRule.java | 38 +++++++++
5 files changed, 210 insertions(+), 47 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index 61a1686532c..25280016100 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -22,6 +22,7 @@ import com.google.common.base.Splitter;
import lombok.Getter;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.config.RuleConfiguration;
import org.apache.shardingsphere.infra.config.algorithm.InstanceAwareAlgorithm;
import org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
@@ -31,6 +32,7 @@ import org.apache.shardingsphere.infra.instance.InstanceContext;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.ShardingSphereSchema;
import org.apache.shardingsphere.infra.rule.identifier.scope.SchemaRule;
+import org.apache.shardingsphere.infra.rule.identifier.type.CheckableRule;
import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.infra.rule.identifier.type.InstanceAwareRule;
import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
@@ -44,6 +46,7 @@ import org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShard
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.api.sharding.ShardingAutoTableAlgorithm;
+import org.apache.shardingsphere.sharding.distsql.handler.checker.BindingTableCheckedConfig;
import org.apache.shardingsphere.sharding.factory.KeyGenerateAlgorithmFactory;
import org.apache.shardingsphere.sharding.factory.ShardingAlgorithmFactory;
import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm;
@@ -77,7 +80,7 @@ import java.util.stream.Collectors;
* Sharding rule.
*/
@Getter
-public final class ShardingRule implements SchemaRule, DataNodeContainedRule, TableContainedRule, InstanceAwareRule {
+public final class ShardingRule implements SchemaRule, DataNodeContainedRule, TableContainedRule, InstanceAwareRule, CheckableRule {
private static final String EQUAL = "=";
@@ -118,7 +121,9 @@ public final class ShardingRule implements SchemaRule, DataNodeContainedRule, Ta
: keyGenerators.get(config.getDefaultKeyGenerateStrategy().getKeyGeneratorName());
defaultShardingColumn = config.getDefaultShardingColumn();
shardingTableDataNodes = createShardingTableDataNodes(tableRules);
- Preconditions.checkArgument(isValidBindingTableConfiguration(config.getBindingTableGroups()), "Invalid binding table configuration in ShardingRuleConfiguration.");
+ Preconditions.checkArgument(isValidBindingTableConfiguration(tableRules, new BindingTableCheckedConfig(this.dataSourceNames, shardingAlgorithms, config.getBindingTableGroups(),
+ broadcastTables, defaultDatabaseShardingStrategyConfig, defaultTableShardingStrategyConfig, defaultShardingColumn)),
+ "Invalid binding table configuration in ShardingRuleConfiguration.");
}
public ShardingRule(final AlgorithmProvidedShardingRuleConfiguration config, final Collection<String> dataSourceNames) {
@@ -136,7 +141,32 @@ public final class ShardingRule implements SchemaRule, DataNodeContainedRule, Ta
: keyGenerators.get(config.getDefaultKeyGenerateStrategy().getKeyGeneratorName());
defaultShardingColumn = config.getDefaultShardingColumn();
shardingTableDataNodes = createShardingTableDataNodes(tableRules);
- Preconditions.checkArgument(isValidBindingTableConfiguration(config.getBindingTableGroups()), "Invalid binding table configuration in ShardingRuleConfiguration.");
+ Preconditions.checkArgument(isValidBindingTableConfiguration(tableRules, new BindingTableCheckedConfig(this.dataSourceNames, shardingAlgorithms, config.getBindingTableGroups(),
+ broadcastTables, defaultDatabaseShardingStrategyConfig, defaultTableShardingStrategyConfig, defaultShardingColumn)),
+ "Invalid binding table configuration in ShardingRuleConfiguration.");
+ }
+
+ @Override
+ public boolean check(final RuleConfiguration ruleConfig, final Collection<String> dataSourceNames) {
+ if (null == ruleConfig || !(ruleConfig instanceof ShardingRuleConfiguration)) {
+ return true;
+ }
+ ShardingRuleConfiguration config = (ShardingRuleConfiguration) ruleConfig;
+ Collection<String> allDataSourceNames = getDataSourceNames(config.getTables(), config.getAutoTables(), dataSourceNames);
+ Map<String, ShardingAlgorithm> shardingAlgorithms = new HashMap<>(config.getShardingAlgorithms().size(), 1);
+ Map<String, TableRule> tableRules = new HashMap<>();
+ config.getShardingAlgorithms().forEach((key, value) -> shardingAlgorithms.put(key, ShardingAlgorithmFactory.newInstance(value)));
+ tableRules.putAll(createTableRules(config.getTables(), config.getDefaultKeyGenerateStrategy(), allDataSourceNames));
+ tableRules.putAll(createAutoTableRules(config.getAutoTables(), shardingAlgorithms, config.getDefaultKeyGenerateStrategy(), allDataSourceNames));
+ Collection<String> broadcastTables = createBroadcastTables(config.getBroadcastTables());
+ ShardingStrategyConfiguration defaultDatabaseShardingStrategyConfig = null == config.getDefaultDatabaseShardingStrategy()
+ ? new NoneShardingStrategyConfiguration()
+ : config.getDefaultDatabaseShardingStrategy();
+ ShardingStrategyConfiguration defaultTableShardingStrategyConfig = null == config.getDefaultTableShardingStrategy()
+ ? new NoneShardingStrategyConfiguration()
+ : config.getDefaultTableShardingStrategy();
+ return isValidBindingTableConfiguration(tableRules, new BindingTableCheckedConfig(allDataSourceNames, shardingAlgorithms, config.getBindingTableGroups(), broadcastTables,
+ defaultDatabaseShardingStrategyConfig, defaultTableShardingStrategyConfig, config.getDefaultShardingColumn()));
}
private Map<String, Collection<DataNode>> createShardingTableDataNodes(final Map<String, TableRule> tableRules) {
@@ -176,18 +206,37 @@ public final class ShardingRule implements SchemaRule, DataNodeContainedRule, Ta
.collect(Collectors.toMap(each -> each.getLogicTable().toLowerCase(), Function.identity(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
}
+ private Map<String, TableRule> createTableRules(final Collection<ShardingTableRuleConfiguration> tableRuleConfigs, final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig,
+ final Collection<String> dataSourceNames) {
+ return tableRuleConfigs.stream().map(each -> new TableRule(each, dataSourceNames, getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig)))
+ .collect(Collectors.toMap(each -> each.getLogicTable().toLowerCase(), Function.identity(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+ }
+
private Map<String, TableRule> createAutoTableRules(final Collection<ShardingAutoTableRuleConfiguration> autoTableRuleConfigs,
final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
return autoTableRuleConfigs.stream().map(each -> createAutoTableRule(defaultKeyGenerateStrategyConfig, each))
.collect(Collectors.toMap(each -> each.getLogicTable().toLowerCase(), Function.identity(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
}
+ private Map<String, TableRule> createAutoTableRules(final Collection<ShardingAutoTableRuleConfiguration> autoTableRuleConfigs, final Map<String, ShardingAlgorithm> shardingAlgorithms,
+ final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig, final Collection<String> dataSourceNames) {
+ return autoTableRuleConfigs.stream().map(each -> createAutoTableRule(defaultKeyGenerateStrategyConfig, each, shardingAlgorithms, dataSourceNames))
+ .collect(Collectors.toMap(each -> each.getLogicTable().toLowerCase(), Function.identity(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+ }
+
private TableRule createAutoTableRule(final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig, final ShardingAutoTableRuleConfiguration autoTableRuleConfig) {
ShardingAlgorithm shardingAlgorithm = null == autoTableRuleConfig.getShardingStrategy() ? null : shardingAlgorithms.get(autoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName());
Preconditions.checkState(shardingAlgorithm instanceof ShardingAutoTableAlgorithm, "Sharding auto table rule configuration must match sharding auto table algorithm.");
return new TableRule(autoTableRuleConfig, dataSourceNames, (ShardingAutoTableAlgorithm) shardingAlgorithm, getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig));
}
+ private TableRule createAutoTableRule(final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig, final ShardingAutoTableRuleConfiguration autoTableRuleConfig,
+ final Map<String, ShardingAlgorithm> shardingAlgorithms, final Collection<String> dataSourceNames) {
+ ShardingAlgorithm shardingAlgorithm = null == autoTableRuleConfig.getShardingStrategy() ? null : shardingAlgorithms.get(autoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName());
+ Preconditions.checkState(shardingAlgorithm instanceof ShardingAutoTableAlgorithm, "Sharding auto table rule configuration must match sharding auto table algorithm.");
+ return new TableRule(autoTableRuleConfig, dataSourceNames, (ShardingAutoTableAlgorithm) shardingAlgorithm, getDefaultGenerateKeyColumn(defaultKeyGenerateStrategyConfig));
+ }
+
private String getDefaultGenerateKeyColumn(final KeyGenerateStrategyConfiguration defaultKeyGenerateStrategyConfig) {
return Optional.ofNullable(defaultKeyGenerateStrategyConfig).map(KeyGenerateStrategyConfiguration::getColumn).orElse(null);
}
@@ -217,21 +266,20 @@ public final class ShardingRule implements SchemaRule, DataNodeContainedRule, Ta
return result;
}
- private boolean isValidBindingTableConfiguration(final Collection<String> bindingTableGroups) {
- for (String each : bindingTableGroups) {
+ private boolean isValidBindingTableConfiguration(final Map<String, TableRule> tableRules, final BindingTableCheckedConfig checkedConfig) {
+ for (String each : checkedConfig.getBindingTableGroups()) {
Collection<String> bindingTables = Splitter.on(",").trimResults().splitToList(each.toLowerCase());
if (bindingTables.size() <= 1) {
continue;
}
Iterator<String> iterator = bindingTables.iterator();
- TableRule sampleTableRule = getTableRule(iterator.next());
+ TableRule sampleTableRule = getTableRule(iterator.next(), checkedConfig.getDataSourceNames(), tableRules, checkedConfig.getBroadcastTables());
while (iterator.hasNext()) {
- TableRule tableRule = getTableRule(iterator.next());
+ TableRule tableRule = getTableRule(iterator.next(), checkedConfig.getDataSourceNames(), tableRules, checkedConfig.getBroadcastTables());
if (!isValidActualDatasourceName(sampleTableRule, tableRule) || !isValidActualTableName(sampleTableRule, tableRule)) {
return false;
}
- if (!isValidShardingAlgorithm(sampleTableRule, tableRule, true)
- || !isValidShardingAlgorithm(sampleTableRule, tableRule, false)) {
+ if (!isValidShardingAlgorithm(sampleTableRule, tableRule, true, checkedConfig) || !isValidShardingAlgorithm(sampleTableRule, tableRule, false, checkedConfig)) {
return false;
}
}
@@ -256,24 +304,24 @@ public final class ShardingRule implements SchemaRule, DataNodeContainedRule, Ta
return true;
}
- private boolean isValidShardingAlgorithm(final TableRule sampleTableRule, final TableRule tableRule, final boolean databaseAlgorithm) {
- String sampleAlgorithmExpression = getAlgorithmExpression(sampleTableRule, databaseAlgorithm);
- String algorithmExpression = getAlgorithmExpression(tableRule, databaseAlgorithm);
+ private boolean isValidShardingAlgorithm(final TableRule sampleTableRule, final TableRule tableRule, final boolean databaseAlgorithm, final BindingTableCheckedConfig checkedConfig) {
+ String sampleAlgorithmExpression = getAlgorithmExpression(sampleTableRule, databaseAlgorithm, checkedConfig);
+ String algorithmExpression = getAlgorithmExpression(tableRule, databaseAlgorithm, checkedConfig);
return sampleAlgorithmExpression.equalsIgnoreCase(algorithmExpression);
}
- private String getAlgorithmExpression(final TableRule tableRule, final boolean databaseAlgorithm) {
+ private String getAlgorithmExpression(final TableRule tableRule, final boolean databaseAlgorithm, final BindingTableCheckedConfig checkedConfig) {
ShardingStrategyConfiguration shardingStrategyConfig = databaseAlgorithm
- ? null == tableRule.getDatabaseShardingStrategyConfig() ? defaultDatabaseShardingStrategyConfig : tableRule.getDatabaseShardingStrategyConfig()
- : null == tableRule.getTableShardingStrategyConfig() ? defaultTableShardingStrategyConfig : tableRule.getTableShardingStrategyConfig();
- ShardingAlgorithm shardingAlgorithm = shardingAlgorithms.get(shardingStrategyConfig.getShardingAlgorithmName());
+ ? null == tableRule.getDatabaseShardingStrategyConfig() ? checkedConfig.getDefaultDatabaseShardingStrategyConfig() : tableRule.getDatabaseShardingStrategyConfig()
+ : null == tableRule.getTableShardingStrategyConfig() ? checkedConfig.getDefaultTableShardingStrategyConfig() : tableRule.getTableShardingStrategyConfig();
+ ShardingAlgorithm shardingAlgorithm = checkedConfig.getShardingAlgorithms().get(shardingStrategyConfig.getShardingAlgorithmName());
String originAlgorithmExpression = null == shardingAlgorithm ? "" : shardingAlgorithm.getProps().getProperty("algorithm-expression", "");
String sampleDataNodePrefix = databaseAlgorithm ? tableRule.getDataSourceDataNode().getPrefix() : tableRule.getTableDataNode().getPrefix();
- String shardingColumn = getShardingColumn(shardingStrategyConfig);
+ String shardingColumn = getShardingColumn(shardingStrategyConfig, checkedConfig.getDefaultShardingColumn());
return originAlgorithmExpression.replace(sampleDataNodePrefix, "").replace(shardingColumn, "").replaceAll(" ", "");
}
- private String getShardingColumn(final ShardingStrategyConfiguration shardingStrategyConfig) {
+ private String getShardingColumn(final ShardingStrategyConfiguration shardingStrategyConfig, final String defaultShardingColumn) {
String shardingColumn = defaultShardingColumn;
if (shardingStrategyConfig instanceof ComplexShardingStrategyConfiguration) {
shardingColumn = ((ComplexShardingStrategyConfiguration) shardingStrategyConfig).getShardingColumns();
@@ -293,7 +341,7 @@ public final class ShardingRule implements SchemaRule, DataNodeContainedRule, Ta
/**
* Get database sharding strategy configuration.
- *
+ *
* @param tableRule table rule
* @return database sharding strategy configuration
*/
@@ -353,6 +401,17 @@ public final class ShardingRule implements SchemaRule, DataNodeContainedRule, Ta
throw new ShardingSphereConfigurationException("Cannot find table rule with logic table: '%s'", logicTableName);
}
+ private TableRule getTableRule(final String logicTableName, final Collection<String> dataSourceNames, final Map<String, TableRule> tableRules, final Collection<String> broadcastTables) {
+ TableRule result = tableRules.get(logicTableName);
+ if (null != result) {
+ return result;
+ }
+ if (broadcastTables.contains(logicTableName)) {
+ return new TableRule(dataSourceNames, logicTableName);
+ }
+ throw new ShardingSphereConfigurationException("Cannot find table rule with logic table: '%s'", logicTableName);
+ }
+
/**
* Judge whether logic table is all binding tables or not.
*
@@ -466,7 +525,7 @@ public final class ShardingRule implements SchemaRule, DataNodeContainedRule, Ta
/**
* Judge whether all tables are in same data source or not.
- *
+ *
* @param logicTableNames logic table names
* @return whether all tables are in same data source or not
*/
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/BindingTableCheckedConfig.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/BindingTableCheckedConfig.java
new file mode 100644
index 00000000000..2e909236a2d
--- /dev/null
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/BindingTableCheckedConfig.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sharding.distsql.handler.checker;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
+import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Binding table checked config.
+ */
+@Getter
+@AllArgsConstructor
+public final class BindingTableCheckedConfig {
+
+ private final Collection<String> dataSourceNames;
+
+ private final Map<String, ShardingAlgorithm> shardingAlgorithms;
+
+ private final Collection<String> bindingTableGroups;
+
+ private final Collection<String> broadcastTables;
+
+ private final ShardingStrategyConfiguration defaultDatabaseShardingStrategyConfig;
+
+ private final ShardingStrategyConfiguration defaultTableShardingStrategyConfig;
+
+ private final String defaultShardingColumn;
+}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
index 9fcdd4fbd0b..9b4adac474c 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
@@ -29,6 +29,8 @@ import org.apache.shardingsphere.infra.distsql.exception.rule.RequiredAlgorithmM
import org.apache.shardingsphere.infra.distsql.exception.rule.RequiredRuleMissedException;
import org.apache.shardingsphere.infra.expr.InlineExpressionParser;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.rule.identifier.type.CheckableRule;
import org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
@@ -44,7 +46,6 @@ import org.apache.shardingsphere.sharding.factory.ShardingAlgorithmFactory;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
@@ -239,11 +240,13 @@ public final class ShardingTableRuleStatementChecker {
/**
* Check binding table rules.
*
+ * @param database database
* @param currentRuleConfig current rule configuration
* @param toBeAlteredRuleConfig to be altered rule configuration
* @throws DistSQLException definition violation exception
*/
- public static void checkBindingTableRules(final ShardingRuleConfiguration currentRuleConfig, final ShardingRuleConfiguration toBeAlteredRuleConfig) throws DistSQLException {
+ public static void checkBindingTableRules(final ShardingSphereDatabase database, final ShardingRuleConfiguration currentRuleConfig,
+ final ShardingRuleConfiguration toBeAlteredRuleConfig) throws DistSQLException {
if (null == currentRuleConfig || currentRuleConfig.getBindingTableGroups().isEmpty()) {
return;
}
@@ -256,20 +259,44 @@ public final class ShardingTableRuleStatementChecker {
if (toBeAlteredBindingTableNames.isEmpty()) {
return;
}
- Map<String, String> currentBindingTableType = getBindingTablesType(bindingTables, currentRuleConfig);
- Map<String, String> toBeAlteredBindingTableType = getBindingTablesType(toBeAlteredBindingTableNames, toBeAlteredRuleConfig);
- Collection<String> invalidToBeAlteredBindingTableNames = toBeAlteredBindingTableNames.stream()
- .filter(each -> !currentBindingTableType.get(each).equalsIgnoreCase(toBeAlteredBindingTableType.get(each))).collect(Collectors.toSet());
- DistSQLException.predictionThrow(invalidToBeAlteredBindingTableNames.isEmpty(),
- () -> new InvalidRuleConfigurationException("sharding table", invalidToBeAlteredBindingTableNames, Collections.singleton("invalid binding table configuration")));
- // TODO check actualDataNodes
- // TODO check algorithm-expression
+ ShardingRuleConfiguration toBeCheckedRuleConfig = new ShardingRuleConfiguration();
+ toBeCheckedRuleConfig.setTables(currentRuleConfig.getTables());
+ toBeCheckedRuleConfig.setAutoTables(currentRuleConfig.getAutoTables());
+ toBeCheckedRuleConfig.setBindingTableGroups(currentRuleConfig.getBindingTableGroups());
+ toBeCheckedRuleConfig.setBroadcastTables(currentRuleConfig.getBroadcastTables());
+ toBeCheckedRuleConfig.setDefaultTableShardingStrategy(currentRuleConfig.getDefaultTableShardingStrategy());
+ toBeCheckedRuleConfig.setDefaultDatabaseShardingStrategy(currentRuleConfig.getDefaultDatabaseShardingStrategy());
+ toBeCheckedRuleConfig.setDefaultKeyGenerateStrategy(currentRuleConfig.getDefaultKeyGenerateStrategy());
+ toBeCheckedRuleConfig.setDefaultShardingColumn(currentRuleConfig.getDefaultShardingColumn());
+ toBeCheckedRuleConfig.setShardingAlgorithms(currentRuleConfig.getShardingAlgorithms());
+ toBeCheckedRuleConfig.setKeyGenerators(currentRuleConfig.getKeyGenerators());
+ toBeCheckedRuleConfig.setScalingName(currentRuleConfig.getScalingName());
+ toBeCheckedRuleConfig.setScaling(currentRuleConfig.getScaling());
+ removeRuleConfiguration(toBeCheckedRuleConfig, toBeAlteredRuleConfig);
+ addRuleConfiguration(toBeCheckedRuleConfig, toBeAlteredRuleConfig);
+ Collection<String> dataSourceNames = toBeCheckedRuleConfig.getRequiredResource();
+ dataSourceNames.addAll(toBeAlteredRuleConfig.getRequiredResource());
+ for (ShardingSphereRule each : database.getRuleMetaData().getRules()) {
+ if (each instanceof CheckableRule) {
+ DistSQLException.predictionThrow(((CheckableRule) each).check(toBeCheckedRuleConfig, dataSourceNames),
+ () -> new InvalidRuleConfigurationException("sharding table", toBeAlteredLogicTableNames, Collections.singleton("invalid binding table configuration")));
+ }
+ }
}
- private static Collection<String> getCurrentBindingTables(final ShardingRuleConfiguration currentRuleConfig) {
- Collection<String> result = new LinkedHashSet<>();
- currentRuleConfig.getBindingTableGroups().forEach(each -> result.addAll(Splitter.on(",").trimResults().splitToList(each)));
- return result;
+ private static void removeRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final ShardingRuleConfiguration toBeAlteredRuleConfig) {
+ Collection<String> toBeAlteredLogicTableNames = getAlteredLogicalTableNames(toBeAlteredRuleConfig);
+ toBeAlteredLogicTableNames.forEach(each -> {
+ currentRuleConfig.getTables().removeIf(table -> table.getLogicTable().equalsIgnoreCase(each));
+ currentRuleConfig.getAutoTables().removeIf(table -> table.getLogicTable().equalsIgnoreCase(each));
+ });
+ }
+
+ private static void addRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig, final ShardingRuleConfiguration toBeAlteredRuleConfig) {
+ currentRuleConfig.getTables().addAll(toBeAlteredRuleConfig.getTables());
+ currentRuleConfig.getAutoTables().addAll(toBeAlteredRuleConfig.getAutoTables());
+ currentRuleConfig.getShardingAlgorithms().putAll(toBeAlteredRuleConfig.getShardingAlgorithms());
+ currentRuleConfig.getKeyGenerators().putAll(toBeAlteredRuleConfig.getKeyGenerators());
}
private static Collection<String> getAlteredLogicalTableNames(final ShardingRuleConfiguration toBeAlteredRuleConfig) {
@@ -278,18 +305,9 @@ public final class ShardingTableRuleStatementChecker {
return result;
}
- private static Map<String, String> getBindingTablesType(final Collection<String> toBeAlteredBindingTableNames, final ShardingRuleConfiguration currentRuleConfig) {
- Map<String, String> result = new HashMap<>(toBeAlteredBindingTableNames.size(), 1);
- currentRuleConfig.getTables().forEach(each -> {
- if (toBeAlteredBindingTableNames.contains(each.getLogicTable())) {
- result.put(each.getLogicTable(), "tables");
- }
- });
- currentRuleConfig.getAutoTables().forEach(each -> {
- if (toBeAlteredBindingTableNames.contains(each.getLogicTable())) {
- result.put(each.getLogicTable(), "autoTables");
- }
- });
+ private static Collection<String> getCurrentBindingTables(final ShardingRuleConfiguration currentRuleConfig) {
+ Collection<String> result = new LinkedHashSet<>();
+ currentRuleConfig.getBindingTableGroups().forEach(each -> result.addAll(Splitter.on(",").trimResults().splitToList(each)));
return result;
}
}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingTableRuleStatementUpdater.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingTableRuleStatementUpdater.java
index 20d7a81ed7e..0507e035cee 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingTableRuleStatementUpdater.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingTableRuleStatementUpdater.java
@@ -41,7 +41,7 @@ public final class AlterShardingTableRuleStatementUpdater implements RuleDefinit
final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) throws DistSQLException {
DistSQLException.predictionThrow(null != currentRuleConfig, () -> new RequiredRuleMissedException("Sharding", database.getName()));
ShardingTableRuleStatementChecker.checkAlteration(database, sqlStatement.getRules(), currentRuleConfig);
- ShardingTableRuleStatementChecker.checkBindingTableRules(currentRuleConfig, buildToBeAlteredRuleConfiguration(sqlStatement));
+ ShardingTableRuleStatementChecker.checkBindingTableRules(database, currentRuleConfig, buildToBeAlteredRuleConfiguration(sqlStatement));
}
@Override
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/CheckableRule.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/CheckableRule.java
new file mode 100644
index 00000000000..71d2ced56cb
--- /dev/null
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/CheckableRule.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.rule.identifier.type;
+
+import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+
+import java.util.Collection;
+
+/**
+ * Checkable ShardingSphere rule.
+ */
+public interface CheckableRule extends ShardingSphereRule {
+
+ /**
+ * Check rule configuration.
+ *
+ * @param ruleConfig rule configuration
+ * @param dataSourceNames data source names
+ * @return is valid
+ */
+ boolean check(RuleConfiguration ruleConfig, Collection<String> dataSourceNames);
+}