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

[shardingsphere] branch master updated: Use SPI to introduce ColumnReviser (#24051)

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

sunnianjun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new b8efe992af3 Use SPI to introduce ColumnReviser (#24051)
b8efe992af3 is described below

commit b8efe992af335973c1b904fa6b31cee8dfbae792
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Wed Feb 8 02:11:05 2023 +0800

    Use SPI to introduce ColumnReviser (#24051)
    
    * Use SPI to introduce ColumnReviser
    
    * Use SPI to introduce ColumnReviser
---
 .../metadata/EncryptSchemaMetaDataDecorator.java   | 16 +++----
 .../metadata/reviser/EncryptColumnNameReviser.java | 38 ++++++++--------
 ...hema.decorator.reviser.column.ColumnNameReviser | 18 ++++++++
 .../metadata/ShardingSchemaMetaDataDecorator.java  | 22 +++++----
 .../reviser/ShardingColumnGeneratedReviser.java    | 16 ++++---
 ...decorator.reviser.column.ColumnGeneratedReviser | 18 ++++++++
 ...lumnReviser.java => ColumnDataTypeReviser.java} | 22 ++++++---
 .../reviser/column/ColumnGeneratedReviser.java     | 28 ++++++------
 .../reviser/column/ColumnNameReviser.java          | 28 +++++++-----
 .../reviser/column/ColumnReviseEngine.java         | 52 +++++++++++++++-------
 .../reviser/constraint/ConstraintReviser.java      |  2 +
 .../decorator/reviser/index/IndexReviser.java      |  2 +
 .../reviser/table/TableMetaDataReviseEngine.java   | 17 ++++---
 .../decorator/reviser/table/TableNameReviser.java  |  2 +
 .../metadata/SingleSchemaMetaDataDecorator.java    |  9 ++--
 15 files changed, 182 insertions(+), 108 deletions(-)

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 890f59b7691..163c2311640 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
@@ -18,18 +18,16 @@
 package org.apache.shardingsphere.encrypt.metadata;
 
 import org.apache.shardingsphere.encrypt.constant.EncryptOrder;
-import org.apache.shardingsphere.encrypt.metadata.reviser.EncryptColumnNameReviser;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
-import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnReviser;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableMetaDataReviseEngine;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.RuleBasedSchemaMetaDataDecorator;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
 
+import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
@@ -46,19 +44,15 @@ public final class EncryptSchemaMetaDataDecorator implements RuleBasedSchemaMeta
         for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
             Collection<TableMetaData> tables = new LinkedList<>();
             for (TableMetaData each : entry.getValue().getTables()) {
-                tables.add(decorate(each.getName(), each, rule));
+                tables.add(decorate(each.getName(), each, rule, material.getStorageTypes().get(entry.getKey()), material.getDataSourceMap().get(entry.getKey())));
             }
             result.put(entry.getKey(), new SchemaMetaData(entry.getKey(), tables));
         }
         return result;
     }
     
