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/09 07:12:06 UTC

[shardingsphere] branch master updated: Add SchemaTableAggregationReviser (#24072)

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

zhaojinchao 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 7847cd42019 Add SchemaTableAggregationReviser (#24072)
7847cd42019 is described below

commit 7847cd42019044901b996fde8e49ec0bb9f4e306
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Feb 9 15:11:57 2023 +0800

    Add SchemaTableAggregationReviser (#24072)
---
 .../metadata/EncryptSchemaMetaDataDecorator.java   |  9 +--
 ...eEntry.java => EncryptMetaDataReviseEntry.java} |  6 +-
 ...tabase.schema.decorator.spi.MetaDataReviseEntry |  2 +-
 .../metadata/ShardingSchemaMetaDataDecorator.java  | 37 +-----------
 ...Entry.java => ShardingMetaDataReviseEntry.java} | 13 ++++-
 .../ShardingSchemaTableAggregationReviser.java     | 68 ++++++++++++++++++++++
 ...abase.schema.decorator.spi.MetaDataReviseEntry} |  2 +-
 .../reviser/column/ColumnReviseEngine.java         |  4 +-
 .../reviser/constraint/ConstraintReviseEngine.java |  4 +-
 .../decorator/reviser/index/IndexReviseEngine.java |  4 +-
 .../SchemaMetaDataReviseEngine.java}               | 49 +++++++++-------
 .../schema/SchemaTableAggregationReviser.java      | 40 +++++++------
 .../reviser/table/TableMetaDataReviseEngine.java   | 12 +---
 ...taReviseEntry.java => MetaDataReviseEntry.java} | 17 +++++-
 .../metadata/SingleSchemaMetaDataDecorator.java    |  9 +--
 ...seEntry.java => SingleMetaDataReviseEntry.java} |  6 +-
 ...tabase.schema.decorator.spi.MetaDataReviseEntry |  2 +-
 17 files changed, 166 insertions(+), 118 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 986c9d2da7f..061ba32a226 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
@@ -21,17 +21,14 @@ import org.apache.shardingsphere.encrypt.constant.EncryptOrder;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 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.reviser.schema.SchemaMetaDataReviseEngine;
 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.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.stream.Collectors;
 
 /**
  * Schema meta data decorator for encrypt.
@@ -44,9 +41,7 @@ public final class EncryptSchemaMetaDataDecorator implements RuleBasedSchemaMeta
         for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
             DatabaseType databaseType = material.getStorageTypes().get(entry.getKey());
             DataSource dataSource = material.getDataSourceMap().get(entry.getKey());
-            TableMetaDataReviseEngine<EncryptRule> tableMetaDataReviseEngine = new TableMetaDataReviseEngine<>(rule, databaseType, dataSource);
-            Collection<TableMetaData> tables = entry.getValue().getTables().stream().map(tableMetaDataReviseEngine::revise).collect(Collectors.toList());
-            result.put(entry.getKey(), new SchemaMetaData(entry.getKey(), tables));
+            result.put(entry.getKey(), new SchemaMetaDataReviseEngine<>(rule, material.getProps(), databaseType, dataSource).revise(entry.getValue()));
         }
         return result;
     }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptTableMetaDataReviseEntry.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptMetaDataReviseEntry.java
similarity index 89%
rename from features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptTableMetaDataReviseEntry.java
rename to features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptMetaDataReviseEntry.java
index 668c5e8b828..d9cc520dff0 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptTableMetaDataReviseEntry.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptMetaDataReviseEntry.java
@@ -18,14 +18,14 @@
 package org.apache.shardingsphere.encrypt.metadata.reviser;
 
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry;
 
 import java.util.Optional;
 
 /**
- * Encrypt table meta data revise entry.
+ * Encrypt meta data revise entry.
  */
