You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/02/08 11:31:25 UTC

[shardingsphere] branch master updated: Add TableMetaDataReviseEntry to instead of all reviser SPIs (#24060)

This is an automated email from the ASF dual-hosted git repository.

zhonghongsheng 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 ab9547b3213 Add TableMetaDataReviseEntry to instead of all reviser SPIs (#24060)
ab9547b3213 is described below

commit ab9547b32132d5c3918c0879e87b749a486af686
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Wed Feb 8 19:31:10 2023 +0800

    Add TableMetaDataReviseEntry to instead of all reviser SPIs (#24060)
    
    * Refactor ColumnDataTypeReviser
    
    * Add TableMetaDataReviseEntry to instead of all reviser SPIs
    
    * Add TableMetaDataReviseEntry to instead of all reviser SPIs
    
    * Refactor EncryptColumnNameReviser
    
    * Refactor ConstraintReviseEngine and IndexReviseEngine
    
    * Refactor ShardingColumnGeneratedReviser
    
    * Refactor TableMetaDataReviseEntry
---
 .../metadata/reviser/EncryptColumnNameReviser.java |  33 ++++---
 .../reviser/EncryptTableMetaDataReviseEntry.java}  |  19 ++--
 ....schema.decorator.spi.TableMetaDataReviseEntry} |   2 +-
 .../reviser/ShardingColumnGeneratedReviser.java    |  13 ++-
 .../reviser/ShardingConstraintReviser.java         |  15 +--
 .../metadata/reviser/ShardingIndexReviser.java     |  15 +--
 ....java => ShardingTableMetaDataReviseEntry.java} |  28 ++++--
 .../metadata/reviser/ShardingTableNameReviser.java |   5 -
 ...ase.schema.decorator.reviser.index.IndexReviser |  18 ----
 ....schema.decorator.spi.TableMetaDataReviseEntry} |   2 +-
 .../reviser/column/ColumnDataTypeReviser.java      |   3 +-
 .../reviser/column/ColumnGeneratedReviser.java     |   5 +-
 .../reviser/column/ColumnNameReviser.java          |   5 +-
 .../reviser/column/ColumnReviseEngine.java         |  17 ++--
 .../reviser/constraint/ConstraintReviseEngine.java |  28 +++---
 .../reviser/constraint/ConstraintReviser.java      |   5 +-
 .../decorator/reviser/index/IndexReviseEngine.java |  28 +++---
 .../decorator/reviser/index/IndexReviser.java      |   5 +-
 .../reviser/table/TableMetaDataReviseEngine.java   |  20 ++--
 .../decorator/reviser/table/TableNameReviser.java  |   5 +-
 .../decorator/spi/TableMetaDataReviseEntry.java    | 101 +++++++++++++++++++++
 .../metadata/reviser/SingleConstraintReviser.java  |   5 -
 .../metadata/reviser/SingleIndexReviser.java       |   5 -
 ...er.java => SingleTableMetaDataReviseEntry.java} |  17 ++--
 ...ase.schema.decorator.reviser.index.IndexReviser |  18 ----
 ...e.schema.decorator.spi.TableMetaDataReviseEntry |   2 +-
 26 files changed, 234 insertions(+), 185 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptColumnNameReviser.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptColumnNameReviser.java
