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 <[email protected]>
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


Reply via email to