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


Reply via email to