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 2023/02/07 12:47:57 UTC
[shardingsphere] branch master updated: Use SPI to introduce IndexReviser and ConstraintReviser (#24041)
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 9c36fab7a27 Use SPI to introduce IndexReviser and ConstraintReviser (#24041)
9c36fab7a27 is described below
commit 9c36fab7a27421fe92fd6341b1fcfb0367fb268d
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Tue Feb 7 20:47:48 2023 +0800
Use SPI to introduce IndexReviser and ConstraintReviser (#24041)
* Remove constructor param of TableNameReviser's impl
* Use SPI to introduce TableNameReviser
* Rename TableMetaDataReviseEngine
* For code format
* For checkstyle
* Simplify TableNameReviser
* Remove DefaultTableNameReviser
* Update format of sharding doc
* Refactor IndexReviseEngine and ConstraintReviseEngine
* Refactor IndexReviseEngine and ConstraintReviseEngine
* Use SPI to introduce IndexReviser and ConstraintReviser
---
.../java-api/rules/sharding.cn.md | 66 +++++++++++-----------
.../java-api/rules/sharding.en.md | 12 ++--
.../metadata/EncryptSchemaMetaDataDecorator.java | 3 +-
.../metadata/ShardingSchemaMetaDataDecorator.java | 5 +-
.../reviser/ShardingConstraintReviser.java | 23 ++++----
.../metadata/reviser/ShardingIndexReviser.java | 20 ++++---
...ase.schema.decorator.reviser.index.IndexReviser | 18 ++++++
.../reviser/constraint/ConstraintReviseEngine.java | 33 +++++------
.../reviser/constraint/ConstraintReviser.java | 9 ++-
.../decorator/reviser/index/IndexReviseEngine.java | 33 +++++------
.../decorator/reviser/index/IndexReviser.java | 9 ++-
.../reviser/table/TableMetaDataReviseEngine.java | 11 +---
.../metadata/SingleSchemaMetaDataDecorator.java | 5 +-
.../metadata/reviser/SingleConstraintReviser.java | 10 +++-
.../metadata/reviser/SingleIndexReviser.java | 10 +++-
...ase.schema.decorator.reviser.index.IndexReviser | 18 ++++++
16 files changed, 171 insertions(+), 114 deletions(-)
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/sharding.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/sharding.cn.md
index 55271b29f66..c67a77d4e4f 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/sharding.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/sharding.cn.md
@@ -15,20 +15,20 @@ weight = 1
可配置属性:
-| *名称* | *数据类型* | *说明* | *默认值* |
-|-------------------------------------| ------------------------------------------------ |--------------|-------|
-| tables (+) | Collection\<ShardingTableRuleConfiguration\> | 分片表规则列表 | - |
-| autoTables (+) | Collection\<ShardingAutoTableRuleConfiguration\> | 自动分片表规则列表 | - |
-| bindingTableGroups (*) | Collection\<String\> | 绑定表规则列表 | 无 |
-| broadcastTables (*) | Collection\<String\> | 广播表规则列表 | 无 |
-| defaultDatabaseShardingStrategy (?) | ShardingStrategyConfiguration | 默认分库策略 | 不分片 |
-| defaultTableShardingStrategy (?) | ShardingStrategyConfiguration | 默认分表策略 | 不分片 |
-| defaultKeyGenerateStrategy (?) | KeyGeneratorConfiguration | 默认自增列生成器配置 | 雪花算法 |
-| defaultAuditStrategy (?) | ShardingAuditStrategyConfiguration | 默认分片审计策略配置 | 强制分片键 |
-| defaultShardingColumn (?) | String | 默认分片列名称 | 无 |
-| shardingAlgorithms (+) | Map\<String, AlgorithmConfiguration\> | 分片算法名称和配置 | 无 |
-| keyGenerators (?) | Map\<String, AlgorithmConfiguration\> | 自增列生成算法名称和配置 | 无 |
-| auditors (?) | Map\<String, AlgorithmConfiguration\> | 分片审计算法名称和配置 | 无 |
+| *名称* | *数据类型* | *说明* | *默认值* |
+| ----------------------------------- | ------------------------------------------------ | ------------------ | ------- |
+| tables (+) | Collection\<ShardingTableRuleConfiguration\> | 分片表规则列表 | - |
+| autoTables (+) | Collection\<ShardingAutoTableRuleConfiguration\> | 自动分片表规则列表 | - |
+| bindingTableGroups (*) | Collection\<String\> | 绑定表规则列表 | 无 |
+| broadcastTables (*) | Collection\<String\> | 广播表规则列表 | 无 |
+| defaultDatabaseShardingStrategy (?) | ShardingStrategyConfiguration | 默认分库策略 | 不分片 |
+| defaultTableShardingStrategy (?) | ShardingStrategyConfiguration | 默认分表策略 | 不分片 |
+| defaultKeyGenerateStrategy (?) | KeyGeneratorConfiguration | 默认自增列生成器配置 | 雪花算法 |
+| defaultAuditStrategy (?) | ShardingAuditStrategyConfiguration | 默认分片审计策略配置 | 强制分片键 |
+| defaultShardingColumn (?) | String | 默认分片列名称 | 无 |
+| shardingAlgorithms (+) | Map\<String, AlgorithmConfiguration\> | 分片算法名称和配置 | 无 |
+| keyGenerators (?) | Map\<String, AlgorithmConfiguration\> | 自增列生成算法名称和配置 | 无 |
+| auditors (?) | Map\<String, AlgorithmConfiguration\> | 分片审计算法名称和配置 | 无 |
### 分片表配置
@@ -36,14 +36,14 @@ weight = 1
可配置属性:
-| *名称* | *数据类型* | *说明* | *默认值* |
-|------------------------------|------------------------------------|-------------------------------------------|-------------------------------------------------|
-| logicTable | String | 分片逻辑表名称 | - |
+| *名称* | *数据类型* | *说明* | *默认值* |
+| ---------------------------- | ---------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
+| logicTable | String | 分片逻辑表名称 | - |
| actualDataNodes (?) | String | 由数据源名 + 表名组成,以小数点分隔。<br />多个表以逗号分隔,支持行表达式 | 使用已知数据源与逻辑表名称生成数据节点,用于广播表或只分库不分表且所有库的表结构完全一致的情况 |
-| databaseShardingStrategy (?) | ShardingStrategyConfiguration | 分库策略 | 使用默认分库策略 |
-| tableShardingStrategy (?) | ShardingStrategyConfiguration | 分表策略 | 使用默认分表策略 |
-| keyGenerateStrategy (?) | KeyGeneratorConfiguration | 自增列生成器 | 使用默认自增主键生成器 |
-| auditStrategy (?) | ShardingAuditStrategyConfiguration | 分片审计策略 | 使用默认分片审计策略 |
+| databaseShardingStrategy (?) | ShardingStrategyConfiguration | 分库策略 | 使用默认分库策略 |
+| tableShardingStrategy (?) | ShardingStrategyConfiguration | 分表策略 | 使用默认分表策略 |
+| keyGenerateStrategy (?) | KeyGeneratorConfiguration | 自增列生成器 | 使用默认自增主键生成器 |
+| auditStrategy (?) | ShardingAuditStrategyConfiguration | 分片审计策略 | 使用默认分片审计策略 |
### 自动分片表配置
@@ -51,13 +51,13 @@ weight = 1
可配置属性:
-| *名称* | *数据类型* | *说明* | *默认值* |
-| ----------------------- |------------------------------------|---------------------| ------------------ |
-| logicTable | String | 分片逻辑表名称 | - |
-| actualDataSources (?) | String | 数据源名称,多个数据源以逗号分隔 | 使用全部配置的数据源 |
-| shardingStrategy (?) | ShardingStrategyConfiguration | 分片策略 | 使用默认分片策略 |
-| keyGenerateStrategy (?) | KeyGeneratorConfiguration | 自增列生成器 | 使用默认自增主键生成器 |
-| auditStrategy (?) | ShardingAuditStrategyConfiguration | 分片审计策略 | 使用默认分片审计策略 |
+| *名称* | *数据类型* | *说明* | *默认值* |
+| ----------------------- | ---------------------------------- | -------------------------- | ------------------ |
+| logicTable | String | 分片逻辑表名称 | - |
+| actualDataSources (?) | String | 数据源名称,多个数据源以逗号分隔 | 使用全部配置的数据源 |
+| shardingStrategy (?) | ShardingStrategyConfiguration | 分片策略 | 使用默认分片策略 |
+| keyGenerateStrategy (?) | KeyGeneratorConfiguration | 自增列生成器 | 使用默认自增主键生成器 |
+| auditStrategy (?) | ShardingAuditStrategyConfiguration | 分片审计策略 | 使用默认分片审计策略 |
### 分片策略配置
@@ -78,7 +78,7 @@ weight = 1
可配置属性:
-| *名称* | *数据类型* | *说明* |
+| *名称* | *数据类型* | *说明* |
| --------------------- | ---------- | ----------------------- |
| shardingColumns | String | 分片列名称,多个列以逗号分隔 |
| shardingAlgorithmName | String | 分片算法名称 |
@@ -107,7 +107,7 @@ weight = 1
可配置属性:
-| *名称* | *数据类型* | *说明* |
+| *名称* | *数据类型* | *说明* |
| ---------------- | -------- | --------------- |
| column | String | 分布式序列列名称 |
| keyGeneratorName | String | 分布式序列算法名称 |
@@ -120,9 +120,9 @@ weight = 1
可配置属性:
-| *名称* | *数据类型* | *说明* |
-|-------------------|----------------------|-----------|
-| auditorNames | Collection\<String\> | 分片审计算法名称 |
+| *名称* | *数据类型* | *说明* |
+| ----------------- | -------------------- | ----------------- |
+| auditorNames | Collection\<String\> | 分片审计算法名称 |
| allowHintDisable | Boolean | 是否禁用分片审计hint |
算法类型的详情,请参见[内置分片审计列算法列表](/cn/user-manual/common-config/builtin-algorithm/audit)。
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/sharding.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/sharding.en.md
index 619a8fd104c..ee91d79025a 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/sharding.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/sharding.en.md
@@ -16,7 +16,7 @@ Class name: org.apache.shardingsphere.sharding.api.config.ShardingRuleConfigurat
Attributes:
| *Name* | *DataType* | *Description* | *Default Value* |
-| ----------------------------------- | ------------------------------------------------ |--------------------------------------------------|-------------------------|
+| ----------------------------------- | ------------------------------------------------ | ------------------------------------------------ | ----------------------- |
| tables (+) | Collection\<ShardingTableRuleConfiguration\> | Sharding table rules | - |
| autoTables (+) | Collection\<ShardingAutoTableRuleConfiguration\> | Sharding auto table rules | - |
| bindingTableGroups (*) | Collection\<String\> | Binding table rules | Empty |
@@ -37,7 +37,7 @@ Class name: org.apache.shardingsphere.sharding.api.config.ShardingTableRuleConfi
Attributes:
| *Name* | *DataType* | *Description* | *Default Value* |
-| ---------------------------- |------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------|
+| ---------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| logicTable | String | Name of sharding logic table | - |
| actualDataNodes (?) | String | Describe data source names and actual tables, delimiter as point.<br /> Multiple data nodes split by comma, support inline expression | Broadcast table or databases sharding only |
| databaseShardingStrategy (?) | ShardingStrategyConfiguration | Databases sharding strategy | Use default databases sharding strategy |
@@ -119,10 +119,10 @@ Class name:org.apache.shardingsphere.sharding.api.config.strategy.audit.Shardi
Attributes:
-| *Name* | *DataType* | *Description* |
-|------------------|-----------------------|----------------------------------------|
-| auditorNames | Collection\<String\> | Sharding audit algorithm name |
-| allowHintDisable | Boolean | Enable or disable sharding audit hint |
+| *Name* | *DataType* | *Description* |
+| ---------------- | --------------------- | ------------------------------------- |
+| auditorNames | Collection\<String\> | Sharding audit algorithm name |
+| allowHintDisable | Boolean | Enable or disable sharding audit hint |
Please refer to [Built-in Sharding Audit Algorithm List](/en/user-manual/common-config/builtin-algorithm/audit) for more details about type of algorithm.
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
index 0642971df18..890f59b7691 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
@@ -54,8 +54,7 @@ public final class EncryptSchemaMetaDataDecorator implements RuleBasedSchemaMeta
}
private TableMetaData decorate(final String tableName, final TableMetaData tableMetaData, final EncryptRule encryptRule) {
- return encryptRule.findEncryptTable(tableName).map(optional -> new TableMetaDataReviseEngine<>(encryptRule)
- .revise(tableMetaData, getColumnRevisers(optional), Collections.emptyList(), Collections.emptyList())).orElse(tableMetaData);
+ return encryptRule.findEncryptTable(tableName).map(optional -> new TableMetaDataReviseEngine<>(encryptRule).revise(tableMetaData, getColumnRevisers(optional))).orElse(tableMetaData);
}
private Collection<ColumnReviser> getColumnRevisers(final EncryptTable encryptTable) {
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
index 5e40ea3d174..d19f781aaa6 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
@@ -27,8 +27,6 @@ import org.apache.shardingsphere.infra.util.exception.ShardingSpherePrecondition
import org.apache.shardingsphere.sharding.constant.ShardingOrder;
import org.apache.shardingsphere.sharding.exception.metadata.InconsistentShardingTableMetaDataException;
import org.apache.shardingsphere.sharding.metadata.reviser.ShardingColumnGeneratedReviser;
-import org.apache.shardingsphere.sharding.metadata.reviser.ShardingConstraintReviser;
-import org.apache.shardingsphere.sharding.metadata.reviser.ShardingIndexReviser;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sharding.rule.TableRule;
@@ -67,8 +65,7 @@ public final class ShardingSchemaMetaDataDecorator implements RuleBasedSchemaMet
}
private TableMetaData createTableMetaData(final ShardingRule rule, final TableRule tableRule, final TableMetaData tableMetaData) {
- return new TableMetaDataReviseEngine<>(rule).revise(tableMetaData, Collections.singleton(new ShardingColumnGeneratedReviser(tableRule)),
- Collections.singleton(new ShardingIndexReviser(tableRule)), Collections.singleton(new ShardingConstraintReviser(rule, tableRule)));
+ return new TableMetaDataReviseEngine<>(rule).revise(tableMetaData, Collections.singleton(new ShardingColumnGeneratedReviser(tableRule)));
}
private Map<String, Collection<TableMetaData>> getLogicTableMetaDataMap(final SchemaMetaData schemaMetaData, final ShardingRule rule) {
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingConstraintReviser.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingConstraintReviser.java
index 738ad91c975..b7b97a9c1cc 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingConstraintReviser.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingConstraintReviser.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.sharding.metadata.reviser;
-import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.datanode.DataNode;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint.ConstraintReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
@@ -29,20 +28,19 @@ import java.util.Optional;
/**
* Sharding constraint reviser.
*/
-@RequiredArgsConstructor
-public final class ShardingConstraintReviser implements ConstraintReviser {
-
- private final ShardingRule shardingRule;
-
- private final TableRule tableRule;
+public final class ShardingConstraintReviser implements ConstraintReviser<ShardingRule> {
@Override
- public Optional<ConstraintMetaData> revise(final String tableName, final ConstraintMetaData originalMetaData) {
- for (DataNode each : tableRule.getActualDataNodes()) {
+ public Optional<ConstraintMetaData> revise(final String tableName, final ConstraintMetaData originalMetaData, final ShardingRule rule) {
+ Optional<TableRule> tableRule = rule.findTableRuleByActualTable(tableName);
+ if (!tableRule.isPresent()) {
+ return Optional.of(originalMetaData);
+ }
+ for (DataNode each : tableRule.get().getActualDataNodes()) {
String referencedTableName = originalMetaData.getReferencedTableName();
Optional<String> logicIndexName = getLogicIndex(originalMetaData.getName(), each.getTableName());
if (logicIndexName.isPresent()) {
- return Optional.of(new ConstraintMetaData(logicIndexName.get(), shardingRule.findLogicTableByActualTable(referencedTableName).orElse(referencedTableName)));
+ return Optional.of(new ConstraintMetaData(logicIndexName.get(), rule.findLogicTableByActualTable(referencedTableName).orElse(referencedTableName)));
}
}
return Optional.empty();
@@ -52,4 +50,9 @@ public final class ShardingConstraintReviser implements ConstraintReviser {
String indexNameSuffix = "_" + actualTableName;
return actualIndexName.endsWith(indexNameSuffix) ? Optional.of(actualIndexName.replace(indexNameSuffix, "")) : Optional.empty();
}
+
+ @Override
+ public String getType() {
+ return ShardingRule.class.getSimpleName();
+ }
}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingIndexReviser.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingIndexReviser.java
index 73198371902..db127f0aaff 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingIndexReviser.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingIndexReviser.java
@@ -17,10 +17,10 @@
package org.apache.shardingsphere.sharding.metadata.reviser;
-import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.datanode.DataNode;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sharding.rule.TableRule;
import java.util.Optional;
@@ -28,14 +28,15 @@ import java.util.Optional;
/**
* Sharding index reviser.
*/
-@RequiredArgsConstructor
-public final class ShardingIndexReviser implements IndexReviser {
-
- private final TableRule tableRule;
+public final class ShardingIndexReviser implements IndexReviser<ShardingRule> {
@Override
- public Optional<IndexMetaData> revise(final String tableName, final IndexMetaData originalMetaData) {
- for (DataNode each : tableRule.getActualDataNodes()) {
+ public Optional<IndexMetaData> revise(final String tableName, final IndexMetaData originalMetaData, final ShardingRule rule) {
+ Optional<TableRule> tableRule = rule.findTableRuleByActualTable(tableName);
+ if (!tableRule.isPresent()) {
+ return Optional.of(originalMetaData);
+ }
+ for (DataNode each : tableRule.get().getActualDataNodes()) {
Optional<String> logicIndexName = getLogicIndex(originalMetaData.getName(), each.getTableName());
if (logicIndexName.isPresent()) {
return Optional.of(new IndexMetaData(logicIndexName.get()));
@@ -48,4 +49,9 @@ public final class ShardingIndexReviser implements IndexReviser {
String indexNameSuffix = "_" + actualTableName;
return actualIndexName.endsWith(indexNameSuffix) ? Optional.of(actualIndexName.replace(indexNameSuffix, "")) : Optional.empty();
}
+
+ @Override
+ public String getType() {
+ return ShardingRule.class.getSimpleName();
+ }
}
diff --git a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser
new file mode 100644
index 00000000000..8e91d45dbbf
--- /dev/null
+++ b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.sharding.metadata.reviser.ShardingIndexReviser
\ No newline at end of file
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviseEngine.java
index ff0720c52f8..cb2ab23afe8 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviseEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviseEngine.java
@@ -18,38 +18,39 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Optional;
-import java.util.stream.Collectors;
/**
* Constraint revise engine.
+ *
+ * @param <T> type of rule
*/
-public final class ConstraintReviseEngine {
+public final class ConstraintReviseEngine<T extends ShardingSphereRule> {
/**
* Revise constraint meta data.
*
* @param tableName table name
* @param originalMetaDataList original constraint meta data list
- * @param revisers constraint revisers
+ * @param rule rule
* @return revised constraint meta data
*/
- public Collection<ConstraintMetaData> revise(final String tableName, final Collection<ConstraintMetaData> originalMetaDataList, final Collection<ConstraintReviser> revisers) {
- return originalMetaDataList.stream().map(each -> revise(tableName, each, revisers)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toCollection(LinkedHashSet::new));
- }
-
- private Optional<ConstraintMetaData> revise(final String tableName, final ConstraintMetaData originalMetaData, final Collection<ConstraintReviser> revisers) {
- ConstraintMetaData result = originalMetaData;
- for (ConstraintReviser each : revisers) {
- Optional<ConstraintMetaData> revisedMetaData = each.revise(tableName, result);
- if (!revisedMetaData.isPresent()) {
- return Optional.empty();
- }
- result = revisedMetaData.get();
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public Collection<ConstraintMetaData> revise(final String tableName, final Collection<ConstraintMetaData> originalMetaDataList, final T rule) {
+ Optional<ConstraintReviser> reviser = TypedSPILoader.findService(ConstraintReviser.class, rule.getClass().getSimpleName());
+ if (!reviser.isPresent()) {
+ return originalMetaDataList;
+ }
+ Collection<ConstraintMetaData> result = new LinkedHashSet<>();
+ for (ConstraintMetaData each : originalMetaDataList) {
+ Optional<ConstraintMetaData> constraintMetaData = reviser.get().revise(tableName, each, rule);
+ constraintMetaData.ifPresent(result::add);
}
- return Optional.of(result);
+ return result;
}
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviser.java
index f01fedf2fe9..d47ff180ddb 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviser.java
@@ -18,20 +18,25 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
import java.util.Optional;
/**
* Constraint reviser.
+ *
+ * @param <T> type of rule
*/
-public interface ConstraintReviser {
+public interface ConstraintReviser<T extends ShardingSphereRule> extends TypedSPI {
/**
* Revise constraint meta data.
*
* @param tableName table name
* @param originalMetaData original constraint meta data
+ * @param rule rule
* @return revised constraint meta data
*/
- Optional<ConstraintMetaData> revise(String tableName, ConstraintMetaData originalMetaData);
+ Optional<ConstraintMetaData> revise(String tableName, ConstraintMetaData originalMetaData, T rule);
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviseEngine.java
index 545d42fdd5b..88d0188334b 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviseEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviseEngine.java
@@ -18,38 +18,39 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Optional;
-import java.util.stream.Collectors;
/**
* Index revise engine.
+ *
+ * @param <T> type of rule
*/
-public final class IndexReviseEngine {
+public final class IndexReviseEngine<T extends ShardingSphereRule> {
/**
* Revise index meta data.
*
* @param tableName table name
* @param originalMetaDataList original index meta data list
- * @param revisers index revisers
+ * @param rule rule
* @return revised index meta data
*/
- public Collection<IndexMetaData> revise(final String tableName, final Collection<IndexMetaData> originalMetaDataList, final Collection<IndexReviser> revisers) {
- return originalMetaDataList.stream().map(each -> revise(tableName, each, revisers)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toCollection(LinkedHashSet::new));
- }
-
- private Optional<IndexMetaData> revise(final String tableName, final IndexMetaData originalMetaData, final Collection<IndexReviser> revisers) {
- IndexMetaData result = originalMetaData;
- for (IndexReviser each : revisers) {
- Optional<IndexMetaData> revisedMetaData = each.revise(tableName, result);
- if (!revisedMetaData.isPresent()) {
- return Optional.empty();
- }
- result = revisedMetaData.get();
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ public Collection<IndexMetaData> revise(final String tableName, final Collection<IndexMetaData> originalMetaDataList, final T rule) {
+ Optional<IndexReviser> reviser = TypedSPILoader.findService(IndexReviser.class, rule.getClass().getSimpleName());
+ if (!reviser.isPresent()) {
+ return originalMetaDataList;
+ }
+ Collection<IndexMetaData> result = new LinkedHashSet<>();
+ for (IndexMetaData each : originalMetaDataList) {
+ Optional<IndexMetaData> indexMetaData = reviser.get().revise(tableName, each, rule);
+ indexMetaData.ifPresent(result::add);
}
- return Optional.of(result);
+ return result;
}
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviser.java
index bead54b588d..4868e3675f6 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviser.java
@@ -18,20 +18,25 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
import java.util.Optional;
/**
* Index reviser.
+ *
+ * @param <T> type of rule
*/
-public interface IndexReviser {
+public interface IndexReviser<T extends ShardingSphereRule> extends TypedSPI {
/**
* Revise index meta data.
*
* @param tableName table name
* @param originalMetaData original index meta data
+ * @param rule rule
* @return revised index meta data
*/
- Optional<IndexMetaData> revise(String tableName, IndexMetaData originalMetaData);
+ Optional<IndexMetaData> revise(String tableName, IndexMetaData originalMetaData, T rule);
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java
index bc2b17e86fc..b9cf1c002e2 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java
@@ -21,9 +21,7 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnReviseEngine;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint.ConstraintReviseEngine;
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint.ConstraintReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviseEngine;
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
@@ -45,17 +43,14 @@ public final class TableMetaDataReviseEngine<T extends ShardingSphereRule> {
*
* @param originalMetaData original table meta data
* @param columnRevisers column revisers
- * @param indexRevisers index revisers
- * @param constraintRevisers constraint revisers
* @return revised table meta data
*/
@SuppressWarnings("unchecked")
- public TableMetaData revise(final TableMetaData originalMetaData,
- final Collection<ColumnReviser> columnRevisers, final Collection<IndexReviser> indexRevisers, final Collection<ConstraintReviser> constraintRevisers) {
+ public TableMetaData revise(final TableMetaData originalMetaData, final Collection<ColumnReviser> columnRevisers) {
String revisedTableName = TypedSPILoader.findService(TableNameReviser.class, rule.getClass().getSimpleName())
.map(optional -> optional.revise(originalMetaData.getName(), rule)).orElse(originalMetaData.getName());
return new TableMetaData(revisedTableName, new ColumnReviseEngine().revise(originalMetaData.getColumns(), columnRevisers),
- new IndexReviseEngine().revise(revisedTableName, originalMetaData.getIndexes(), indexRevisers),
- new ConstraintReviseEngine().revise(revisedTableName, originalMetaData.getConstrains(), constraintRevisers));
+ new IndexReviseEngine<T>().revise(revisedTableName, originalMetaData.getIndexes(), rule),
+ new ConstraintReviseEngine<T>().revise(revisedTableName, originalMetaData.getConstrains(), rule));
}
}
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/SingleSchemaMetaDataDecorator.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/SingleSchemaMetaDataDecorator.java
index 3599d6d1a31..30851d09b35 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/SingleSchemaMetaDataDecorator.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/SingleSchemaMetaDataDecorator.java
@@ -23,8 +23,6 @@ import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.Ru
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
import org.apache.shardingsphere.single.constant.SingleOrder;
-import org.apache.shardingsphere.single.metadata.reviser.SingleConstraintReviser;
-import org.apache.shardingsphere.single.metadata.reviser.SingleIndexReviser;
import org.apache.shardingsphere.single.rule.SingleRule;
import java.util.Collection;
@@ -53,8 +51,7 @@ public final class SingleSchemaMetaDataDecorator implements RuleBasedSchemaMetaD
}
private TableMetaData decorate(final SingleRule rule, final TableMetaData tableMetaData) {
- return new TableMetaDataReviseEngine<>(rule).revise(
- tableMetaData, Collections.emptyList(), Collections.singleton(new SingleIndexReviser()), Collections.singleton(new SingleConstraintReviser()));
+ return new TableMetaDataReviseEngine<>(rule).revise(tableMetaData, Collections.emptyList());
}
@Override
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleConstraintReviser.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleConstraintReviser.java
index aaa7f75525e..975a8e96321 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleConstraintReviser.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleConstraintReviser.java
@@ -20,16 +20,22 @@ package org.apache.shardingsphere.single.metadata.reviser;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint.ConstraintReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtil;
+import org.apache.shardingsphere.single.rule.SingleRule;
import java.util.Optional;
/**
* Single constraint reviser.
*/
-public final class SingleConstraintReviser implements ConstraintReviser {
+public final class SingleConstraintReviser implements ConstraintReviser<SingleRule> {
@Override
- public Optional<ConstraintMetaData> revise(final String tableName, final ConstraintMetaData originalMetaData) {
+ public Optional<ConstraintMetaData> revise(final String tableName, final ConstraintMetaData originalMetaData, final SingleRule rule) {
return Optional.of(new ConstraintMetaData(IndexMetaDataUtil.getLogicIndexName(originalMetaData.getName(), tableName), originalMetaData.getReferencedTableName()));
}
+
+ @Override
+ public String getType() {
+ return SingleRule.class.getSimpleName();
+ }
}
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleIndexReviser.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleIndexReviser.java
index e24f00f0f61..58f1b64dab1 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleIndexReviser.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleIndexReviser.java
@@ -20,16 +20,22 @@ package org.apache.shardingsphere.single.metadata.reviser;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
import org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtil;
+import org.apache.shardingsphere.single.rule.SingleRule;
import java.util.Optional;
/**
* Single index reviser.
*/
-public final class SingleIndexReviser implements IndexReviser {
+public final class SingleIndexReviser implements IndexReviser<SingleRule> {
@Override
- public Optional<IndexMetaData> revise(final String tableName, final IndexMetaData originalMetaData) {
+ public Optional<IndexMetaData> revise(final String tableName, final IndexMetaData originalMetaData, final SingleRule singleRule) {
return Optional.of(new IndexMetaData(IndexMetaDataUtil.getLogicIndexName(originalMetaData.getName(), tableName)));
}
+
+ @Override
+ public String getType() {
+ return SingleRule.class.getSimpleName();
+ }
}
diff --git a/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser
new file mode 100644
index 00000000000..10c6bd237d0
--- /dev/null
+++ b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.single.metadata.reviser.SingleIndexReviser