This is an automated email from the ASF dual-hosted git repository.
sunnianjun 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 07f7d69a186 Add RuleConfigurationChecker.getTableNames() (#30636)
07f7d69a186 is described below
commit 07f7d69a186bce1c72994bbb127b74f5e5323bf9
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Mar 25 17:00:16 2024 +0800
Add RuleConfigurationChecker.getTableNames() (#30636)
* Refactor RuleConfigurationCheckEngine
* Refactor RuleConfigurationCheckEngine
* Add RuleConfigurationChecker.getTableNames()
---
.../checker/EncryptRuleConfigurationChecker.java | 14 ++++-------
.../mask/checker/MaskRuleConfigurationChecker.java | 14 ++++-------
...ReadwriteSplittingRuleConfigurationChecker.java | 3 +--
.../checker/ShadowRuleConfigurationChecker.java | 10 --------
.../checker/ShardingRuleConfigurationChecker.java | 21 +++++++---------
.../rule/checker/RuleConfigurationCheckEngine.java | 28 +++++++++++++++++-----
.../rule/checker/RuleConfigurationChecker.java | 12 +++++++++-
.../YamlDatabaseConfigurationImportExecutor.java | 2 +-
8 files changed, 53 insertions(+), 51 deletions(-)
diff --git
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
index 4ea6481d65c..59d958a9ceb 100644
---
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
+++
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationChecker.java
@@ -32,14 +32,12 @@ import
org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
import
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import javax.sql.DataSource;
import java.util.Collection;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.stream.Collectors;
/**
@@ -58,16 +56,9 @@ public final class EncryptRuleConfigurationChecker
implements RuleConfigurationC
}
private void checkTables(final String databaseName, final
Collection<EncryptTableRuleConfiguration> tableRuleConfigs, final Map<String,
AlgorithmConfiguration> encryptors) {
- checkTablesNotDuplicated(databaseName, tableRuleConfigs);
tableRuleConfigs.forEach(each -> checkColumns(databaseName, each,
encryptors));
}
- private void checkTablesNotDuplicated(final String databaseName, final
Collection<EncryptTableRuleConfiguration> tableRuleConfigs) {
- Collection<String> duplicatedTables =
tableRuleConfigs.stream().map(EncryptTableRuleConfiguration::getName)
- .collect(Collectors.groupingBy(each -> each,
Collectors.counting())).entrySet().stream().filter(each -> each.getValue() >
1).map(Entry::getKey).collect(Collectors.toSet());
- ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), ()
-> new DuplicateRuleException("ENCRYPT", databaseName, duplicatedTables));
- }
-
private void checkColumns(final String databaseName, final
EncryptTableRuleConfiguration tableRuleConfig, final Map<String,
AlgorithmConfiguration> encryptors) {
for (EncryptColumnRuleConfiguration each :
tableRuleConfig.getColumns()) {
checkCipherColumn(databaseName, tableRuleConfig.getName(),
each.getName(), each.getCipher(), encryptors);
@@ -100,6 +91,11 @@ public final class EncryptRuleConfigurationChecker
implements RuleConfigurationC
() -> new UnregisteredEncryptorException(databaseName,
likeQueryColumnConfig.getEncryptorName()));
}
+ @Override
+ public Collection<String> getTableNames(final EncryptRuleConfiguration
ruleConfig) {
+ return
ruleConfig.getTables().stream().map(EncryptTableRuleConfiguration::getName).collect(Collectors.toList());
+ }
+
@Override
public int getOrder() {
return EncryptOrder.ORDER;
diff --git
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/checker/MaskRuleConfigurationChecker.java
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/checker/MaskRuleConfigurationChecker.java
index 74add9d483e..0b21d98b86d 100644
---
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/checker/MaskRuleConfigurationChecker.java
+++
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/checker/MaskRuleConfigurationChecker.java
@@ -21,7 +21,6 @@ import
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfigurat
import
org.apache.shardingsphere.infra.algorithm.core.exception.AlgorithmNotFoundOnColumnException;
import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mask.api.config.MaskRuleConfiguration;
@@ -33,7 +32,6 @@ import org.apache.shardingsphere.mask.spi.MaskAlgorithm;
import javax.sql.DataSource;
import java.util.Collection;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.stream.Collectors;
/**
@@ -52,16 +50,9 @@ public final class MaskRuleConfigurationChecker implements
RuleConfigurationChec
}
private void checkTables(final String databaseName, final
Collection<MaskTableRuleConfiguration> tables, final Map<String,
AlgorithmConfiguration> maskAlgorithms) {
- checkTablesNotDuplicated(databaseName, tables);
tables.forEach(each -> checkColumns(databaseName, each.getName(),
each.getColumns(), maskAlgorithms));
}
- private void checkTablesNotDuplicated(final String databaseName, final
Collection<MaskTableRuleConfiguration> tables) {
- Collection<String> duplicatedTables =
tables.stream().map(MaskTableRuleConfiguration::getName)
- .collect(Collectors.groupingBy(each -> each,
Collectors.counting())).entrySet().stream().filter(each -> each.getValue() >
1).map(Entry::getKey).collect(Collectors.toSet());
- ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), ()
-> new DuplicateRuleException("MASK", databaseName, duplicatedTables));
- }
-
private void checkColumns(final String databaseName, final String
tableName, final Collection<MaskColumnRuleConfiguration> columns, final
Map<String, AlgorithmConfiguration> maskAlgorithms) {
for (MaskColumnRuleConfiguration each : columns) {
ShardingSpherePreconditions.checkState(maskAlgorithms.containsKey(each.getMaskAlgorithm()),
@@ -69,6 +60,11 @@ public final class MaskRuleConfigurationChecker implements
RuleConfigurationChec
}
}
+ @Override
+ public Collection<String> getTableNames(final MaskRuleConfiguration
ruleConfig) {
+ return
ruleConfig.getTables().stream().map(MaskTableRuleConfiguration::getName).collect(Collectors.toList());
+ }
+
@Override
public int getOrder() {
return MaskOrder.ORDER;
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
index 8bb5bd43f9e..ae3eec00aea 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
@@ -50,8 +50,7 @@ public final class ReadwriteSplittingRuleConfigurationChecker
implements RuleCon
@Override
public void check(final String databaseName, final
ReadwriteSplittingRuleConfiguration ruleConfig, final Map<String, DataSource>
dataSourceMap, final Collection<ShardingSphereRule> builtRules) {
- Collection<ReadwriteSplittingDataSourceRuleConfiguration> configs =
ruleConfig.getDataSources();
- checkDataSources(databaseName, configs, dataSourceMap, builtRules);
+ checkDataSources(databaseName, ruleConfig.getDataSources(),
dataSourceMap, builtRules);
checkLoadBalancer(databaseName, ruleConfig);
}
diff --git
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationChecker.java
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationChecker.java
index ae58d08e91f..fb0b0e7af16 100644
---
a/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationChecker.java
+++
b/features/shadow/core/src/main/java/org/apache/shardingsphere/shadow/checker/ShadowRuleConfigurationChecker.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.shadow.checker;
import
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
@@ -40,7 +39,6 @@ import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
-import java.util.stream.Collectors;
/**
* Shadow rule configuration checker.
@@ -50,7 +48,6 @@ public final class ShadowRuleConfigurationChecker implements
RuleConfigurationCh
@Override
public void check(final String databaseName, final ShadowRuleConfiguration
ruleConfig, final Map<String, DataSource> dataSourceMap, final
Collection<ShardingSphereRule> builtRules) {
checkShadowAlgorithms(ruleConfig);
- checkTablesNotDuplicated(databaseName, ruleConfig);
Map<String, ShadowDataSourceConfiguration> dataSources =
initShadowDataSources(ruleConfig.getDataSources());
checkDataSources(dataSources, dataSourceMap, databaseName);
Map<String, ShadowTableConfiguration> shadowTables =
ruleConfig.getTables();
@@ -67,13 +64,6 @@ public final class ShadowRuleConfigurationChecker implements
RuleConfigurationCh
ruleConfig.getShadowAlgorithms().values().forEach(each ->
TypedSPILoader.checkService(ShadowAlgorithm.class, each.getType(),
each.getProps()));
}
- private void checkTablesNotDuplicated(final String databaseName, final
ShadowRuleConfiguration ruleConfig) {
- Collection<String> tableNames = ruleConfig.getTables().keySet();
- Collection<String> duplicatedTables =
tableNames.stream().collect(Collectors.groupingBy(each -> each,
Collectors.counting())).entrySet().stream()
- .filter(each -> each.getValue() >
1).map(Entry::getKey).collect(Collectors.toSet());
- ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), ()
-> new DuplicateRuleException("SHADOW", databaseName, duplicatedTables));
- }
-
private void checkDataSources(final Map<String,
ShadowDataSourceConfiguration> shadowDataSources, final Map<String, DataSource>
dataSourceMap, final String databaseName) {
Set<String> dataSourceName = dataSourceMap.keySet();
for (Entry<String, ShadowDataSourceConfiguration> entry :
shadowDataSources.entrySet()) {
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationChecker.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationChecker.java
index 85033fb5b36..953e82dd823 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationChecker.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/ShardingRuleConfigurationChecker.java
@@ -23,10 +23,9 @@ import
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfigurat
import
org.apache.shardingsphere.infra.algorithm.keygen.core.KeyGenerateAlgorithm;
import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChecker;
import org.apache.shardingsphere.infra.datanode.DataNode;
-import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
+import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
@@ -46,9 +45,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Objects;
-import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -80,7 +77,6 @@ public final class ShardingRuleConfigurationChecker
implements RuleConfiguration
private void checkTableConfiguration(final String databaseName, final
Collection<ShardingTableRuleConfiguration> tables, final
Collection<ShardingAutoTableRuleConfiguration> autoTables,
final Collection<String>
keyGenerators, final Collection<String> auditors, final Collection<String>
shardingAlgorithms) {
- checkTablesNotDuplicated(databaseName, tables, autoTables);
for (ShardingTableRuleConfiguration each : tables) {
checkLogicTable(databaseName, each.getLogicTable());
checkKeyGenerateStrategy(databaseName,
each.getKeyGenerateStrategy(), keyGenerators);
@@ -96,14 +92,6 @@ public final class ShardingRuleConfigurationChecker
implements RuleConfiguration
}
}
- private void checkTablesNotDuplicated(final String databaseName, final
Collection<ShardingTableRuleConfiguration> tables, final
Collection<ShardingAutoTableRuleConfiguration> autoTables) {
- Collection<String> logicTables =
tables.stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList());
-
logicTables.addAll(autoTables.stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
- Set<String> duplicatedLogicTables =
logicTables.stream().collect(Collectors.groupingBy(each -> each,
Collectors.counting())).entrySet().stream()
- .filter(each -> each.getValue() >
1).map(Entry::getKey).collect(Collectors.toSet());
-
ShardingSpherePreconditions.checkState(duplicatedLogicTables.isEmpty(), () ->
new DuplicateRuleException("sharding", databaseName, duplicatedLogicTables));
- }
-
private void checkLogicTable(final String databaseName, final String
logicTable) {
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(logicTable), ()
-> new MissingRequiredShardingConfigurationException("Sharding logic table",
databaseName));
}
@@ -155,6 +143,13 @@ public final class ShardingRuleConfigurationChecker
implements RuleConfiguration
return new
HashSet<>(InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate());
}
+ @Override
+ public Collection<String> getTableNames(final ShardingRuleConfiguration
ruleConfig) {
+ Collection<String> result =
ruleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList());
+
result.addAll(ruleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
+ return result;
+ }
+
@Override
public int getOrder() {
return ShardingOrder.ORDER;
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationCheckEngine.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationCheckEngine.java
index 1a7b8660c6a..0936a7cd452 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationCheckEngine.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationCheckEngine.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import org.apache.shardingsphere.infra.exception.rule.DuplicateRuleException;
import
org.apache.shardingsphere.infra.exception.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
@@ -40,20 +41,24 @@ import java.util.stream.Collectors;
public final class RuleConfigurationCheckEngine {
/**
- * Check rule.
+ * Check rule configuration.
*
- * @param ruleConfig rule configuration
+ * @param ruleConfig rule configuration to be checked
* @param database database
*/
@SuppressWarnings({"unchecked", "rawtypes"})
- public static void checkRule(final RuleConfiguration ruleConfig, final
ShardingSphereDatabase database) {
- RuleConfigurationChecker configChecker =
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class,
Collections.singleton(ruleConfig.getClass())).get(ruleConfig.getClass());
- Collection<String> requiredDataSourceNames =
configChecker.getRequiredDataSourceNames(ruleConfig);
+ public static void check(final RuleConfiguration ruleConfig, final
ShardingSphereDatabase database) {
+ RuleConfigurationChecker checker =
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class,
Collections.singleton(ruleConfig.getClass())).get(ruleConfig.getClass());
+ Collection<String> requiredDataSourceNames =
checker.getRequiredDataSourceNames(ruleConfig);
if (!requiredDataSourceNames.isEmpty()) {
checkDataSourcesExisted(database, requiredDataSourceNames);
}
+ Collection<String> tableNames = checker.getTableNames(ruleConfig);
+ if (!tableNames.isEmpty()) {
+ checkTablesNotDuplicated(ruleConfig, database.getName(),
tableNames);
+ }
Map<String, DataSource> dataSources =
database.getResourceMetaData().getStorageUnits().entrySet().stream().collect(Collectors.toMap(Entry::getKey,
entry -> entry.getValue().getDataSource()));
- configChecker.check(database.getName(), ruleConfig, dataSources,
database.getRuleMetaData().getRules());
+ checker.check(database.getName(), ruleConfig, dataSources,
database.getRuleMetaData().getRules());
}
private static void checkDataSourcesExisted(final ShardingSphereDatabase
database, final Collection<String> requiredDataSourceNames) {
@@ -63,4 +68,15 @@ public final class RuleConfigurationCheckEngine {
notExistedDataSources.removeIf(logicDataSources::contains);
ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () ->
new MissingRequiredStorageUnitsException(database.getName(),
notExistedDataSources));
}
+
+ private static void checkTablesNotDuplicated(final RuleConfiguration
ruleConfig, final String databaseName, final Collection<String> tableNames) {
+ Collection<String> duplicatedTables = tableNames.stream()
+ .collect(Collectors.groupingBy(each -> each,
Collectors.counting())).entrySet().stream().filter(each -> each.getValue() >
1).map(Entry::getKey).collect(Collectors.toSet());
+ ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), ()
-> new DuplicateRuleException(getRuleType(ruleConfig), databaseName,
duplicatedTables));
+ }
+
+ private static String getRuleType(final RuleConfiguration ruleConfig) {
+ String ruleConfigClassName = ruleConfig.getClass().getSimpleName();
+ return ruleConfigClassName.substring(0,
ruleConfigClassName.indexOf("RuleConfiguration"));
+ }
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationChecker.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationChecker.java
index ebd03cd97b9..3c78ae81466 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationChecker.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/rule/checker/RuleConfigurationChecker.java
@@ -51,7 +51,17 @@ public interface RuleConfigurationChecker<T extends
RuleConfiguration> extends O
* @param ruleConfig rule configuration
* @return required data source names
*/
- default Collection<String> getRequiredDataSourceNames(T ruleConfig) {
+ default Collection<String> getRequiredDataSourceNames(final T ruleConfig) {
+ return Collections.emptyList();
+ }
+
+ /**
+ * Get table names.
+ *
+ * @param ruleConfig rule configuration
+ * @return table names
+ */
+ default Collection<String> getTableNames(final T ruleConfig) {
return Collections.emptyList();
}
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index f21f94119d6..f7068df35fe 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -140,7 +140,7 @@ public final class YamlDatabaseConfigurationImportExecutor {
}
private void addRule(final Collection<RuleConfiguration> ruleConfigs,
final RuleConfiguration ruleConfig, final ShardingSphereDatabase database) {
- RuleConfigurationCheckEngine.checkRule(ruleConfig, database);
+ RuleConfigurationCheckEngine.check(ruleConfig, database);
ruleConfigs.add(ruleConfig);
database.getRuleMetaData().getRules().add(buildRule(ruleConfig,
database));
}