-public final class EncryptTableMetaDataReviseEntry implements TableMetaDataReviseEntry<EncryptRule> {
+public final class EncryptMetaDataReviseEntry implements MetaDataReviseEntry<EncryptRule> {
     
     @Override
     public Optional<EncryptColumnExistedReviser> getColumnExistedReviser(final EncryptRule rule, final String tableName) {
diff --git a/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry b/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
similarity index 90%
rename from kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
rename to features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
index aa936b0634a..020133aeeae 100644
--- a/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
+++ b/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.single.metadata.reviser.SingleTableMetaDataReviseEntry
+org.apache.shardingsphere.encrypt.metadata.reviser.EncryptMetaDataReviseEntry
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 4e3bb28b177..07514c7d43a 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
@@ -17,25 +17,18 @@
 
 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.reviser.schema.SchemaMetaDataReviseEngine;
 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 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.rule.ShardingRule;
 
 import javax.sql.DataSource;
-import java.util.Collection;
 import java.util.LinkedHashMap;
-import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.stream.Collectors;
 
 /**
  * Schema meta data decorator for sharding.
@@ -45,40 +38,14 @@ public final class ShardingSchemaMetaDataDecorator implements RuleBasedSchemaMet
     @Override
     public Map<String, SchemaMetaData> decorate(final Map<String, SchemaMetaData> schemaMetaDataMap, final ShardingRule rule, final GenericSchemaBuilderMaterial material) {
         Map<String, SchemaMetaData> result = new LinkedHashMap<>(schemaMetaDataMap.size(), 1);
-        boolean checkTableMetaDataEnabled = material.getProps().getValue(ConfigurationPropertyKey.CHECK_TABLE_META_DATA_ENABLED);
         for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
             DatabaseType databaseType = material.getStorageTypes().get(entry.getKey());
             DataSource dataSource = material.getDataSourceMap().get(entry.getKey());
-            Collection<TableMetaData> tables = new LinkedList<>();
-            for (Entry<String, Collection<TableMetaData>> tableEntry : getLogicTableMetaDataMap(entry.getValue(), rule, databaseType, dataSource).entrySet()) {
-                if (checkTableMetaDataEnabled) {
-                    checkUniformed(tableEntry.getKey(), tableEntry.getValue());
-                }
-                tables.add(tableEntry.getValue().iterator().next());
-            }
-            result.put(entry.getKey(), new SchemaMetaData(entry.getKey(), tables));
+            result.put(entry.getKey(), new SchemaMetaDataReviseEngine<>(rule, material.getProps(), databaseType, dataSource).revise(entry.getValue()));
         }
         return result;
     }
     
-    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<>();
-        TableMetaDataReviseEngine<ShardingRule> tableMetaDataReviseEngine = new TableMetaDataReviseEngine<>(rule, databaseType, dataSource);
-        for (TableMetaData each : schemaMetaData.getTables()) {
-            String logicTableName = rule.findLogicTableByActualTable(each.getName()).orElse(each.getName());
-            result.computeIfAbsent(logicTableName, key -> new LinkedList<>()).add(tableMetaDataReviseEngine.revise(each));
-        }
-        return result;
-    }
-    
-    private void checkUniformed(final String logicTableName, final Collection<TableMetaData> tableMetaDataList) {
-        TableMetaData sample = tableMetaDataList.iterator().next();
-        Collection<TableMetaDataViolation> violations = tableMetaDataList.stream()
-                .filter(each -> !sample.equals(each)).map(each -> new TableMetaDataViolation(each.getName(), each)).collect(Collectors.toList());
-        ShardingSpherePreconditions.checkState(violations.isEmpty(), () -> new InconsistentShardingTableMetaDataException(logicTableName, violations));
-    }
-    
     @Override
     public int getOrder() {
         return ShardingOrder.ORDER;
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableMetaDataReviseEntry.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingMetaDataReviseEntry.java
similarity index 75%
rename from features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableMetaDataReviseEntry.java
rename to features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingMetaDataReviseEntry.java
index 810f8bbd623..662b490b8f5 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingTableMetaDataReviseEntry.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingMetaDataReviseEntry.java
@@ -17,15 +17,22 @@
 
 package org.apache.shardingsphere.sharding.metadata.reviser;
 
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.schema.SchemaTableAggregationReviser;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 
 import java.util.Optional;
 
 /**
- * Sharding table meta data revise entry.
+ * Sharding meta data revise entry.
  */
-public final class ShardingTableMetaDataReviseEntry implements TableMetaDataReviseEntry<ShardingRule> {
+public final class ShardingMetaDataReviseEntry implements MetaDataReviseEntry<ShardingRule> {
+    
+    @Override
+    public Optional<? extends SchemaTableAggregationReviser<ShardingRule>> getSchemaTableAggregationReviser(final ShardingRule rule, final ConfigurationProperties props) {
+        return MetaDataReviseEntry.super.getSchemaTableAggregationReviser(rule, props);
+    }
     
     @Override
     public Optional<ShardingTableNameReviser> getTableNameReviser() {
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingSchemaTableAggregationReviser.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingSchemaTableAggregationReviser.java
new file mode 100644
index 00000000000..830d3d053de
--- /dev/null
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingSchemaTableAggregationReviser.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sharding.metadata.reviser;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.schema.SchemaTableAggregationReviser;
+import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
+import org.apache.shardingsphere.sharding.exception.metadata.InconsistentShardingTableMetaDataException;
+import org.apache.shardingsphere.sharding.metadata.TableMetaDataViolation;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+/**
+ * Sharding schema table aggregation reviser.
+ */
+@RequiredArgsConstructor
+public final class ShardingSchemaTableAggregationReviser implements SchemaTableAggregationReviser<ShardingRule> {
+    
+    private final boolean checkTableMetaDataEnabled;
+    
+    private final Map<String, Collection<TableMetaData>> tableMetaDataMap = new LinkedHashMap<>();
+    
+    @Override
+    public void add(final TableMetaData metaData) {
+        tableMetaDataMap.computeIfAbsent(metaData.getName(), key -> new LinkedList<>()).add(metaData);
+    }
+    
+    @Override
+    public Collection<TableMetaData> aggregate(final ShardingRule rule) {
+        Collection<TableMetaData> result = new LinkedList<>();
+        for (Entry<String, Collection<TableMetaData>> entry : tableMetaDataMap.entrySet()) {
+            if (checkTableMetaDataEnabled) {
+                checkUniformed(entry.getKey(), entry.getValue());
+            }
+            result.add(entry.getValue().iterator().next());
+        }
+        return result;
+    }
+    
+    private void checkUniformed(final String logicTableName, final Collection<TableMetaData> tableMetaDataList) {
+        TableMetaData sample = tableMetaDataList.iterator().next();
+        Collection<TableMetaDataViolation> violations = tableMetaDataList.stream()
+                .filter(each -> !sample.equals(each)).map(each -> new TableMetaDataViolation(each.getName(), each)).collect(Collectors.toList());
+        ShardingSpherePreconditions.checkState(violations.isEmpty(), () -> new InconsistentShardingTableMetaDataException(logicTableName, violations));
+    }
+}
diff --git a/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
similarity index 90%
rename from features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
rename to features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
index 7c6ab16861d..02f44432f4d 100644
--- a/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
+++ b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.encrypt.metadata.reviser.EncryptTableMetaDataReviseEntry
+org.apache.shardingsphere.sharding.metadata.reviser.ShardingMetaDataReviseEntry
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 5d5c9803e01..5ac2ae49c2c 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,7 +19,7 @@ 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.decorator.spi.MetaDataReviseEntry;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
@@ -42,7 +42,7 @@ public final class ColumnReviseEngine<T extends ShardingSphereRule> {
     
     private final DataSource dataSource;
     
-    private final TableMetaDataReviseEntry<T> reviseEntry;
+    private final MetaDataReviseEntry<T> reviseEntry;
     
     /**
      * Revise column meta data.
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 c06fa00bdc6..984073315a0 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviseEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviseEngine.java
@@ -18,7 +18,7 @@
 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.decorator.spi.MetaDataReviseEntry;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
@@ -37,7 +37,7 @@ public final class ConstraintReviseEngine<T extends ShardingSphereRule> {
     
     private final T rule;
     
-    private final TableMetaDataReviseEntry<T> reviseEntry;
+    private final MetaDataReviseEntry<T> reviseEntry;
     
     /**
      * 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 e3186412362..67035d56a2d 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviseEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviseEngine.java
@@ -18,7 +18,7 @@
 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.decorator.spi.MetaDataReviseEntry;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
@@ -37,7 +37,7 @@ public final class IndexReviseEngine<T extends ShardingSphereRule> {
     
     private final T rule;
     
-    private final TableMetaDataReviseEntry<T> reviseEntry;
+    private final MetaDataReviseEntry<T> reviseEntry;
     
     /**
      * 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/schema/SchemaMetaDataReviseEngine.java
similarity index 51%
copy from infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java
copy to infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/schema/SchemaMetaDataReviseEngine.java
index ade5a624f77..4b855f27cbb 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/schema/SchemaMetaDataReviseEngine.java
@@ -15,53 +15,60 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table;
+package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.schema;
 
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 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.decorator.reviser.table.TableMetaDataReviseEngine;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry;
+import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 
 import javax.sql.DataSource;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
- * Table meta data revise engine.
+ * Schema meta data revise engine.
  *
  * @param <T> type of rule
  */
 @RequiredArgsConstructor
-public final class TableMetaDataReviseEngine<T extends ShardingSphereRule> {
+public final class SchemaMetaDataReviseEngine<T extends ShardingSphereRule> {
     
     private final T rule;
     
+    private final ConfigurationProperties props;
+    
     private final DatabaseType databaseType;
     
     private final DataSource dataSource;
     
     /**
-     * Revise table meta data.
+     * Revise schema meta data.
      *
-     * @param originalMetaData original table meta data
-     * @return revised table meta data
+     * @param originalMetaData original schema meta data
+     * @return revised schema data
      */
     @SuppressWarnings("unchecked")
-    public TableMetaData revise(final TableMetaData originalMetaData) {
+    public SchemaMetaData revise(final SchemaMetaData originalMetaData) {
         @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()));
+        Optional<MetaDataReviseEntry> reviseEntry = TypedSPILoader.findService(MetaDataReviseEntry.class, rule.getClass().getSimpleName());
+        if (!reviseEntry.isPresent()) {
+            return originalMetaData;
+        }
+        @SuppressWarnings("rawtypes")
+        TableMetaDataReviseEngine<T> tableMetaDataReviseEngine = new TableMetaDataReviseEngine<>(rule, databaseType, dataSource, reviseEntry.get());
+        Optional<? extends SchemaTableAggregationReviser<T>> aggregationReviser = reviseEntry.get().getSchemaTableAggregationReviser(rule, props);
+        if (!aggregationReviser.isPresent()) {
+            return new SchemaMetaData(originalMetaData.getName(), originalMetaData.getTables().stream().map(tableMetaDataReviseEngine::revise).collect(Collectors.toList()));
+        }
+        for (TableMetaData each : originalMetaData.getTables()) {
+            aggregationReviser.get().add(tableMetaDataReviseEngine.revise(each));
+        }
+        return new SchemaMetaData(originalMetaData.getName(), aggregationReviser.get().aggregate(rule));
     }
 }
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleTableMetaDataReviseEntry.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/schema/SchemaTableAggregationReviser.java
similarity index 52%
copy from kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleTableMetaDataReviseEntry.java
copy to infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/schema/SchemaTableAggregationReviser.java
index 626fb9b9992..f819a39ed63 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleTableMetaDataReviseEntry.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/schema/SchemaTableAggregationReviser.java
@@ -15,30 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.metadata.reviser;
+package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.schema;
 
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
-import org.apache.shardingsphere.single.rule.SingleRule;
+import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
-import java.util.Optional;
+import java.util.Collection;
 
 /**
- * Single table meta data revise entry.
+ * Schema table aggregation reviser.
+ * 
+ * @param <T> type of rule
  */
-public final class SingleTableMetaDataReviseEntry implements TableMetaDataReviseEntry<SingleRule> {
+public interface SchemaTableAggregationReviser<T extends ShardingSphereRule> {
     
-    @Override
-    public Optional<SingleIndexReviser> getIndexReviser(final SingleRule rule, final String tableName) {
-        return Optional.of(new SingleIndexReviser());
-    }
+    /**
+     * Add table meta data.
+     * 
+     * @param metaData table meta data
+     */
+    void add(TableMetaData metaData);
     
-    @Override
-    public Optional<SingleConstraintReviser> getConstraintReviser(final SingleRule rule, final String tableName) {
-        return Optional.of(new SingleConstraintReviser());
-    }
-    
-    @Override
-    public String getType() {
-        return SingleRule.class.getSimpleName();
-    }
+    /**
+     * Aggregate table meta data list.
+     * 
+     * @param rule rule
+     * @return aggregated meta data list
+     */
+    Collection<TableMetaData> aggregate(T rule);
 }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java
index ade5a624f77..c1445e61c3d 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,10 +22,9 @@ 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.decorator.spi.MetaDataReviseEntry;
 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;
@@ -44,20 +43,15 @@ public final class TableMetaDataReviseEngine<T extends ShardingSphereRule> {
     
     private final DataSource dataSource;
     
+    private final MetaDataReviseEntry<T> reviseEntry;
+    
     /**
      * Revise table meta data.
      *
      * @param originalMetaData original table meta data
      * @return revised table meta data
      */
-    @SuppressWarnings("unchecked")
     public TableMetaData revise(final TableMetaData originalMetaData) {
-        @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()),
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/MetaDataReviseEntry.java
similarity index 85%
rename from infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/spi/TableMetaDataReviseEntry.java
rename to infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/spi/MetaDataReviseEntry.java
index febc19c2bcc..24d690eade2 100644
--- 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/MetaDataReviseEntry.java
@@ -17,12 +17,14 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi;
 
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnDataTypeReviser;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnExistedReviser;
 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.schema.SchemaTableAggregationReviser;
 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;
@@ -30,11 +32,22 @@ import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
 import java.util.Optional;
 
 /**
- * Table name revise entry.
+ * Meta data revise entry.
  * 
  * @param <T> type of rule
  */
-public interface TableMetaDataReviseEntry<T extends ShardingSphereRule> extends TypedSPI {
+public interface MetaDataReviseEntry<T extends ShardingSphereRule> extends TypedSPI {
+    
+    /**
+     * Get schema table aggregation reviser.
+     * 
+     * @param rule rule
+     * @param props configuration properties
+     * @return schema table aggregation reviser
+     */
+    default Optional<? extends SchemaTableAggregationReviser<T>> getSchemaTableAggregationReviser(final T rule, final ConfigurationProperties props) {
+        return Optional.empty();
+    }
     
     /**
      * Get table name reviser.
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 2ed77d761b1..ec656ca065b 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
@@ -19,19 +19,16 @@ 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.reviser.schema.SchemaMetaDataReviseEngine;
 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 org.apache.shardingsphere.single.constant.SingleOrder;
 import org.apache.shardingsphere.single.rule.SingleRule;
 
 import javax.sql.DataSource;
-import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.stream.Collectors;
 
 /**
  * Schema meta data decorator for single.
@@ -44,9 +41,7 @@ public final class SingleSchemaMetaDataDecorator implements RuleBasedSchemaMetaD
         for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
             DatabaseType databaseType = material.getStorageTypes().get(entry.getKey());
             DataSource dataSource = material.getDataSourceMap().get(entry.getKey());
-            TableMetaDataReviseEngine<SingleRule> tableMetaDataReviseEngine = new TableMetaDataReviseEngine<>(rule, databaseType, dataSource);
-            Collection<TableMetaData> tables = entry.getValue().getTables().stream().map(tableMetaDataReviseEngine::revise).collect(Collectors.toList());
-            result.put(entry.getKey(), new SchemaMetaData(entry.getKey(), tables));
+            result.put(entry.getKey(), new SchemaMetaDataReviseEngine<>(rule, material.getProps(), databaseType, dataSource).revise(entry.getValue()));
         }
         return result;
     }
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleTableMetaDataReviseEntry.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleMetaDataReviseEntry.java
similarity index 89%
rename from kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleTableMetaDataReviseEntry.java
rename to kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleMetaDataReviseEntry.java
index 626fb9b9992..10e2b1b6291 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleTableMetaDataReviseEntry.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/reviser/SingleMetaDataReviseEntry.java
@@ -17,15 +17,15 @@
 
 package org.apache.shardingsphere.single.metadata.reviser;
 
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry;
 import org.apache.shardingsphere.single.rule.SingleRule;
 
 import java.util.Optional;
 
 /**
- * Single table meta data revise entry.
+ * Single meta data revise entry.
  */
-public final class SingleTableMetaDataReviseEntry implements TableMetaDataReviseEntry<SingleRule> {
+public final class SingleMetaDataReviseEntry implements MetaDataReviseEntry<SingleRule> {
     
     @Override
     public Optional<SingleIndexReviser> getIndexReviser(final SingleRule rule, final String tableName) {
diff --git a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
similarity index 90%
rename from features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
rename to kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
index 680c4d4c6d9..ab365ba16fa 100644
--- a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.TableMetaDataReviseEntry
+++ b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.MetaDataReviseEntry
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.sharding.metadata.reviser.ShardingTableMetaDataReviseEntry
+org.apache.shardingsphere.single.metadata.reviser.SingleMetaDataReviseEntry