-    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))).orElse(tableMetaData);
-    }
-    
-    private Collection<ColumnReviser> getColumnRevisers(final EncryptTable encryptTable) {
-        return Collections.singleton(new EncryptColumnNameReviser(encryptTable));
+    private TableMetaData decorate(final String tableName, final TableMetaData tableMetaData, final EncryptRule encryptRule, final DatabaseType databaseType, final DataSource dataSource) {
+        return encryptRule.findEncryptTable(tableName).map(optional -> new TableMetaDataReviseEngine<>(encryptRule, databaseType, dataSource).revise(tableMetaData)).orElse(tableMetaData);
     }
     
     @Override
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 82d6e719075..08f1f5657f0 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.encrypt.metadata.reviser;
 
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser;
 
@@ -26,34 +27,31 @@ import java.util.Optional;
 /**
  * Encrypt column name reviser.
  */
-public final class EncryptColumnNameReviser extends ColumnNameReviser {
-    
-    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();
-    }
+public final class EncryptColumnNameReviser implements ColumnNameReviser<EncryptRule> {
     
     @Override
-    protected Optional<String> getColumnName(final String originalName) {
+    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.getLogicColumnByPlainColumn(originalName));
+            return Optional.of(encryptTable.get().getLogicColumnByPlainColumn(originalName));
         }
-        if (encryptTable.isCipherColumn(originalName)) {
-            return Optional.of(encryptTable.getLogicColumnByCipherColumn(originalName));
+        if (encryptTable.get().isCipherColumn(originalName)) {
+            return Optional.of(encryptTable.get().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/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser b/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser
new file mode 100644
index 00000000000..3c6af3f2ad5
--- /dev/null
+++ b/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser
@@ -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.encrypt.metadata.reviser.EncryptColumnNameReviser
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 d19f781aaa6..9853b2e1099 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
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.sharding.metadata;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableMetaDataReviseEngine;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.RuleBasedSchemaMetaDataDecorator;
@@ -26,12 +27,10 @@ import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.Tab
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 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.rule.ShardingRule;
-import org.apache.shardingsphere.sharding.rule.TableRule;
 
+import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
@@ -49,7 +48,8 @@ public final class ShardingSchemaMetaDataDecorator implements RuleBasedSchemaMet
         boolean checkTableMetaDataEnabled = material.getProps().getValue(ConfigurationPropertyKey.CHECK_TABLE_META_DATA_ENABLED);
         for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
             Collection<TableMetaData> tables = new LinkedList<>();
-            for (Entry<String, Collection<TableMetaData>> tableEntry : getLogicTableMetaDataMap(entry.getValue(), rule).entrySet()) {
+            for (Entry<String, Collection<TableMetaData>> tableEntry : getLogicTableMetaDataMap(entry.getValue(), rule,
+                    material.getStorageTypes().get(entry.getKey()), material.getDataSourceMap().get(entry.getKey())).entrySet()) {
                 if (checkTableMetaDataEnabled) {
                     checkUniformed(tableEntry.getKey(), tableEntry.getValue());
                 }
@@ -60,19 +60,17 @@ public final class ShardingSchemaMetaDataDecorator implements RuleBasedSchemaMet
         return result;
     }
     
-    private TableMetaData decorate(final TableMetaData tableMetaData, final ShardingRule rule) {
-        return rule.findTableRuleByActualTable(tableMetaData.getName()).map(optional -> createTableMetaData(rule, optional, tableMetaData)).orElse(tableMetaData);
+    private TableMetaData decorate(final TableMetaData tableMetaData, final ShardingRule rule, final DatabaseType databaseType, final DataSource dataSource) {
+        return rule.findTableRuleByActualTable(tableMetaData.getName())
+                .map(optional -> new TableMetaDataReviseEngine<>(rule, databaseType, dataSource).revise(tableMetaData)).orElse(tableMetaData);
     }
     
-    private TableMetaData createTableMetaData(final ShardingRule rule, final TableRule tableRule, final TableMetaData tableMetaData) {
-        return new TableMetaDataReviseEngine<>(rule).revise(tableMetaData, Collections.singleton(new ShardingColumnGeneratedReviser(tableRule)));
-    }
-    
-    private Map<String, Collection<TableMetaData>> getLogicTableMetaDataMap(final SchemaMetaData schemaMetaData, final ShardingRule rule) {
+    private Map<String, Collection<TableMetaData>> getLogicTableMetaDataMap(final SchemaMetaData schemaMetaData, final ShardingRule rule,
+                                                                            final DatabaseType databaseType, final DataSource dataSource) {
         Map<String, Collection<TableMetaData>> result = new LinkedHashMap<>();
         for (TableMetaData each : schemaMetaData.getTables()) {
             String logicTableName = rule.findLogicTableByActualTable(each.getName()).orElse(each.getName());
-            result.computeIfAbsent(logicTableName, key -> new LinkedList<>()).add(decorate(each, rule));
+            result.computeIfAbsent(logicTableName, key -> new LinkedList<>()).add(decorate(each, rule, databaseType, dataSource));
         }
         return result;
     }
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 9528bf1aaf3..a3b50f0f6e5 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,21 +17,23 @@
 
 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.TableRule;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
 
 /**
  * Sharding column generated reviser.
  */
-@RequiredArgsConstructor
-public final class ShardingColumnGeneratedReviser extends ColumnGeneratedReviser {
+public final class ShardingColumnGeneratedReviser implements ColumnGeneratedReviser<ShardingRule> {
     
-    private final TableRule tableRule;
+    @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);
+    }
     
     @Override
-    protected boolean isGenerated(final ColumnMetaData originalMetaData) {
-        return originalMetaData.getName().equalsIgnoreCase(tableRule.getGenerateKeyColumn().orElse(null));
+    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.column.ColumnGeneratedReviser b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser
new file mode 100644
index 00000000000..8d31e51bc1a
--- /dev/null
+++ b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser
@@ -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.ShardingColumnGeneratedReviser
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
similarity index 58%
rename from infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviser.java
rename to infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
index fdde8b4a240..70060c2e0b3 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
@@ -17,20 +17,28 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
 
-import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
+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;
 
 /**
- * Column reviser.
+ * Column data type reviser.
+ * 
+ * @param <T> type of rule
  */
-public interface ColumnReviser {
+public interface ColumnDataTypeReviser<T extends ShardingSphereRule> extends TypedSPI {
     
     /**
-     * Revise column meta data.
+     * Revise column data type.
      * 
-     * @param originalMetaData original column meta data
-     * @return revised column meta data
+     * @param originalName original name
+     * @param rule rule
+     * @param databaseType database type
+     * @param dataSource data source
+     * @return revised data type
      */
-    Optional<ColumnMetaData> revise(ColumnMetaData originalMetaData);
+    Optional<Integer> revise(String originalName, T rule, DatabaseType databaseType, DataSource dataSource);
 }
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 c2f09c1e588..3e013b7cf02 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
@@ -18,22 +18,24 @@
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
 
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
-
-import java.util.Optional;
+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
  */
-public abstract class ColumnGeneratedReviser implements ColumnReviser {
-    
-    @Override
-    public final Optional<ColumnMetaData> revise(final ColumnMetaData originalMetaData) {
-        return Optional.of(createColumnMetaData(isGenerated(originalMetaData), originalMetaData));
-    }
-    
-    private ColumnMetaData createColumnMetaData(final boolean isGenerated, final ColumnMetaData metaData) {
-        return new ColumnMetaData(metaData.getName(), metaData.getDataType(), metaData.isPrimaryKey(), isGenerated, metaData.isCaseSensitive(), metaData.isVisible(), metaData.isUnsigned());
-    }
+@SingletonSPI
+public interface ColumnGeneratedReviser<T extends ShardingSphereRule> extends TypedSPI {
     
-    protected abstract boolean isGenerated(ColumnMetaData originalMetaData);
+    /**
+     * Revise generated column.
+     * 
+     * @param originalMetaData original column meta data
+     * @param rule rule
+     * @return revised generated column
+     */
+    boolean revise(ColumnMetaData originalMetaData, T rule);
 }
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 8119a930c4c..1108e4ceddc 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
@@ -17,23 +17,27 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
 
-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;
 
 import java.util.Optional;
 
 /**
  * Column name reviser.
+ * 
+ * @param <T> type of rule
  */
-public abstract class ColumnNameReviser implements ColumnReviser {
+@SingletonSPI
+public interface ColumnNameReviser<T extends ShardingSphereRule> extends TypedSPI {
     
-    @Override
-    public final Optional<ColumnMetaData> revise(final ColumnMetaData originalMetaData) {
-        return getColumnName(originalMetaData.getName()).map(optional -> createColumnMetaData(optional, originalMetaData));
-    }
-    
-    private ColumnMetaData createColumnMetaData(final String name, final ColumnMetaData metaData) {
-        return new ColumnMetaData(name, metaData.getDataType(), metaData.isPrimaryKey(), metaData.isGenerated(), metaData.isCaseSensitive(), metaData.isVisible(), metaData.isUnsigned());
-    }
-    
-    protected abstract Optional<String> getColumnName(String originalName);
+    /**
+     * Revise column name.
+     * 
+     * @param originalName original name
+     * @param tableName table name
+     * @param rule rule
+     * @return revised column name
+     */
+    Optional<String> revise(String originalName, String tableName, T rule);
 }
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 0f4b7ccbbca..096a736ea0e 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
@@ -17,38 +17,60 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
 
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 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;
 import java.util.LinkedHashSet;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Column revise engine.
+ * 
+ * @param <T> type of rule
  */
-public final class ColumnReviseEngine {
+@RequiredArgsConstructor
+public final class ColumnReviseEngine<T extends ShardingSphereRule> {
+    
+    private final T rule;
+    
+    private final DatabaseType databaseType;
+    
+    private final DataSource dataSource;
     
     /**
      * Revise column meta data.
      * 
+     * @param tableName table name
      * @param originalMetaDataList original column meta data list
-     * @param revisers column revisers
      * @return revised column meta data
      */
-    public Collection<ColumnMetaData> revise(final Collection<ColumnMetaData> originalMetaDataList, final Collection<ColumnReviser> revisers) {
-        return originalMetaDataList.stream().map(each -> revise(each, revisers)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toCollection(LinkedHashSet::new));
-    }
-    
-    private Optional<ColumnMetaData> revise(final ColumnMetaData originalMetaData, final Collection<ColumnReviser> revisers) {
-        ColumnMetaData result = originalMetaData;
-        for (ColumnReviser each : revisers) {
-            Optional<ColumnMetaData> revisedMetaData = each.revise(result);
-            if (!revisedMetaData.isPresent()) {
-                return Optional.empty();
+    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);
+        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;
             }
-            result = revisedMetaData.get();
+            @SuppressWarnings("unchecked")
+            Optional<Integer> dataType = dataTypeReviser.isPresent() ? dataTypeReviser.get().revise(each.getName(), 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()));
         }
-        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 d47ff180ddb..0e2ab344360 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,6 +19,7 @@ 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;
@@ -28,6 +29,7 @@ import java.util.Optional;
  * 
  * @param <T> type of rule
  */
+@SingletonSPI
 public interface ConstraintReviser<T extends ShardingSphereRule> extends TypedSPI {
     
     /**
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 4868e3675f6..2852dcadfc6 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,6 +19,7 @@ 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;
@@ -28,6 +29,7 @@ import java.util.Optional;
  * 
  * @param <T> type of rule
  */
+@SingletonSPI
 public interface IndexReviser<T extends ShardingSphereRule> extends TypedSPI {
     
     /**
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 b9cf1c002e2..7f368da195f 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
@@ -18,15 +18,15 @@
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table;
 
 import lombok.RequiredArgsConstructor;
+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.column.ColumnReviser;
 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.loader.model.TableMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 
-import java.util.Collection;
+import javax.sql.DataSource;
 
 /**
  * Table meta data revise engine.
@@ -38,19 +38,22 @@ public final class TableMetaDataReviseEngine<T extends ShardingSphereRule> {
     
     private final T rule;
     
+    private final DatabaseType databaseType;
+    
+    private final DataSource dataSource;
+    
     /**
      * Revise table meta data.
      * 
      * @param originalMetaData original table meta data
-     * @param columnRevisers column revisers
      * @return revised table meta data
      */
     @SuppressWarnings("unchecked")
-    public TableMetaData revise(final TableMetaData originalMetaData, final Collection<ColumnReviser> columnRevisers) {
+    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().revise(originalMetaData.getColumns(), columnRevisers),
-                new IndexReviseEngine<T>().revise(revisedTableName, originalMetaData.getIndexes(), rule),
-                new ConstraintReviseEngine<T>().revise(revisedTableName, originalMetaData.getConstrains(), rule));
+        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));
     }
 }
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 618075ab8b0..267c88d41d5 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,6 +18,7 @@
 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;
 
 /**
@@ -25,6 +26,7 @@ import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
  * 
  * @param <T> type of rule
  */
+@SingletonSPI
 public interface TableNameReviser<T extends ShardingSphereRule> extends TypedSPI {
     
     /**
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 30851d09b35..b4363a1c837 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.single.metadata;
 
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableMetaDataReviseEngine;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.RuleBasedSchemaMetaDataDecorator;
@@ -25,8 +26,8 @@ import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.Tab
 import org.apache.shardingsphere.single.constant.SingleOrder;
 import org.apache.shardingsphere.single.rule.SingleRule;
 
+import javax.sql.DataSource;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
@@ -43,15 +44,15 @@ public final class SingleSchemaMetaDataDecorator implements RuleBasedSchemaMetaD
         for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
             Collection<TableMetaData> tables = new LinkedList<>();
             for (TableMetaData each : entry.getValue().getTables()) {
-                tables.add(decorate(rule, each));
+                tables.add(decorate(rule, each, material.getStorageTypes().get(entry.getKey()), material.getDataSourceMap().get(entry.getKey())));
             }
             result.put(entry.getKey(), new SchemaMetaData(entry.getKey(), tables));
         }
         return result;
     }
     
-    private TableMetaData decorate(final SingleRule rule, final TableMetaData tableMetaData) {
-        return new TableMetaDataReviseEngine<>(rule).revise(tableMetaData, Collections.emptyList());
+    private TableMetaData decorate(final SingleRule rule, final TableMetaData tableMetaData, final DatabaseType databaseType, final DataSource dataSource) {
+        return new TableMetaDataReviseEngine<>(rule, databaseType, dataSource).revise(tableMetaData);
     }
     
     @Override