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