index 08f1f5657f0..75b85c931fb 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptColumnNameReviser.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptColumnNameReviser.java
@@ -29,29 +29,32 @@ import java.util.Optional;
  */
 public final class EncryptColumnNameReviser implements ColumnNameReviser<EncryptRule> {
     
+    private final EncryptTable encryptTable;
+    
+    private final Collection<String> plainColumns;
+    
+    private final Collection<String> assistedQueryColumns;
+    
+    private final Collection<String> likeQueryColumns;
+    
+    public EncryptColumnNameReviser(final EncryptTable encryptTable) {
+        this.encryptTable = encryptTable;
+        plainColumns = encryptTable.getPlainColumns();
+        assistedQueryColumns = encryptTable.getAssistedQueryColumns();
+        likeQueryColumns = encryptTable.getLikeQueryColumns();
+    }
+    
     @Override
     public Optional<String> revise(final String originalName, final String tableName, final EncryptRule rule) {
-        Optional<EncryptTable> encryptTable = rule.findEncryptTable(tableName);
-        if (!encryptTable.isPresent()) {
-            return Optional.of(originalName);
-        }
-        Collection<String> plainColumns = encryptTable.get().getPlainColumns();
-        Collection<String> assistedQueryColumns = encryptTable.get().getAssistedQueryColumns();
-        Collection<String> likeQueryColumns = encryptTable.get().getLikeQueryColumns();
         if (plainColumns.contains(originalName)) {
-            return Optional.of(encryptTable.get().getLogicColumnByPlainColumn(originalName));
+            return Optional.of(encryptTable.getLogicColumnByPlainColumn(originalName));
         }
-        if (encryptTable.get().isCipherColumn(originalName)) {
-            return Optional.of(encryptTable.get().getLogicColumnByCipherColumn(originalName));
+        if (encryptTable.isCipherColumn(originalName)) {
+            return Optional.of(encryptTable.getLogicColumnByCipherColumn(originalName));
         }
         if (!assistedQueryColumns.contains(originalName) && !likeQueryColumns.contains(originalName)) {
             return Optional.of(originalName);
         }
         return Optional.empty();
     }
-    
-    @Override
-    public String getType() {
-        return EncryptRule.class.getSimpleName();
-    }
 }
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptTableMetaDataReviseEntry.java
similarity index 62%
copy from features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java
copy to features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptTableMetaDataReviseEntry.java
index 8dac6ff9b35..21f44d2f2d7 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptTableMetaDataReviseEntry.java
@@ -15,24 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sharding.metadata.reviser;
+package org.apache.shardingsphere.encrypt.metadata.reviser;
 
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableNameReviser;
-import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.sharding.rule.TableRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
+
+import java.util.Optional;
 
 /**
- * Sharding table name reviser.
+ * Encrypt table meta data revise entry.
  */
-public final class ShardingTableNameReviser implements TableNameReviser<ShardingRule> {
+public final class EncryptTableMetaDataReviseEntry implements TableMetaDataReviseEntry<EncryptRule> {
     
     @Override
-    public String revise(final String originalName, final ShardingRule rule) {
-        return rule.findTableRuleByActualTable(originalName).map(TableRule::getLogicTable).orElse(originalName);
+    public Optional<EncryptColumnNameReviser> getColumnNameReviser(final EncryptRule rule, final String tableName) {
+        return rule.findEncryptTable(tableName).map(EncryptColumnNameReviser::new);
     }
     
     @Override
     public String getType() {
-        return ShardingRule.class.getSimpleName();
+        return EncryptRule.class.getSimpleName();
     }
 }
diff --git a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser b/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
similarity index 90%
rename from features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser
rename to features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
index 8d31e51bc1a..7c6ab16861d 100644
--- a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser
+++ b/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.sharding.metadata.reviser.ShardingColumnGeneratedReviser
+org.apache.shardingsphere.encrypt.metadata.reviser.EncryptTableMetaDataReviseEntry
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingColumnGeneratedReviser.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingColumnGeneratedReviser.java
index a3b50f0f6e5..0516aaa759f 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingColumnGeneratedReviser.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingColumnGeneratedReviser.java
@@ -17,23 +17,22 @@
 
 package org.apache.shardingsphere.sharding.metadata.reviser;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import org.apache.shardingsphere.sharding.rule.TableRule;
 
 /**
  * Sharding column generated reviser.
  */
+@RequiredArgsConstructor
 public final class ShardingColumnGeneratedReviser implements ColumnGeneratedReviser<ShardingRule> {
     
-    @Override
-    public boolean revise(final ColumnMetaData originalMetaData, final ShardingRule rule) {
-        return rule.findTableRuleByActualTable(originalMetaData.getName())
-                .map(optional -> originalMetaData.getName().equalsIgnoreCase(optional.getGenerateKeyColumn().orElse(null))).orElseGet(originalMetaData::isGenerated);
-    }
+    private final TableRule tableRule;
     
     @Override
-    public String getType() {
-        return ShardingRule.class.getSimpleName();
+    public boolean revise(final ColumnMetaData originalMetaData, final ShardingRule rule) {
+        return originalMetaData.getName().equalsIgnoreCase(tableRule.getGenerateKeyColumn().orElse(null));
     }
 }
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 b7b97a9c1cc..d7d19f98927 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,6 +17,7 @@
 
 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;
@@ -28,15 +29,14 @@ import java.util.Optional;
 /**
  * Sharding constraint reviser.
  */
+@RequiredArgsConstructor
 public final class ShardingConstraintReviser implements ConstraintReviser<ShardingRule> {
     
+    private final TableRule tableRule;
+    
     @Override
     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()) {
+        for (DataNode each : tableRule.getActualDataNodes()) {
             String referencedTableName = originalMetaData.getReferencedTableName();
             Optional<String> logicIndexName = getLogicIndex(originalMetaData.getName(), each.getTableName());
             if (logicIndexName.isPresent()) {
@@ -50,9 +50,4 @@ public final class ShardingConstraintReviser implements ConstraintReviser<Shardi
         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 db127f0aaff..54145a4e996 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,6 +17,7 @@
 
 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;
@@ -28,15 +29,14 @@ import java.util.Optional;
 /**
  * Sharding index reviser.
  */
+@RequiredArgsConstructor
 public final class ShardingIndexReviser implements IndexReviser<ShardingRule> {
     
+    private final TableRule tableRule;
+    
     @Override
     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()) {
+        for (DataNode each : tableRule.getActualDataNodes()) {
             Optional<String> logicIndexName = getLogicIndex(originalMetaData.getName(), each.getTableName());
             if (logicIndexName.isPresent()) {
                 return Optional.of(new IndexMetaData(logicIndexName.get()));
@@ -49,9 +49,4 @@ public final class ShardingIndexReviser implements IndexReviser<ShardingRule> {
         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/ShardingTableNameReviser.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableMetaDataReviseEntry.java
similarity index 51%
copy from features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java
copy to features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableMetaDataReviseEntry.java
index 8dac6ff9b35..810f8bbd623 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableMetaDataReviseEntry.java
@@ -17,18 +17,34 @@
 
 package org.apache.shardingsphere.sharding.metadata.reviser;
 
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableNameReviser;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.sharding.rule.TableRule;
+
+import java.util.Optional;
 
 /**
- * Sharding table name reviser.
+ * Sharding table meta data revise entry.
  */
-public final class ShardingTableNameReviser implements TableNameReviser<ShardingRule> {
+public final class ShardingTableMetaDataReviseEntry implements TableMetaDataReviseEntry<ShardingRule> {
+    
+    @Override
+    public Optional<ShardingTableNameReviser> getTableNameReviser() {
+        return Optional.of(new ShardingTableNameReviser());
+    }
+    
+    @Override
+    public Optional<ShardingColumnGeneratedReviser> getColumnGeneratedReviser(final ShardingRule rule, final String tableName) {
+        return rule.findTableRuleByActualTable(tableName).map(ShardingColumnGeneratedReviser::new);
+    }
+    
+    @Override
+    public Optional<ShardingIndexReviser> getIndexReviser(final ShardingRule rule, final String tableName) {
+        return rule.findTableRuleByActualTable(tableName).map(ShardingIndexReviser::new);
+    }
     
     @Override
-    public String revise(final String originalName, final ShardingRule rule) {
-        return rule.findTableRuleByActualTable(originalName).map(TableRule::getLogicTable).orElse(originalName);
+    public Optional<ShardingConstraintReviser> getConstraintReviser(final ShardingRule rule, final String tableName) {
+        return rule.findTableRuleByActualTable(tableName).map(ShardingConstraintReviser::new);
     }
     
     @Override
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java
index 8dac6ff9b35..a0f6263bb34 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableNameReviser.java
@@ -30,9 +30,4 @@ public final class ShardingTableNameReviser implements TableNameReviser<Sharding
     public String revise(final String originalName, final ShardingRule rule) {
         return rule.findTableRuleByActualTable(originalName).map(TableRule::getLogicTable).orElse(originalName);
     }
-    
-    @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
deleted file mode 100644
index 8e91d45dbbf..00000000000
--- a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# 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/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableNameReviser b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
similarity index 97%
rename from features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableNameReviser
rename to features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
index ead2ca3caca..680c4d4c6d9 100644
--- a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableNameReviser
+++ b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.sharding.metadata.reviser.ShardingTableNameReviser
+org.apache.shardingsphere.sharding.metadata.reviser.ShardingTableMetaDataReviseEntry
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
index 5489b103057..042794944d5 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.infra.metadata.database.schema.decorator.revis
 
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
 
 import javax.sql.DataSource;
 import java.util.Optional;
@@ -29,7 +28,7 @@ import java.util.Optional;
  *
  * @param <T> type of rule
  */
-public interface ColumnDataTypeReviser<T extends ShardingSphereRule> extends TypedSPI {
+public interface ColumnDataTypeReviser<T extends ShardingSphereRule> {
     
     /**
      * Revise column data type.
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnGeneratedReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnGeneratedReviser.java
index 3e013b7cf02..df9f8a59863 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnGeneratedReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnGeneratedReviser.java
@@ -19,16 +19,13 @@ package org.apache.shardingsphere.infra.metadata.database.schema.decorator.revis
 
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
 
 /**
  * Column generated reviser.
  * 
  * @param <T> type of rule
  */
-@SingletonSPI
-public interface ColumnGeneratedReviser<T extends ShardingSphereRule> extends TypedSPI {
+public interface ColumnGeneratedReviser<T extends ShardingSphereRule> {
     
     /**
      * Revise generated column.
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnNameReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnNameReviser.java
index 1108e4ceddc..ae2469bd905 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnNameReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnNameReviser.java
@@ -18,8 +18,6 @@
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
 
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
 
 import java.util.Optional;
 
@@ -28,8 +26,7 @@ import java.util.Optional;
  * 
  * @param <T> type of rule
  */
-@SingletonSPI
-public interface ColumnNameReviser<T extends ShardingSphereRule> extends TypedSPI {
+public interface ColumnNameReviser<T extends ShardingSphereRule> {
     
     /**
      * Revise column name.
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviseEngine.java
index 545283e55aa..fcabcc2aa37 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviseEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviseEngine.java
@@ -19,9 +19,9 @@ package org.apache.shardingsphere.infra.metadata.database.schema.decorator.revis
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 
 import javax.sql.DataSource;
 import java.util.Collection;
@@ -42,6 +42,8 @@ public final class ColumnReviseEngine<T extends ShardingSphereRule> {
     
     private final DataSource dataSource;
     
+    private final TableMetaDataReviseEntry<T> reviseEntry;
+    
     /**
      * Revise column meta data.
      * 
@@ -50,23 +52,16 @@ public final class ColumnReviseEngine<T extends ShardingSphereRule> {
      * @return revised column meta data
      */
     public Collection<ColumnMetaData> revise(final String tableName, final Collection<ColumnMetaData> originalMetaDataList) {
-        String type = rule.getClass().getSimpleName();
-        @SuppressWarnings("rawtypes")
-        Optional<ColumnNameReviser> nameReviser = TypedSPILoader.findService(ColumnNameReviser.class, type);
-        @SuppressWarnings("rawtypes")
-        Optional<ColumnDataTypeReviser> dataTypeReviser = TypedSPILoader.findService(ColumnDataTypeReviser.class, type);
-        @SuppressWarnings("rawtypes")
-        Optional<ColumnGeneratedReviser> generatedReviser = TypedSPILoader.findService(ColumnGeneratedReviser.class, type);
+        Optional<? extends ColumnNameReviser<T>> nameReviser = reviseEntry.getColumnNameReviser(rule, tableName);
+        Optional<? extends ColumnDataTypeReviser<T>> dataTypeReviser = reviseEntry.getColumnDataTypeReviser(rule, tableName);
+        Optional<? extends ColumnGeneratedReviser<T>> generatedReviser = reviseEntry.getColumnGeneratedReviser(rule, tableName);
         Collection<ColumnMetaData> result = new LinkedHashSet<>();
         for (ColumnMetaData each : originalMetaDataList) {
-            @SuppressWarnings("unchecked")
             Optional<String> name = nameReviser.isPresent() ? nameReviser.get().revise(each.getName(), tableName, rule) : Optional.of(each.getName());
             if (!name.isPresent()) {
                 continue;
             }
-            @SuppressWarnings("unchecked")
             Optional<Integer> dataType = dataTypeReviser.isPresent() ? dataTypeReviser.get().revise(each.getName(), tableName, rule, databaseType, dataSource) : Optional.empty();
-            @SuppressWarnings("unchecked")
             Optional<Boolean> generated = generatedReviser.map(optional -> optional.revise(each, rule));
             result.add(new ColumnMetaData(name.get(),
                     dataType.orElseGet(each::getDataType), each.isPrimaryKey(), generated.orElse(each.isGenerated()), each.isCaseSensitive(), each.isVisible(), each.isUnsigned()));
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 cb2ab23afe8..c06fa00bdc6 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
@@ -17,40 +17,40 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint;
 
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
 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
  */
+@RequiredArgsConstructor
 public final class ConstraintReviseEngine<T extends ShardingSphereRule> {
     
+    private final T rule;
+    
+    private final TableMetaDataReviseEntry<T> reviseEntry;
+    
     /**
      * Revise constraint meta data.
      * 
      * @param tableName table name
      * @param originalMetaDataList original constraint meta data list
-     * @param rule rule
      * @return revised constraint meta data
      */
-    @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 result;
+    public Collection<ConstraintMetaData> revise(final String tableName, final Collection<ConstraintMetaData> originalMetaDataList) {
+        Optional<? extends ConstraintReviser<T>> reviser = reviseEntry.getConstraintReviser(rule, tableName);
+        return reviser.isPresent()
+                ? originalMetaDataList.stream()
+                        .map(each -> reviser.get().revise(tableName, each, rule)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toCollection(LinkedHashSet::new))
+                : originalMetaDataList;
     }
 }
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 0e2ab344360..36a7f9f6526 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
@@ -19,8 +19,6 @@ package org.apache.shardingsphere.infra.metadata.database.schema.decorator.revis
 
 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.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
 
 import java.util.Optional;
 
@@ -29,8 +27,7 @@ import java.util.Optional;
  * 
  * @param <T> type of rule
  */
-@SingletonSPI
-public interface ConstraintReviser<T extends ShardingSphereRule> extends TypedSPI {
+public interface ConstraintReviser<T extends ShardingSphereRule> {
     
     /**
      * Revise constraint meta data.
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 88d0188334b..e3186412362 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
@@ -17,40 +17,40 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index;
 
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
 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
  */
+@RequiredArgsConstructor
 public final class IndexReviseEngine<T extends ShardingSphereRule> {
     
+    private final T rule;
+    
+    private final TableMetaDataReviseEntry<T> reviseEntry;
+    
     /**
      * Revise index meta data.
      * 
      * @param tableName table name
      * @param originalMetaDataList original index meta data list
-     * @param rule rule
      * @return revised index meta data
      */
-    @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 result;
+    public Collection<IndexMetaData> revise(final String tableName, final Collection<IndexMetaData> originalMetaDataList) {
+        Optional<? extends IndexReviser<T>> reviser = reviseEntry.getIndexReviser(rule, tableName);
+        return reviser.isPresent()
+                ? originalMetaDataList.stream()
+                        .map(each -> reviser.get().revise(tableName, each, rule)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toCollection(LinkedHashSet::new))
+                : originalMetaDataList;
     }
 }
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 2852dcadfc6..4880c9af68d 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
@@ -19,8 +19,6 @@ package org.apache.shardingsphere.infra.metadata.database.schema.decorator.revis
 
 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.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
 
 import java.util.Optional;
 
@@ -29,8 +27,7 @@ import java.util.Optional;
  * 
  * @param <T> type of rule
  */
-@SingletonSPI
-public interface IndexReviser<T extends ShardingSphereRule> extends TypedSPI {
+public interface IndexReviser<T extends ShardingSphereRule> {
     
     /**
      * Revise index meta data.
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 7f368da195f..ade5a624f77 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
@@ -22,11 +22,13 @@ import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnReviseEngine;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint.ConstraintReviseEngine;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviseEngine;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
 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;
 
 import javax.sql.DataSource;
+import java.util.Optional;
 
 /**
  * Table meta data revise engine.
@@ -44,16 +46,22 @@ public final class TableMetaDataReviseEngine<T extends ShardingSphereRule> {
     
     /**
      * Revise table meta data.
-     * 
+     *
      * @param originalMetaData original table meta data
      * @return revised table meta data
      */
     @SuppressWarnings("unchecked")
     public TableMetaData revise(final TableMetaData originalMetaData) {
-        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<>(rule, databaseType, dataSource).revise(originalMetaData.getName(), originalMetaData.getColumns()),
-                new IndexReviseEngine<>().revise(revisedTableName, originalMetaData.getIndexes(), rule),
-                new ConstraintReviseEngine<>().revise(revisedTableName, originalMetaData.getConstrains(), rule));
+        @SuppressWarnings("rawtypes")
+        Optional<TableMetaDataReviseEntry> reviseEntry = TypedSPILoader.findService(TableMetaDataReviseEntry.class, rule.getClass().getSimpleName());
+        return reviseEntry.map(optional -> revise(originalMetaData, optional)).orElse(originalMetaData);
+    }
+    
+    private TableMetaData revise(final TableMetaData originalMetaData, final TableMetaDataReviseEntry<T> reviseEntry) {
+        Optional<? extends TableNameReviser<T>> tableNameReviser = reviseEntry.getTableNameReviser();
+        String revisedTableName = tableNameReviser.map(optional -> optional.revise(originalMetaData.getName(), rule)).orElse(originalMetaData.getName());
+        return new TableMetaData(revisedTableName, new ColumnReviseEngine<>(rule, databaseType, dataSource, reviseEntry).revise(originalMetaData.getName(), originalMetaData.getColumns()),
+                new IndexReviseEngine<>(rule, reviseEntry).revise(revisedTableName, originalMetaData.getIndexes()),
+                new ConstraintReviseEngine<>(rule, reviseEntry).revise(revisedTableName, originalMetaData.getConstrains()));
     }
 }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableNameReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableNameReviser.java
index 267c88d41d5..1ee8e73f907 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableNameReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableNameReviser.java
@@ -18,16 +18,13 @@
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table;
 
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
-import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
 
 /**
  * Table name reviser.
  * 
  * @param <T> type of rule
  */
-@SingletonSPI
-public interface TableNameReviser<T extends ShardingSphereRule> extends TypedSPI {
+public interface TableNameReviser<T extends ShardingSphereRule> {
     
     /**
      * Revise table meta data.
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/spi/TableMetaDataReviseEntry.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/spi/TableMetaDataReviseEntry.java
new file mode 100644
index 00000000000..9138232191a
--- /dev/null
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/spi/TableMetaDataReviseEntry.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi;
+
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnDataTypeReviser;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint.ConstraintReviser;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableNameReviser;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
+
+import java.util.Optional;
+
+/**
+ * Table name revise entry.
+ * 
+ * @param <T> type of rule
+ */
+public interface TableMetaDataReviseEntry<T extends ShardingSphereRule> extends TypedSPI {
+    
+    /**
+     * Get table name reviser.
+     * 
+     * @return table name reviser
+     */
+    default Optional<? extends TableNameReviser<T>> getTableNameReviser() {
+        return Optional.empty();
+    }
+    
+    /**
+     * Get column name reviser.
+     * 
+     * @param rule rule
+     * @param tableName table name
+     * @return column name reviser
+     */
+    default Optional<? extends ColumnNameReviser<T>> getColumnNameReviser(final T rule, final String tableName) {
+        return Optional.empty();
+    }
+    
+    /**
+     * Get column data type reviser.
+     *
+     * @param rule rule
+     * @param tableName table name
+     * @return column data type reviser
+     */
+    default Optional<? extends ColumnDataTypeReviser<T>> getColumnDataTypeReviser(final T rule, final String tableName) {
+        return Optional.empty();
+    }
+    
+    /**
+     * Get column generated reviser.
+     *
+     * @param rule rule
+     * @param tableName table name
+     * @return column generated reviser
+     */
+    default Optional<? extends ColumnGeneratedReviser<T>> getColumnGeneratedReviser(final T rule, final String tableName) {
+        return Optional.empty();
+    }
+    
+    /**
+     * Get index reviser.
+     *
+     * @param rule rule
+     * @param tableName table name
+     * @return index reviser
+     */
+    default Optional<? extends IndexReviser<T>> getIndexReviser(final T rule, final String tableName) {
+        return Optional.empty();
+    }
+    
+    /**
+     * Get constraint reviser.
+     *
+     * @param rule rule
+     * @param tableName table name
+     * @return constraint reviser
+     */
+    default Optional<? extends ConstraintReviser<T>> getConstraintReviser(final T rule, final String tableName) {
+        return Optional.empty();
+    }
+}
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 975a8e96321..bc343362948 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
@@ -33,9 +33,4 @@ public final class SingleConstraintReviser implements ConstraintReviser<SingleRu
     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 58f1b64dab1..feab783b632 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
@@ -33,9 +33,4 @@ public final class SingleIndexReviser implements IndexReviser<SingleRule> {
     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/java/org/apache/shardingsphere/single/metadata/reviser/SingleIndexReviser.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleTableMetaDataReviseEntry.java
similarity index 66%
copy from kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleIndexReviser.java
copy to kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleTableMetaDataReviseEntry.java
index 58f1b64dab1..626fb9b9992 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/SingleTableMetaDataReviseEntry.java
@@ -17,21 +17,24 @@
 
 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.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
 import org.apache.shardingsphere.single.rule.SingleRule;
 
 import java.util.Optional;
 
 /**
- * Single index reviser.
+ * Single table meta data revise entry.
  */
-public final class SingleIndexReviser implements IndexReviser<SingleRule> {
+public final class SingleTableMetaDataReviseEntry implements TableMetaDataReviseEntry<SingleRule> {
     
     @Override
-    public Optional<IndexMetaData> revise(final String tableName, final IndexMetaData originalMetaData, final SingleRule singleRule) {
-        return Optional.of(new IndexMetaData(IndexMetaDataUtil.getLogicIndexName(originalMetaData.getName(), tableName)));
+    public Optional<SingleIndexReviser> getIndexReviser(final SingleRule rule, final String tableName) {
+        return Optional.of(new SingleIndexReviser());
+    }
+    
+    @Override
+    public Optional<SingleConstraintReviser> getConstraintReviser(final SingleRule rule, final String tableName) {
+        return Optional.of(new SingleConstraintReviser());
     }
     
     @Override
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
deleted file mode 100644
index 10c6bd237d0..00000000000
--- a/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviser
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# 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
diff --git a/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
similarity index 90%
rename from features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser
rename to kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
index 3c6af3f2ad5..aa936b0634a 100644
--- a/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser
+++ b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.encrypt.metadata.reviser.EncryptColumnNameReviser
+org.apache.shardingsphere.single.metadata.reviser.SingleTableMetaDataReviseEntry