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

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


The following commit(s) were added to refs/heads/master by this push:
     new fccd704  Refactor TableMetaDataBuilder And SchemaBuilder (#12483)
fccd704 is described below

commit fccd704a9c5b2cc562b4b148a3f16c0c293dd5d5
Author: tuichenchuxin <[email protected]>
AuthorDate: Fri Sep 17 17:19:19 2021 +0800

    Refactor TableMetaDataBuilder And SchemaBuilder (#12483)
    
    * Refactor TableMetaDataBuilder And SchemaBuilder
    
    * fix review suggestions
    
    * fix review suggestions
---
 .../metadata/schema/builder/SchemaBuilder.java     | 43 ++++++-----------
 .../schema/builder/TableMetaDataBuilder.java       | 54 ++++++++++++----------
 .../type/AlterTableStatementSchemaRefresher.java   |  5 +-
 .../type/CreateTableStatementSchemaRefresher.java  |  5 +-
 .../metadata/schema/builder/SchemaBuilderTest.java | 17 +++++--
 .../schema/builder/TableMetaDataBuilderTest.java   | 26 +++++------
 ...tainedFixtureRuleBasedTableMetaDataBuilder.java |  4 +-
 .../type/AlterTableStatementFederateRefresher.java |  3 +-
 .../CreateTableStatementFederateRefresher.java     |  3 +-
 .../metadata/SingleTableSchemaBuilderTest.java     | 17 +++++--
 .../mode/metadata/MetaDataContextsBuilder.java     | 19 +++++---
 11 files changed, 106 insertions(+), 90 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/SchemaBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/SchemaBuilder.java
index 52b590c..780fbd7 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/SchemaBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/SchemaBuilder.java
@@ -22,11 +22,8 @@ import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 
-import java.sql.SQLException;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.function.Function;
@@ -39,42 +36,30 @@ import java.util.stream.Collectors;
 public final class SchemaBuilder {
     
     /**
-     * Build sharding sphere schema.
+     * Build kernel schema.
      *
-     * @param materials schema builder materials
+     * @param tableMetaDatas table meta datas
+     * @param rules sharding sphere rule
      * @return sharding sphere schema
-     * @throws SQLException SQL exception
      */
-    public static ShardingSphereSchema build(final SchemaBuilderMaterials 
materials) throws SQLException {
-        Collection<String> allTableNames = 
materials.getRules().stream().filter(each -> each instanceof TableContainedRule)
-                .flatMap(shardingSphereRule -> ((TableContainedRule) 
shardingSphereRule).getTables().stream()).collect(Collectors.toSet());
-        return new 
ShardingSphereSchema(TableMetaDataBuilder.load(allTableNames, materials));
+    public static ShardingSphereSchema buildKernelSchema(final 
Collection<TableMetaData> tableMetaDatas, final Collection<ShardingSphereRule> 
rules) {
+        return buildSchema(tableMetaDatas, each -> 
TableMetaDataBuilder.decorateKernelTableMetaData(each, rules));
     }
     
     /**
-     * Decorate sharding sphere schema.
+     * Build federate schema.
      *
-     * @param schema sharding sphere schema
-     * @param materials schema builder materials
+     * @param tableMetaDatas table meta datas
+     * @param rules sharding sphere rule
      * @return sharding sphere schema
      */
-    public static ShardingSphereSchema decorate(final ShardingSphereSchema 
schema, final SchemaBuilderMaterials materials) {
-        Map<String, TableMetaData> tableMetaDataMap = 
schema.getTables().values().stream().collect(Collectors
-            .toMap(TableMetaData::getName, Function.identity(), (oldValue, 
currentValue) -> oldValue, LinkedHashMap::new));
-        for (ShardingSphereRule each : materials.getRules()) {
-            if (each instanceof TableContainedRule) {
-                decorateByRule(tableMetaDataMap, each);
-            }
-        }
-        return new ShardingSphereSchema(tableMetaDataMap);
+    public static ShardingSphereSchema buildFederateSchema(final 
Collection<TableMetaData> tableMetaDatas, final Collection<ShardingSphereRule> 
rules) {
+        return buildSchema(tableMetaDatas, each -> 
TableMetaDataBuilder.decorateFederateTableMetaData(each, rules));
     }
     
-    private static void decorateByRule(final Map<String, TableMetaData> 
tableMetaDataMap, final ShardingSphereRule rule) {
-        for (String each : ((TableContainedRule) rule).getTables()) {
-            if (tableMetaDataMap.containsKey(each)) {
-                TableMetaData metaData = TableMetaDataBuilder.decorate(each, 
tableMetaDataMap.get(each), Collections.singletonList(rule));
-                tableMetaDataMap.put(each, metaData);
-            }
-        }
+    private static ShardingSphereSchema buildSchema(final 
Collection<TableMetaData> tableMetaDatas, final Function<TableMetaData, 
TableMetaData> mapper) {
+        Map<String, TableMetaData> tableMetaDataMap = 
tableMetaDatas.stream().map(mapper)
+                .collect(Collectors.toMap(TableMetaData::getName, 
Function.identity(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+        return new ShardingSphereSchema(tableMetaDataMap);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilder.java
index 5fac218..1a84dba 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilder.java
@@ -22,18 +22,17 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.spi.ordered.OrderedSPIRegistry;
 
 import java.sql.SQLException;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -47,19 +46,6 @@ public final class TableMetaDataBuilder {
     }
     
     /**
-     * Build table meta data.
-     *
-     * @param tableName table name
-     * @param materials schema builder materials
-     * @return table meta data
-     * @throws SQLException SQL exception
-     */
-    public static Optional<TableMetaData> build(final String tableName, final 
SchemaBuilderMaterials materials) throws SQLException {
-        TableMetaData tableMetaData = 
load(Collections.singletonList(tableName), materials).get(tableName);
-        return Optional.ofNullable(tableMetaData).map(metaData -> 
decorate(tableName, metaData, materials.getRules()));
-    }
-    
-    /**
      * Load table metadata.
      *
      * @param tableNames table name collection
@@ -76,34 +62,52 @@ public final class TableMetaDataBuilder {
                 RuleBasedTableMetaDataBuilder<TableContainedRule> builder = 
entry.getValue();
                 Collection<String> needLoadTables = 
tableNames.stream().filter(each -> rule.getTables().contains(each)).filter(each 
-> !result.containsKey(each)).collect(Collectors.toList());
                 if (!needLoadTables.isEmpty()) {
-                    
result.putAll(decorateTableMetaData(builder.load(needLoadTables, rule, 
materials)));
+                    result.putAll(builder.load(needLoadTables, rule, 
materials));
                 }
             }
         }
         return result;
     }
     
-    private static Map<String, TableMetaData> decorateTableMetaData(final 
Map<String, TableMetaData> tableMetaDataMap) {
-        return tableMetaDataMap.entrySet().stream().map(entry -> new 
TableMetaData(entry.getKey(), entry.getValue().getColumns().values(), 
entry.getValue().getIndexes().values()))
-                .collect(Collectors.toMap(TableMetaData::getName, 
Function.identity(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+    /**
+     * Decorate federate table meta data.
+     *
+     * @param tableMetaData table meta data
+     * @param rules shardingSphere rules
+     * @return table meta data
+     */
+    public static TableMetaData decorateFederateTableMetaData(final 
TableMetaData tableMetaData, final Collection<ShardingSphereRule> rules) {
+        return decorateTableName(tableMetaData, rules);
     }
     
     /**
-     * Decorate table meta data.
+     * Decorate kernel table meta data.
      *
-     * @param tableName table name
      * @param tableMetaData table meta data
      * @param rules shardingSphere rules
      * @return table meta data
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public static TableMetaData decorate(final String tableName, final 
TableMetaData tableMetaData, final Collection<ShardingSphereRule> rules) {
-        TableMetaData result = null;
+    public static TableMetaData decorateKernelTableMetaData(final 
TableMetaData tableMetaData, final Collection<ShardingSphereRule> rules) {
+        TableMetaData result = decorateTableName(tableMetaData, rules);
         for (Entry<ShardingSphereRule, RuleBasedTableMetaDataBuilder> entry : 
OrderedSPIRegistry.getRegisteredServices(RuleBasedTableMetaDataBuilder.class, 
rules).entrySet()) {
             if (entry.getKey() instanceof TableContainedRule) {
-                result = entry.getValue().decorate(tableName, null == result ? 
tableMetaData : result, (TableContainedRule) entry.getKey());
+                result = entry.getValue().decorate(result.getName(), result, 
(TableContainedRule) entry.getKey());
+            }
+        }
+        return result;
+    }
+    
+    private static TableMetaData decorateTableName(final TableMetaData 
tableMetaData, final Collection<ShardingSphereRule> rules) {
+        for (ShardingSphereRule each : rules) {
+            if (each instanceof DataNodeContainedRule) {
+                Optional<String> logicTable = ((DataNodeContainedRule) 
each).findLogicTableByActualTable(tableMetaData.getName());
+                if (logicTable.isPresent()) {
+                    return new TableMetaData(logicTable.get(), 
tableMetaData.getColumns().values(), tableMetaData.getIndexes().values());
+                }
             }
         }
-        return Optional.ofNullable(result).orElse(tableMetaData);
+        return new TableMetaData(tableMetaData.getName(), 
tableMetaData.getColumns().values(), tableMetaData.getIndexes().values());
     }
+    
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/AlterTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/AlterTableStatementSchemaRefresher.java
index 2d765f6..9c44379 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/AlterTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/AlterTableStatementSchemaRefresher.java
@@ -29,6 +29,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTableS
 
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
 
 /**
  * Schema refresher for alter table statement.
@@ -59,7 +61,8 @@ public final class AlterTableStatementSchemaRefresher 
implements SchemaRefresher
         }
         SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
                 schemaMetaData.getResource().getDatabaseType(), 
schemaMetaData.getResource().getDataSources(), 
schemaMetaData.getRuleMetaData().getRules(), props);
-        TableMetaData tableMetaData = TableMetaDataBuilder.build(tableName, 
materials).orElseGet(TableMetaData::new);
+        TableMetaData tableMetaData = 
Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName),
 materials).get(tableName))
+                .map(each -> 
TableMetaDataBuilder.decorateKernelTableMetaData(each, 
materials.getRules())).orElseGet(TableMetaData::new);
         schemaMetaData.getSchema().put(tableName, tableMetaData);
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
index e0386c9..29682a4 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/refresher/type/CreateTableStatementSchemaRefresher.java
@@ -29,6 +29,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTable
 
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
 
 /**
  * Schema refresher for create table statement.
@@ -44,7 +46,8 @@ public final class CreateTableStatementSchemaRefresher 
implements SchemaRefreshe
         }
         SchemaBuilderMaterials materials = new SchemaBuilderMaterials(
                 schemaMetaData.getResource().getDatabaseType(), 
schemaMetaData.getResource().getDataSources(), 
schemaMetaData.getRuleMetaData().getRules(), props);
-        TableMetaData tableMetaData = TableMetaDataBuilder.build(tableName, 
materials).orElseGet(TableMetaData::new);
+        TableMetaData tableMetaData = 
Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName),
 materials).get(tableName))
+                .map(each -> 
TableMetaDataBuilder.decorateKernelTableMetaData(each, 
materials.getRules())).orElseGet(TableMetaData::new);
         schemaMetaData.getSchema().put(tableName, tableMetaData);
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/SchemaBuilderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/SchemaBuilderTest.java
index ef55270..a2424c6 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/SchemaBuilderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/SchemaBuilderTest.java
@@ -23,6 +23,8 @@ import 
org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.schema.fixture.rule.CommonFixtureRule;
 import 
org.apache.shardingsphere.infra.metadata.schema.fixture.rule.DataNodeContainedFixtureRule;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -55,10 +57,17 @@ public final class SchemaBuilderTest {
     
     @Test
     public void assertBuildOfAllShardingTables() throws SQLException {
-        ShardingSphereSchema schema = SchemaBuilder.build(new 
SchemaBuilderMaterials(
-                databaseType, Collections.singletonMap("logic_db", 
dataSource), Arrays.asList(new CommonFixtureRule(), new 
DataNodeContainedFixtureRule()), props));
-        assertThat(schema.getTables().keySet().size(), is(2));
-        assertSchemaOfShardingTables(schema.getTables().values());
+        Collection<ShardingSphereRule> rules = Arrays.asList(new 
CommonFixtureRule(), new DataNodeContainedFixtureRule());
+        Collection<String> tableNames = rules.stream().filter(rule -> rule 
instanceof TableContainedRule)
+                .flatMap(shardingSphereRule -> ((TableContainedRule) 
shardingSphereRule).getTables().stream()).collect(Collectors.toSet());
+        Collection<TableMetaData> tableMetaDatas = 
TableMetaDataBuilder.load(tableNames, new SchemaBuilderMaterials(
+                databaseType, Collections.singletonMap("logic_db", 
dataSource), rules, props)).values();
+        ShardingSphereSchema schemaForKernel = 
SchemaBuilder.buildKernelSchema(tableMetaDatas, rules);
+        ShardingSphereSchema schemaForFederate = 
SchemaBuilder.buildFederateSchema(tableMetaDatas, rules);
+        assertThat(schemaForKernel.getTables().keySet().size(), is(2));
+        assertSchemaOfShardingTables(schemaForKernel.getTables().values());
+        assertThat(schemaForFederate.getTables().keySet().size(), is(2));
+        assertSchemaOfShardingTables(schemaForFederate.getTables().values());
     }
     
     private void assertSchemaOfShardingTables(final Collection<TableMetaData> 
actual) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilderTest.java
index a6e78d9..477c9cc 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilderTest.java
@@ -21,6 +21,7 @@ import 
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.schema.fixture.rule.CommonFixtureRule;
 import 
org.apache.shardingsphere.infra.metadata.schema.fixture.rule.DataNodeContainedFixtureRule;
+import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
@@ -33,6 +34,7 @@ import java.util.Arrays;
 import java.util.Collections;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 @RunWith(MockitoJUnitRunner.class)
@@ -48,20 +50,6 @@ public final class TableMetaDataBuilderTest {
     private ConfigurationProperties props;
     
     @Test
-    public void assertBuildWithExistedTableName() throws SQLException {
-        assertTrue(TableMetaDataBuilder.build("data_node_routed_table1", new 
SchemaBuilderMaterials(
-                databaseType, Collections.singletonMap("logic_db", 
dataSource), Arrays.asList(new CommonFixtureRule(),
-                new DataNodeContainedFixtureRule()), props)).isPresent());
-    }
-    
-    @Test
-    public void assertBuildWithNotExistedTableName() throws SQLException {
-        assertFalse(TableMetaDataBuilder.build("invalid_table", new 
SchemaBuilderMaterials(
-                databaseType, Collections.singletonMap("logic_db", 
dataSource), Arrays.asList(new CommonFixtureRule(), new 
DataNodeContainedFixtureRule()),
-                props)).isPresent());
-    }
-    
-    @Test
     public void assertLoadWithExistedTableName() throws SQLException {
         
assertFalse(TableMetaDataBuilder.load(Collections.singletonList("data_node_routed_table1"),
 new SchemaBuilderMaterials(
                 databaseType, Collections.singletonMap("logic_db", 
dataSource), Arrays.asList(new CommonFixtureRule(),
@@ -75,4 +63,14 @@ public final class TableMetaDataBuilderTest {
                 props)).isEmpty());
     }
     
+    @Test
+    public void assertDecorateForFederate() {
+        assertNotNull(TableMetaDataBuilder.decorateFederateTableMetaData(new 
TableMetaData(), Arrays.asList(new CommonFixtureRule(), new 
DataNodeContainedFixtureRule())));
+    }
+    
+    @Test
+    public void assertDecorateForKernel() {
+        assertNotNull(TableMetaDataBuilder.decorateKernelTableMetaData(new 
TableMetaData(), Arrays.asList(new CommonFixtureRule(), new 
DataNodeContainedFixtureRule())));
+    }
+    
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/fixture/loader/DataNodeContainedFixtureRuleBasedTableMetaDataBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/fixture/loader/DataNodeContainedFixtureRuleBasedTableMetaDataBuilder.java
index 7a03c7c..94f6637 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/fixture/loader/DataNodeContainedFixtureRuleBasedTableMetaDataBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/schema/fixture/loader/DataNodeContainedFixtureRuleBasedTableMetaDataBuilder.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.infra.metadata.schema.fixture.loader;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder;
 import 
org.apache.shardingsphere.infra.metadata.schema.fixture.rule.DataNodeContainedFixtureRule;
-import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 
 import java.sql.SQLException;
@@ -45,8 +44,7 @@ public final class 
DataNodeContainedFixtureRuleBasedTableMetaDataBuilder impleme
     
     @Override
     public TableMetaData decorate(final String tableName, final TableMetaData 
tableMetaData, final DataNodeContainedFixtureRule rule) {
-        ColumnMetaData columnMetaData = new ColumnMetaData("id", 1, true, 
true, false);
-        return new TableMetaData(tableName, 
Collections.singletonList(columnMetaData), Collections.emptyList());
+        return tableMetaData;
     }
     
     @Override
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/AlterTableStatementFederateRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/AlterTableStatementFederateRefresher.java
index e65747f..fcde3cc 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/AlterTableStatementFederateRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/AlterTableStatementFederateRefresher.java
@@ -48,6 +48,7 @@ public final class AlterTableStatementFederateRefresher 
implements FederateRefre
     }
     
     private Optional<TableMetaData> buildTableMetaData(final 
SchemaBuilderMaterials materials, final String tableName) throws SQLException {
-        return 
Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName),
 materials).get(tableName));
+        return 
Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName),
 materials).get(tableName))
+                .map(each -> 
TableMetaDataBuilder.decorateFederateTableMetaData(each, materials.getRules()));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
index 0162bb5..2903d0f 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
@@ -37,6 +37,7 @@ public final class CreateTableStatementFederateRefresher 
implements FederateRefr
     public void refresh(final FederateSchemaMetadata schema, final 
Collection<String> logicDataSourceNames,
                         final CreateTableStatement sqlStatement, final 
SchemaBuilderMaterials materials) throws SQLException {
         String tableName = 
sqlStatement.getTable().getTableName().getIdentifier().getValue();
-        
Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName),
 materials).get(tableName)).ifPresent(schema::renew);
+        
Optional.ofNullable(TableMetaDataBuilder.load(Collections.singletonList(tableName),
 materials).get(tableName))
+                .map(each -> 
TableMetaDataBuilder.decorateFederateTableMetaData(each, 
materials.getRules())).ifPresent(schema::renew);
     }
 }
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaBuilderTest.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaBuilderTest.java
index ed4514b..94b981d 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaBuilderTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaBuilderTest.java
@@ -23,7 +23,9 @@ import 
org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilder;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
+import 
org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.singletable.rule.SingleTableRule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,6 +37,7 @@ import javax.sql.DataSource;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
@@ -71,12 +74,16 @@ public final class SingleTableSchemaBuilderTest {
     public void assertBuildOfSingleTables() throws SQLException {
         Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
         when(dataSource.getConnection()).thenReturn(connection);
-        SingleTableRule singleTableRule = mockSingleTableRuleLoad(connection);
+        Collection<ShardingSphereRule> rules = 
Collections.singletonList(mockSingleTableRuleLoad(connection));
         mockSQLLoad(connection);
-        ShardingSphereSchema schema = SchemaBuilder.build(new 
SchemaBuilderMaterials(
-                databaseType, Collections.singletonMap("logic_db", 
dataSource), Collections.singletonList(singleTableRule), props));
-        assertThat(schema.getTables().size(), is(2));
-        assertActualOfSingleTables(schema.getTables().values());
+        Collection<TableMetaData> tableMetaDatas = 
TableMetaDataBuilder.load(Arrays.asList(singleTableNames),
+                new SchemaBuilderMaterials(databaseType, 
Collections.singletonMap("logic_db", dataSource), rules, props)).values();
+        ShardingSphereSchema schemaForKernel = 
SchemaBuilder.buildKernelSchema(tableMetaDatas, rules);
+        ShardingSphereSchema schemaForFederate = 
SchemaBuilder.buildFederateSchema(tableMetaDatas, rules);
+        assertThat(schemaForKernel.getTables().size(), is(2));
+        assertActualOfSingleTables(schemaForKernel.getTables().values());
+        assertThat(schemaForFederate.getTables().size(), is(2));
+        assertActualOfSingleTables(schemaForFederate.getTables().values());
     }
     
     @SneakyThrows(SQLException.class)
diff --git 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
index 19d878c..03b6726 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
@@ -29,14 +29,16 @@ import 
org.apache.shardingsphere.infra.metadata.resource.CachedDatabaseMetaData;
 import org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilder;
 import 
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
+import 
org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder;
+import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import org.apache.shardingsphere.infra.optimize.context.OptimizeContextFactory;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import 
org.apache.shardingsphere.infra.rule.builder.schema.SchemaRulesBuilderMaterials;
 import org.apache.shardingsphere.infra.rule.builder.schema.SchemaRulesBuilder;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 import org.apache.shardingsphere.mode.persist.PersistService;
 
 import javax.sql.DataSource;
@@ -51,6 +53,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Properties;
+import java.util.stream.Collectors;
 
 /**
  * Meta data contexts builder.
@@ -95,17 +98,21 @@ public final class MetaDataContextsBuilder {
             Collection<RuleConfiguration> ruleConfigs = 
schemaRuleConfigs.get(each);
             DatabaseType databaseType = 
DatabaseTypeRecognizer.getDatabaseType(dataSourceMap.values());
             Collection<ShardingSphereRule> rules = 
SchemaRulesBuilder.buildRules(new SchemaRulesBuilderMaterials(each, 
ruleConfigs, databaseType, dataSourceMap, props));
-            SchemaBuilderMaterials materials = new 
SchemaBuilderMaterials(databaseType, dataSourceMap, rules, props);
-            ShardingSphereSchema actualSchema = SchemaBuilder.build(materials);
+            Collection<TableMetaData> tableMetaDatas = 
TableMetaDataBuilder.load(getAllTableNames(rules), new 
SchemaBuilderMaterials(databaseType, dataSourceMap, rules, props)).values();
             ShardingSphereRuleMetaData ruleMetaData = new 
ShardingSphereRuleMetaData(ruleConfigs, rules);
             ShardingSphereResource resource = buildResource(databaseType, 
dataSourceMap);
-            actualMetaDataMap.put(each, new ShardingSphereMetaData(each, 
resource, ruleMetaData, actualSchema));
-            metaDataMap.put(each, new ShardingSphereMetaData(each, resource, 
ruleMetaData, SchemaBuilder.decorate(actualSchema, materials)));
+            actualMetaDataMap.put(each, new ShardingSphereMetaData(each, 
resource, ruleMetaData, SchemaBuilder.buildFederateSchema(tableMetaDatas, 
rules)));
+            metaDataMap.put(each, new ShardingSphereMetaData(each, resource, 
ruleMetaData, SchemaBuilder.buildKernelSchema(tableMetaDatas, rules)));
         }
         OptimizeContextFactory optimizeContextFactory = new 
OptimizeContextFactory(actualMetaDataMap);
         return new MetaDataContexts(persistService, metaDataMap, 
buildGlobalSchemaMetaData(metaDataMap), executorEngine, props, 
optimizeContextFactory);
     }
-
+    
+    private Collection<String> getAllTableNames(final 
Collection<ShardingSphereRule> rules) {
+        return rules.stream().filter(rule -> rule instanceof 
TableContainedRule)
+                .flatMap(shardingSphereRule -> ((TableContainedRule) 
shardingSphereRule).getTables().stream()).collect(Collectors.toSet());
+    }
+    
     private ShardingSphereRuleMetaData buildGlobalSchemaMetaData(final 
Map<String, ShardingSphereMetaData> mataDataMap) {
         return new ShardingSphereRuleMetaData(globalRuleConfigs, 
GlobalRulesBuilder.buildRules(globalRuleConfigs, mataDataMap));
     }

Reply via email to