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 1d2571b0769 Move load metadata logic to GenericSchemaBuilder (#17982)
1d2571b0769 is described below

commit 1d2571b0769e7f1fe8465981b66e84d341b0d448
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri May 27 11:44:44 2022 +0800

    Move load metadata logic to GenericSchemaBuilder (#17982)
    
    * rename SchemaMetaDataBuilderTest to GenericSchemaBuilderTest
    
    * move load logic to GenericSchemaBuilder
    
    * fix unit test
    
    * fix unit test
    
    * fix integration test
    
    * optimize code logic
---
 ...er.java => EncryptSchemaMetaDataDecorator.java} |  26 +-
 ...a.builder.spi.RuleBasedSchemaMetaDataDecorator} |   2 +-
 .../metadata/EncryptSchemaMetaDataBuilderTest.java | 385 -------------------
 .../EncryptSchemaMetaDataDecoratorTest.java        | 111 ++++++
 ...r.java => ShardingSchemaMetaDataDecorator.java} |  64 +---
 ...a.builder.spi.RuleBasedSchemaMetaDataDecorator} |   2 +-
 .../ShardingSchemaMetaDataBuilderTest.java         | 409 ---------------------
 .../ShardingSchemaMetaDataDecoratorTest.java       |  75 ++++
 .../schema/builder/GenericSchemaBuilder.java       |  45 +--
 ....java => RuleBasedSchemaMetaDataDecorator.java} |  20 +-
 ...> RuleBasedSchemaMetaDataDecoratorFactory.java} |  12 +-
 .../schema/builder/GenericSchemaBuilderTest.java   | 117 ++++++
 .../schema/builder/SchemaMetaDataBuilderTest.java  |  78 ----
 ...leBasedSchemaMetaDataDecoratorFactoryTest.java} |   6 +-
 ...a => CommonFixtureSchemaMetaDataDecorator.java} |  14 +-
 ...edFixtureRuleBasedSchemaMetaDataDecorator.java} |  24 +-
 ...a.builder.spi.RuleBasedSchemaMetaDataDecorator} |   4 +-
 .../RenameTableStatementSchemaRefresherTest.java   |   6 +-
 .../customized/fixture/CommonFixtureRule.java      |  36 --
 ...chema.builder.spi.RuleBasedTableMetaDataBuilder |  18 -
 .../metadata/fixture/CommonFixtureRule.java        |  36 --
 .../CommonFixtureSchemaMetaDataBuilder.java        |  53 ---
 ...hema.builder.spi.RuleBasedSchemaMetaDataBuilder |  18 -
 ...ava => SingleTableSchemaMetaDataDecorator.java} |  27 +-
 ...a.builder.spi.RuleBasedSchemaMetaDataDecorator} |   2 +-
 .../SingleTableSchemaMetaDataBuilderTest.java      | 123 +------
 .../data/pipeline/cases/base/BaseITCase.java       |   2 +-
 27 files changed, 391 insertions(+), 1324 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataBuilder.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
similarity index 77%
rename from 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataBuilder.java
rename to 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
index c79e436814a..232d1b65c64 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataBuilder.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
@@ -22,42 +22,26 @@ import org.apache.shardingsphere.encrypt.rule.EncryptColumn;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.SchemaMetaDataLoaderEngine;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.TableMetaDataLoaderMaterial;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 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.metadata.database.schema.util.TableMetaDataUtil;
 
-import java.sql.SQLException;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
- * Schema meta data builder for encrypt.
+ * Schema meta data decorator for encrypt.
  */
-public final class EncryptSchemaMetaDataBuilder implements 
RuleBasedSchemaMetaDataBuilder<EncryptRule> {
+public final class EncryptSchemaMetaDataDecorator implements 
RuleBasedSchemaMetaDataDecorator<EncryptRule> {
     
     @Override
-    public Map<String, SchemaMetaData> load(final Collection<String> 
tableNames, final EncryptRule rule, final GenericSchemaBuilderMaterials 
materials) throws SQLException {
-        Collection<String> needLoadTables = tableNames.stream().filter(each -> 
rule.findEncryptTable(each).isPresent()).collect(Collectors.toList());
-        if (needLoadTables.isEmpty()) {
-            return Collections.emptyMap();
-        }
-        Collection<TableMetaDataLoaderMaterial> tableMetaDataLoaderMaterials = 
TableMetaDataUtil.getTableMetaDataLoadMaterial(needLoadTables, materials, 
false);
-        return tableMetaDataLoaderMaterials.isEmpty() ? Collections.emptyMap() 
: SchemaMetaDataLoaderEngine.load(tableMetaDataLoaderMaterials, 
materials.getStorageType());
-    }
-    
-    @Override
-    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final EncryptRule rule, final 
GenericSchemaBuilderMaterials materials) throws SQLException {
-        Map<String, SchemaMetaData> result = new LinkedHashMap<>();
+    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final EncryptRule rule, final 
GenericSchemaBuilderMaterials materials) {
+        Map<String, SchemaMetaData> result = new 
LinkedHashMap<>(schemaMetaDataMap.size(), 1);
         for (Entry<String, SchemaMetaData> entry : 
schemaMetaDataMap.entrySet()) {
             Map<String, TableMetaData> tables = new 
LinkedHashMap<>(entry.getValue().getTables().size(), 1);
             for (Entry<String, TableMetaData> tableEntry : 
entry.getValue().getTables().entrySet()) {
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
similarity index 98%
rename from 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
rename to 
shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
index 936cbb85056..d256c286bbc 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.encrypt.metadata.EncryptSchemaMetaDataBuilder
+org.apache.shardingsphere.encrypt.metadata.EncryptSchemaMetaDataDecorator
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataBuilderTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataBuilderTest.java
deleted file mode 100644
index b749f8a98ba..00000000000
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataBuilderTest.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.encrypt.metadata;
-
-import org.apache.shardingsphere.encrypt.rule.EncryptColumn;
-import org.apache.shardingsphere.encrypt.rule.EncryptRule;
-import org.apache.shardingsphere.encrypt.rule.EncryptTable;
-import org.apache.shardingsphere.encrypt.spi.context.EncryptColumnDataType;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilderFactory;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
-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.singletable.rule.SingleTableRule;
-import org.apache.shardingsphere.test.mock.MockedDataSource;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.startsWith;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public final class EncryptSchemaMetaDataBuilderTest {
-    
-    private static final String TABLE_NAME = "t_encrypt";
-    
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private DatabaseType databaseType;
-    
-    private DataSource dataSource;
-    
-    @Before
-    public void setUp() throws SQLException {
-        Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
-        mockH2ResultSet(connection);
-        mockMySQLResultSet(connection);
-        mockOracleResultSet(connection);
-        mockPGResultSet(connection);
-        mockSQLServerResultSet(connection);
-        mockDatabase(connection);
-        dataSource = new MockedDataSource(connection);
-    }
-    
-    private void mockSQLServerResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSet();
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT obj.name AS 
TABLE_NAME, col.name AS COLUMN_NAME, t.name AS 
DATA_TYPE"))).thenReturn(preparedStatement);
-    }
-    
-    private void mockPGResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSet();
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT table_name, 
column_name, ordinal_position, data_type, udt_name, column_default, 
table_schema"))).thenReturn(preparedStatement);
-    }
-    
-    private void mockOracleResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSet();
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT OWNER AS 
TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, 
DATA_TYPE"))).thenReturn(preparedStatement);
-    }
-    
-    private void mockMySQLResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSet();
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT TABLE_NAME, 
COLUMN_NAME, DATA_TYPE, COLUMN_KEY, EXTRA, COLLATION_NAME, ORDINAL_POSITION 
FROM information_schema.columns")))
-                .thenReturn(preparedStatement);
-    }
-    
-    private void mockH2ResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSet();
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT TABLE_CATALOG, 
TABLE_NAME"))).thenReturn(preparedStatement);
-    }
-    
-    private void mockDatabase(final Connection connection) throws SQLException 
{
-        DatabaseMetaData database = mock(DatabaseMetaData.class, 
RETURNS_DEEP_STUBS);
-        when(connection.getMetaData()).thenReturn(database);
-        ResultSet dataTypeResultSet = createDataTypeResultSet();
-        when(database.getTypeInfo()).thenReturn(dataTypeResultSet);
-        ResultSet tableResultSet = createTableResultSet();
-        ResultSet columnResultSet = createColumnResultSet();
-        when(database.getTables(any(), any(), any(), 
eq(null))).thenReturn(tableResultSet);
-        when(database.getColumns(any(), any(), any(), 
eq("%"))).thenReturn(columnResultSet);
-    }
-    
-    private ResultSet createTableResultSet() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        return result;
-    }
-    
-    private ResultSet createColumnResultSet() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, true, true, false);
-        when(result.getString("TABLE_NAME")).thenReturn(TABLE_NAME);
-        when(result.getString("table_name")).thenReturn(TABLE_NAME);
-        when(result.getString("COLUMN_NAME")).thenReturn("id", "pwd_cipher", 
"pwd_plain");
-        when(result.getString("column_name")).thenReturn("id", "pwd_cipher", 
"pwd_plain");
-        when(result.getString("TYPE_NAME")).thenReturn("INT");
-        when(result.getString("DATA_TYPE")).thenReturn("INT");
-        when(result.getString("udt_name")).thenReturn("INT");
-        when(result.getString("table_schema")).thenReturn("public");
-        return result;
-    }
-    
-    private ResultSet createDataTypeResultSet() throws SQLException {
-        ResultSet dataTypeResultSet = mock(ResultSet.class);
-        when(dataTypeResultSet.next()).thenReturn(true, true, false);
-        when(dataTypeResultSet.getString("TYPE_NAME")).thenReturn("INT", 
"VARCHAR");
-        when(dataTypeResultSet.getInt("DATA_TYPE")).thenReturn(1, 12);
-        return dataTypeResultSet;
-    }
-    
-    @Test
-    public void assertLoadByTablesWithDefaultLoader() throws SQLException {
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        EncryptSchemaMetaDataBuilder loader = 
getEncryptMetaDataBuilder(encryptRule, rules);
-        
when(databaseType.formatTableNamePattern(TABLE_NAME)).thenReturn(TABLE_NAME);
-        Map<String, SchemaMetaData> actual = 
loader.load(Collections.singleton(TABLE_NAME), encryptRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("logic_db", dataSource), rules, new 
ConfigurationProperties(new Properties()), "logic_db"));
-        TableMetaData tableMetaData = 
actual.get("logic_db").getTables().values().iterator().next();
-        List<String> columnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
-        
assertThat(tableMetaData.getColumns().get(columnNames.get(0)).getName(), 
is("id"));
-        
assertThat(tableMetaData.getColumns().get(columnNames.get(1)).getName(), 
is("pwd_cipher"));
-    }
-    
-    @Test
-    public void assertLoadByTablesH2() throws SQLException {
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        loadByH2(getEncryptMetaDataBuilder(encryptRule, rules), 
Collections.singleton(TABLE_NAME), rules, encryptRule);
-    }
-    
-    private void loadByH2(final EncryptSchemaMetaDataBuilder loader, final 
Collection<String> tableNames, final Collection<ShardingSphereRule> rules,
-                          final EncryptRule encryptRule) throws SQLException {
-        when(databaseType.getType()).thenReturn("H2");
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
encryptRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("logic_db", dataSource), rules, new 
ConfigurationProperties(new Properties()), "logic_db"));
-        assertResult(actual, "logic_db");
-    }
-    
-    @Test
-    public void assertLoadByTablesMySQL() throws SQLException {
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        loadByMySQL(getEncryptMetaDataBuilder(encryptRule, rules), 
Collections.singleton(TABLE_NAME), rules, encryptRule);
-    }
-    
-    private void loadByMySQL(final EncryptSchemaMetaDataBuilder loader, final 
Collection<String> tableNames, final Collection<ShardingSphereRule> rules,
-                             final EncryptRule encryptRule) throws 
SQLException {
-        when(databaseType.getType()).thenReturn("MySQL");
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
encryptRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("logic_db", dataSource), rules, new 
ConfigurationProperties(new Properties()), "logic_db"));
-        assertResult(actual, "logic_db");
-    }
-    
-    @Test
-    public void assertLoadByTablesOracle() throws SQLException {
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        loadByOracle(getEncryptMetaDataBuilder(encryptRule, rules), 
Collections.singleton(TABLE_NAME), rules, encryptRule);
-    }
-    
-    private void loadByOracle(final EncryptSchemaMetaDataBuilder loader, final 
Collection<String> tableNames, final Collection<ShardingSphereRule> rules,
-                              final EncryptRule encryptRule) throws 
SQLException {
-        when(databaseType.getType()).thenReturn("Oracle");
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
encryptRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("logic_db", dataSource), rules, new 
ConfigurationProperties(new Properties()), "logic_db"));
-        assertResult(actual, "logic_db");
-    }
-    
-    @Test
-    public void assertLoadByTablesPGSQL() throws SQLException {
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        loadByPostgreSQL(getEncryptMetaDataBuilder(encryptRule, rules), 
Collections.singleton(TABLE_NAME), rules, encryptRule);
-    }
-    
-    private void loadByPostgreSQL(final EncryptSchemaMetaDataBuilder loader, 
final Collection<String> tableNames, final Collection<ShardingSphereRule> rules,
-                                  final EncryptRule encryptRule) throws 
SQLException {
-        when(databaseType.getType()).thenReturn("PostgreSQL");
-        ResultSet roleTableGrantsResultSet = mockRoleTableGrantsResultSet();
-        when(dataSource.getConnection().prepareStatement(startsWith("SELECT 
table_name FROM 
information_schema.role_table_grants")).executeQuery()).thenReturn(roleTableGrantsResultSet);
-        ResultSet schemaMetaData = mockSchemaMetaData();
-        
when(dataSource.getConnection().getMetaData().getSchemas()).thenReturn(schemaMetaData);
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
encryptRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("logic_db", dataSource), rules, new 
ConfigurationProperties(new Properties()), "logic_db"));
-        assertResult(actual, "public");
-    }
-    
-    private ResultSet mockSchemaMetaData() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        when(result.getString("TABLE_SCHEM")).thenReturn("public");
-        return result;
-    }
-    
-    private ResultSet mockRoleTableGrantsResultSet() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        when(result.getString("table_name")).thenReturn(TABLE_NAME);
-        return result;
-    }
-    
-    @Test
-    public void assertLoadByTablesSQLServer() throws SQLException {
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        loadBySQLServer(getEncryptMetaDataBuilder(encryptRule, rules), 
Collections.singleton(TABLE_NAME), rules, encryptRule);
-    }
-    
-    private void loadBySQLServer(final EncryptSchemaMetaDataBuilder loader, 
final Collection<String> tableNames, final Collection<ShardingSphereRule> rules,
-                                 final EncryptRule encryptRule) throws 
SQLException {
-        when(databaseType.getType()).thenReturn("SQLServer");
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
encryptRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("logic_db", dataSource), rules, new 
ConfigurationProperties(new Properties()), "logic_db"));
-        assertResult(actual, "logic_db");
-    }
-    
-    private void assertResult(final Map<String, SchemaMetaData> 
schemaMetaDataMap, final String schemaName) {
-        TableMetaData tableMetaData = 
schemaMetaDataMap.get(schemaName).getTables().values().iterator().next();
-        List<String> columnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
-        
assertThat(tableMetaData.getColumns().get(columnNames.get(0)).getName(), 
is("id"));
-        
assertThat(tableMetaData.getColumns().get(columnNames.get(1)).getName(), 
is("pwd_cipher"));
-    }
-    
-    @Test
-    public void assertLoadByNotExistedTables() throws SQLException {
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        EncryptSchemaMetaDataBuilder loader = new 
EncryptSchemaMetaDataBuilder();
-        Map<String, SchemaMetaData> actual = 
loader.load(Collections.singleton("not_existed_table"), encryptRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("logic_db", dataSource), rules, new 
ConfigurationProperties(new Properties()), "logic_db"));
-        assertTrue(actual.isEmpty());
-    }
-    
-    @Test
-    public void assertLoadByTablesAndMultiDataSources() throws SQLException {
-        
when(databaseType.formatTableNamePattern(TABLE_NAME)).thenReturn(TABLE_NAME);
-        Map<String, DataSource> dataSourceMap = new HashMap<>();
-        dataSourceMap.put("logic_db", dataSource);
-        dataSourceMap.put("logic_db_2", new MockedDataSource());
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        EncryptSchemaMetaDataBuilder loader = 
getEncryptMetaDataBuilder(encryptRule, rules);
-        Map<String, SchemaMetaData> actual = 
loader.load(Collections.singleton(TABLE_NAME),
-                encryptRule, new GenericSchemaBuilderMaterials(databaseType, 
databaseType, dataSourceMap, rules, new ConfigurationProperties(new 
Properties()), "logic_db"));
-        TableMetaData tableMetaData = 
actual.get("logic_db").getTables().values().iterator().next();
-        List<String> actualColumnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(0)).getName(), 
is("id"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(1)).getName(), 
is("pwd_cipher"));
-    }
-    
-    @Test
-    public void assertLoadByNotExistedTableAndMultiDataSources() throws 
SQLException {
-        EncryptRule encryptRule = createEncryptRule();
-        Collection<ShardingSphereRule> rules = 
Arrays.asList(createSingleTableRule(), encryptRule);
-        Map<String, DataSource> dataSourceMap = new HashMap<>();
-        dataSourceMap.put("logic_db", dataSource);
-        dataSourceMap.put("logic_db_2", new MockedDataSource());
-        EncryptSchemaMetaDataBuilder loader = new 
EncryptSchemaMetaDataBuilder();
-        Map<String, SchemaMetaData> actual = 
loader.load(Collections.singleton("not_existed_table"),
-                encryptRule, new GenericSchemaBuilderMaterials(databaseType, 
databaseType, dataSourceMap, rules, new ConfigurationProperties(new 
Properties()), "logic_db"));
-        assertTrue(actual.isEmpty());
-    }
-    
-    @Test
-    public void assertDecorate() throws SQLException {
-        EncryptRule rule = createEncryptRule();
-        EncryptSchemaMetaDataBuilder loader = getEncryptMetaDataBuilder(rule, 
Collections.singleton(rule));
-        Map<String, TableMetaData> tableMetaDataMap = new LinkedHashMap<>();
-        tableMetaDataMap.put("t_encrypt", createTableMetaData());
-        TableMetaData actual = 
loader.decorate(Collections.singletonMap("logic_db",
-                new SchemaMetaData("logic_db", tableMetaDataMap)), rule, 
mock(GenericSchemaBuilderMaterials.class)).get("logic_db").getTables().get("t_encrypt");
-        assertThat(actual.getColumns().size(), is(2));
-        assertTrue(actual.getColumns().containsKey("id"));
-        assertTrue(actual.getColumns().containsKey("pwd"));
-    }
-    
-    @Test
-    public void assertDecorateWithConfigDataType() throws SQLException {
-        EncryptRule rule = createEncryptRuleWithDataTypeConfig();
-        EncryptSchemaMetaDataBuilder loader = getEncryptMetaDataBuilder(rule, 
Collections.singleton(rule));
-        Map<String, TableMetaData> tableMetaDataMap = new LinkedHashMap<>();
-        tableMetaDataMap.put("t_encrypt", createTableMetaData());
-        GenericSchemaBuilderMaterials materials = 
mock(GenericSchemaBuilderMaterials.class, RETURNS_DEEP_STUBS);
-        
when(materials.getDataSourceMap().values().stream().findAny()).thenReturn(Optional.of(dataSource));
-        TableMetaData actual = 
loader.decorate(Collections.singletonMap("logic_db", new 
SchemaMetaData("logic_db", tableMetaDataMap)),
-                rule, materials).get("logic_db").getTables().get("t_encrypt");
-        assertThat(actual.getColumns().size(), is(2));
-        assertTrue(actual.getColumns().containsKey("id"));
-        assertTrue(actual.getColumns().containsKey("pwd"));
-        assertThat(actual.getColumns().get("pwd").getDataType(), is(12));
-    }
-    
-    private EncryptRule createEncryptRuleWithDataTypeConfig() {
-        EncryptRule result = createEncryptRule();
-        assertTrue(result.findEncryptTable(TABLE_NAME).isPresent());
-        EncryptTable encryptTable = result.findEncryptTable(TABLE_NAME).get();
-        EncryptColumn encryptColumn = mock(EncryptColumn.class);
-        EncryptColumnDataType encryptColumnDataType = 
mock(EncryptColumnDataType.class);
-        when(encryptColumnDataType.getDataType()).thenReturn(12);
-        
when(encryptColumn.getLogicDataType()).thenReturn(encryptColumnDataType);
-        
when(encryptTable.findEncryptColumn("pwd")).thenReturn(Optional.of(encryptColumn));
-        return result;
-    }
-    
-    private EncryptRule createEncryptRule() {
-        EncryptRule result = mock(EncryptRule.class);
-        EncryptTable encryptTable = mock(EncryptTable.class);
-        
when(result.findEncryptTable(TABLE_NAME)).thenReturn(Optional.of(encryptTable));
-        
when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.emptyList());
-        
when(encryptTable.getPlainColumns()).thenReturn(Collections.singleton("pwd_plain"));
-        when(encryptTable.isCipherColumn("pwd_cipher")).thenReturn(true);
-        when(encryptTable.getLogicColumn("pwd_cipher")).thenReturn("pwd");
-        return result;
-    }
-    
-    private TableMetaData createTableMetaData() {
-        Collection<ColumnMetaData> columns = Arrays.asList(new 
ColumnMetaData("id", 1, true, true, true),
-                new ColumnMetaData("pwd_cipher", 2, false, false, true),
-                new ColumnMetaData("pwd_plain", 2, false, false, true));
-        return new TableMetaData(TABLE_NAME, columns, Collections.emptyList(), 
Collections.emptyList());
-    }
-    
-    private SingleTableRule createSingleTableRule() {
-        return mock(SingleTableRule.class);
-    }
-    
-    private EncryptSchemaMetaDataBuilder getEncryptMetaDataBuilder(final 
EncryptRule encryptRule, final Collection<ShardingSphereRule> rules) {
-        return (EncryptSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(encryptRule);
-    }
-}
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
new file mode 100644
index 00000000000..274edbc4837
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.encrypt.metadata;
+
+import org.apache.shardingsphere.encrypt.rule.EncryptColumn;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.spi.context.EncryptColumnDataType;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecoratorFactory;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
+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.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public final class EncryptSchemaMetaDataDecoratorTest {
+    
+    private static final String TABLE_NAME = "t_encrypt";
+    
+    @Test
+    public void assertDecorate() {
+        EncryptRule rule = createEncryptRule();
+        EncryptSchemaMetaDataDecorator loader = 
getEncryptMetaDataBuilder(rule, Collections.singleton(rule));
+        Map<String, TableMetaData> tableMetaDataMap = new LinkedHashMap<>();
+        tableMetaDataMap.put("t_encrypt", createTableMetaData());
+        TableMetaData actual = 
loader.decorate(Collections.singletonMap("logic_db",
+                new SchemaMetaData("logic_db", tableMetaDataMap)), rule, 
mock(GenericSchemaBuilderMaterials.class)).get("logic_db").getTables().get("t_encrypt");
+        assertThat(actual.getColumns().size(), is(2));
+        assertTrue(actual.getColumns().containsKey("id"));
+        assertTrue(actual.getColumns().containsKey("pwd"));
+    }
+    
+    @Test
+    public void assertDecorateWithConfigDataType() {
+        EncryptRule rule = createEncryptRuleWithDataTypeConfig();
+        EncryptSchemaMetaDataDecorator loader = 
getEncryptMetaDataBuilder(rule, Collections.singleton(rule));
+        Map<String, TableMetaData> tableMetaDataMap = new LinkedHashMap<>();
+        tableMetaDataMap.put("t_encrypt", createTableMetaData());
+        GenericSchemaBuilderMaterials materials = 
mock(GenericSchemaBuilderMaterials.class, RETURNS_DEEP_STUBS);
+        TableMetaData actual = 
loader.decorate(Collections.singletonMap("logic_db",
+                new SchemaMetaData("logic_db", tableMetaDataMap)), rule, 
materials).get("logic_db").getTables().get("t_encrypt");
+        assertThat(actual.getColumns().size(), is(2));
+        assertTrue(actual.getColumns().containsKey("id"));
+        assertTrue(actual.getColumns().containsKey("pwd"));
+        assertThat(actual.getColumns().get("pwd").getDataType(), is(12));
+    }
+    
+    private EncryptRule createEncryptRuleWithDataTypeConfig() {
+        EncryptRule result = createEncryptRule();
+        assertTrue(result.findEncryptTable(TABLE_NAME).isPresent());
+        EncryptTable encryptTable = result.findEncryptTable(TABLE_NAME).get();
+        EncryptColumn encryptColumn = mock(EncryptColumn.class);
+        EncryptColumnDataType encryptColumnDataType = 
mock(EncryptColumnDataType.class);
+        when(encryptColumnDataType.getDataType()).thenReturn(12);
+        
when(encryptColumn.getLogicDataType()).thenReturn(encryptColumnDataType);
+        
when(encryptTable.findEncryptColumn("pwd")).thenReturn(Optional.of(encryptColumn));
+        return result;
+    }
+    
+    private EncryptRule createEncryptRule() {
+        EncryptRule result = mock(EncryptRule.class);
+        EncryptTable encryptTable = mock(EncryptTable.class);
+        
when(result.findEncryptTable(TABLE_NAME)).thenReturn(Optional.of(encryptTable));
+        
when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.emptyList());
+        
when(encryptTable.getPlainColumns()).thenReturn(Collections.singleton("pwd_plain"));
+        when(encryptTable.isCipherColumn("pwd_cipher")).thenReturn(true);
+        when(encryptTable.getLogicColumn("pwd_cipher")).thenReturn("pwd");
+        return result;
+    }
+    
+    private TableMetaData createTableMetaData() {
+        Collection<ColumnMetaData> columns = Arrays.asList(new 
ColumnMetaData("id", 1, true, true, true),
+                new ColumnMetaData("pwd_cipher", 2, false, false, true),
+                new ColumnMetaData("pwd_plain", 2, false, false, true));
+        return new TableMetaData(TABLE_NAME, columns, Collections.emptyList(), 
Collections.emptyList());
+    }
+    
+    private EncryptSchemaMetaDataDecorator getEncryptMetaDataBuilder(final 
EncryptRule encryptRule, final Collection<ShardingSphereRule> rules) {
+        return (EncryptSchemaMetaDataDecorator) 
RuleBasedSchemaMetaDataDecoratorFactory.getInstances(rules).get(encryptRule);
+    }
+}
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataBuilder.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
similarity index 72%
rename from 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataBuilder.java
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
index fd8b1abccd4..62ded5e6752 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataBuilder.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
@@ -23,22 +23,17 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.SchemaMetaDataLoaderEngine;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.TableMetaDataLoaderMaterial;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 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.metadata.database.schema.util.TableMetaDataUtil;
 import org.apache.shardingsphere.sharding.constant.ShardingOrder;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.sharding.rule.TableRule;
 
-import java.sql.SQLException;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
@@ -48,36 +43,21 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
- * Schema meta data builder for sharding.
+ * Schema meta data decorator for sharding.
  */
-public final class ShardingSchemaMetaDataBuilder implements 
RuleBasedSchemaMetaDataBuilder<ShardingRule> {
+public final class ShardingSchemaMetaDataDecorator implements 
RuleBasedSchemaMetaDataDecorator<ShardingRule> {
     
     @Override
-    public Map<String, SchemaMetaData> load(final Collection<String> 
tableNames, final ShardingRule rule, final GenericSchemaBuilderMaterials 
materials) throws SQLException {
-        Collection<String> needLoadTables = tableNames.stream().filter(each -> 
rule.findTableRule(each).isPresent() || 
rule.isBroadcastTable(each)).collect(Collectors.toList());
-        if (needLoadTables.isEmpty()) {
-            return Collections.emptyMap();
-        }
+    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final ShardingRule rule, final 
GenericSchemaBuilderMaterials materials) {
+        Map<String, SchemaMetaData> result = new 
LinkedHashMap<>(schemaMetaDataMap.size(), 1);
         boolean isCheckingMetaData = 
materials.getProps().getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED);
-        Collection<TableMetaDataLoaderMaterial> tableMetaDataLoaderMaterials = 
TableMetaDataUtil.getTableMetaDataLoadMaterial(needLoadTables, materials, 
isCheckingMetaData);
-        if (tableMetaDataLoaderMaterials.isEmpty()) {
-            return Collections.emptyMap();
-        }
-        Map<String, SchemaMetaData> result = 
SchemaMetaDataLoaderEngine.load(tableMetaDataLoaderMaterials, 
materials.getStorageType());
-        if (isCheckingMetaData) {
-            checkMetaData(result, rule);
-        }
-        return result;
-    }
-    
-    @Override
-    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final ShardingRule rule, final 
GenericSchemaBuilderMaterials materials) throws SQLException {
-        Map<String, SchemaMetaData> result = new LinkedHashMap<>();
         for (Entry<String, SchemaMetaData> entry : 
schemaMetaDataMap.entrySet()) {
             Map<String, TableMetaData> tables = new 
LinkedHashMap<>(entry.getValue().getTables().size(), 1);
-            for (Entry<String, TableMetaData> tableEntry : 
entry.getValue().getTables().entrySet()) {
-                TableMetaData tableMetaData = decorate(tableEntry.getValue(), 
rule);
-                tables.put(tableMetaData.getName(), tableMetaData);
+            for (Entry<String, Collection<TableMetaData>> tableEntry : 
getLogicTableMetaDataMap(entry.getValue(), rule).entrySet()) {
+                if (isCheckingMetaData) {
+                    checkUniformed(tableEntry.getKey(), tableEntry.getValue());
+                }
+                tables.put(tableEntry.getKey(), 
tableEntry.getValue().iterator().next());
             }
             result.put(entry.getKey(), new SchemaMetaData(entry.getKey(), 
tables));
         }
@@ -95,32 +75,20 @@ public final class ShardingSchemaMetaDataBuilder implements 
RuleBasedSchemaMetaD
         return new TableMetaData(tableRule.getLogicTable(), 
columnMetaDataList, indexMetaDataList, constraintMetaDataList);
     }
     
-    private void checkMetaData(final Map<String, SchemaMetaData> 
schemaMetaDataMap, final ShardingRule rule) {
-        for (Entry<String, SchemaMetaData> entry : 
schemaMetaDataMap.entrySet()) {
-            Map<String, Collection<TableMetaData>> logicTableMetaDataMap = 
getLogicTableMetaDataMap(entry.getValue(), rule);
-            for (Entry<String, Collection<TableMetaData>> tableEntry : 
logicTableMetaDataMap.entrySet()) {
-                checkUniformed(tableEntry.getKey(), tableEntry.getValue(), 
rule);
-            }
-        }
-    }
-    
     private Map<String, Collection<TableMetaData>> 
getLogicTableMetaDataMap(final SchemaMetaData schemaMetaData, final 
ShardingRule rule) {
         Map<String, Collection<TableMetaData>> result = new LinkedHashMap<>();
         for (Entry<String, TableMetaData> entry : 
schemaMetaData.getTables().entrySet()) {
-            Optional<String> logicTable = 
rule.findLogicTableByActualTable(entry.getKey());
-            if (!logicTable.isPresent()) {
-                continue;
-            }
-            Collection<TableMetaData> tableMetaDataList = 
result.computeIfAbsent(logicTable.get(), key -> new LinkedList<>());
-            tableMetaDataList.add(entry.getValue());
+            String logicTableName = 
rule.findLogicTableByActualTable(entry.getKey()).orElse(entry.getKey());
+            Collection<TableMetaData> tableMetaDataList = 
result.computeIfAbsent(logicTableName, key -> new LinkedList<>());
+            tableMetaDataList.add(decorate(entry.getValue(), rule));
         }
         return result;
     }
     
-    private void checkUniformed(final String logicTableName, final 
Collection<TableMetaData> tableMetaDataList, final ShardingRule rule) {
-        TableMetaData sample = decorate(tableMetaDataList.iterator().next(), 
rule);
+    private void checkUniformed(final String logicTableName, final 
Collection<TableMetaData> tableMetaDataList) {
+        TableMetaData sample = tableMetaDataList.iterator().next();
         Collection<TableMetaDataViolation> violations = 
tableMetaDataList.stream()
-                .filter(each -> !sample.equals(decorate(each, rule))).map(each 
-> new TableMetaDataViolation(each.getName(), 
each)).collect(Collectors.toList());
+                .filter(each -> !sample.equals(each)).map(each -> new 
TableMetaDataViolation(each.getName(), each)).collect(Collectors.toList());
         throwExceptionIfNecessary(violations, logicTableName);
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
similarity index 98%
rename from 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
rename to 
shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
index 53dc974885c..0f004107c12 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.sharding.metadata.ShardingSchemaMetaDataBuilder
+org.apache.shardingsphere.sharding.metadata.ShardingSchemaMetaDataDecorator
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataBuilderTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataBuilderTest.java
deleted file mode 100644
index 5fded3d02a0..00000000000
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataBuilderTest.java
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.sharding.metadata;
-
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.database.type.dialect.OracleDatabaseType;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilderFactory;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
-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.sharding.api.config.ShardingRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
-import 
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
-import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.startsWith;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ShardingSchemaMetaDataBuilderTest {
-    
-    private static final String TABLE_NAME = "t_order";
-    
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private DatabaseType databaseType;
-    
-    @Mock
-    private DataSource dataSource;
-    
-    @Mock
-    private ConfigurationProperties props;
-    
-    private ShardingRule shardingRule;
-    
-    @Before
-    public void setUp() throws SQLException {
-        Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
-        when(dataSource.getConnection()).thenReturn(connection);
-        shardingRule = createShardingRule();
-        mockH2ResultSet(connection);
-        mockMySQLResultSet(connection);
-        mockOracleResultSet(connection);
-        mockPGResultSet(connection);
-        mockSQLServerResultSet(connection);
-        mockDatabase(connection);
-    }
-    
-    private ShardingRule createShardingRule() {
-        ShardingTableRuleConfiguration tableRuleConfig = new 
ShardingTableRuleConfiguration(TABLE_NAME, "ds.t_order_${0..1}");
-        tableRuleConfig.setKeyGenerateStrategy(new 
KeyGenerateStrategyConfiguration("product_id", "snowflake"));
-        ShardingRuleConfiguration shardingRuleConfig = new 
ShardingRuleConfiguration();
-        shardingRuleConfig.getTables().add(tableRuleConfig);
-        return new ShardingRule(shardingRuleConfig, 
Collections.singletonList("ds"));
-    }
-    
-    private void mockSQLServerResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSet("t_order_0");
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT obj.name AS 
TABLE_NAME, col.name AS COLUMN_NAME, t.name AS 
DATA_TYPE"))).thenReturn(preparedStatement);
-        ResultSet indexResultSet = createIndexResultSet();
-        PreparedStatement indexStatement = mock(PreparedStatement.class);
-        when(indexStatement.executeQuery()).thenReturn(indexResultSet);
-        when(connection.prepareStatement(startsWith("SELECT a.name AS 
INDEX_NAME, c.name AS TABLE_NAME FROM sys.indexes 
a"))).thenReturn(indexStatement);
-    }
-    
-    private void mockPGResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSetForPostgreSQL();
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT table_name, 
column_name, ordinal_position, data_type, udt_name, column_default, 
table_schema"))).thenReturn(preparedStatement);
-        ResultSet indexResultSet = createPostgreSQLIndexResultSet();
-        PreparedStatement indexStatement = mock(PreparedStatement.class);
-        when(indexStatement.executeQuery()).thenReturn(indexResultSet);
-        when(connection.prepareStatement(startsWith("SELECT tablename, 
indexname, schemaname FROM pg_indexes WHERE 
schemaname"))).thenReturn(indexStatement);
-    }
-    
-    private void mockOracleResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSetForOracle();
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT OWNER AS 
TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, 
DATA_TYPE"))).thenReturn(preparedStatement);
-        ResultSet indexResultSet = createIndexResultSetForOracle();
-        PreparedStatement indexStatement = mock(PreparedStatement.class);
-        when(indexStatement.executeQuery()).thenReturn(indexResultSet);
-        when(connection.prepareStatement(startsWith("SELECT OWNER AS 
TABLE_SCHEMA, TABLE_NAME, INDEX_NAME FROM ALL_INDEXES WHERE 
OWNER"))).thenReturn(indexStatement);
-    }
-    
-    private void mockMySQLResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSet("t_order_0");
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT TABLE_NAME, 
COLUMN_NAME, DATA_TYPE, COLUMN_KEY, EXTRA, COLLATION_NAME, ORDINAL_POSITION 
FROM information_schema.columns")))
-                .thenReturn(preparedStatement);
-        ResultSet indexResultSet = createIndexResultSet();
-        PreparedStatement indexStatement = mock(PreparedStatement.class);
-        when(indexStatement.executeQuery()).thenReturn(indexResultSet);
-        when(connection.prepareStatement(startsWith("SELECT TABLE_NAME, 
INDEX_NAME FROM information_schema.statistics WHERE 
TABLE_SCHEMA"))).thenReturn(indexStatement);
-    }
-    
-    private void mockH2ResultSet(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = createColumnResultSet("t_order_0");
-        PreparedStatement preparedStatement = mock(PreparedStatement.class);
-        when(preparedStatement.executeQuery()).thenReturn(resultSet);
-        when(connection.prepareStatement(startsWith("SELECT TABLE_CATALOG, 
TABLE_NAME"))).thenReturn(preparedStatement);
-        ResultSet indexResultSet = createIndexResultSet();
-        PreparedStatement indexStatement = mock(PreparedStatement.class);
-        when(indexStatement.executeQuery()).thenReturn(indexResultSet);
-        when(connection.prepareStatement(startsWith("SELECT TABLE_CATALOG, 
TABLE_NAME, INDEX_NAME, COLUMN_NAME FROM 
INFORMATION_SCHEMA.INDEXES"))).thenReturn(indexStatement);
-    }
-    
-    private ResultSet createIndexResultSet() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        
when(result.getString("INDEX_NAME")).thenReturn("order_index_t_order_t_order_0");
-        when(result.getString("TABLE_NAME")).thenReturn("t_order_0");
-        return result;
-    }
-    
-    private ResultSet createPostgreSQLIndexResultSet() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        
when(result.getString("indexname")).thenReturn("order_index_t_order_t_order_0");
-        when(result.getString("tablename")).thenReturn("t_order_0");
-        when(result.getString("schemaname")).thenReturn("public");
-        return result;
-    }
-    
-    private ResultSet createIndexResultSetForOracle() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        
when(result.getString("INDEX_NAME")).thenReturn("ORDER_INDEX_T_ORDER_T_ORDER_0");
-        when(result.getString("TABLE_NAME")).thenReturn("T_ORDER_0");
-        return result;
-    }
-    
-    private void mockDatabase(final Connection connection) throws SQLException 
{
-        DatabaseMetaData database = mock(DatabaseMetaData.class, 
RETURNS_DEEP_STUBS);
-        when(connection.getMetaData()).thenReturn(database);
-        ResultSet dataTypeResultSet = createDataTypeResultSet();
-        when(database.getTypeInfo()).thenReturn(dataTypeResultSet);
-        ResultSet tableResultSet1 = createTableResultSet();
-        ResultSet tableResultSet2 = createTableResultSet();
-        ResultSet columnResultSet1 = createColumnResultSet("t_order_0");
-        ResultSet columnResultSet2 = createColumnResultSet("t_order_1");
-        when(database.getTables(any(), any(), eq("t_order_0"), 
eq(null))).thenReturn(tableResultSet1);
-        when(database.getTables(any(), any(), eq("t_order_1"), 
eq(null))).thenReturn(tableResultSet2);
-        when(database.getColumns(any(), any(), eq("t_order_0"), 
eq("%"))).thenReturn(columnResultSet1);
-        when(database.getColumns(any(), any(), eq("t_order_1"), 
eq("%"))).thenReturn(columnResultSet2);
-    }
-    
-    private ResultSet createTableResultSet() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        return result;
-    }
-    
-    private ResultSet createColumnResultSetForPostgreSQL() throws SQLException 
{
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, true, true, false);
-        when(result.getString("table_name")).thenReturn("t_order_0");
-        when(result.getString("column_name")).thenReturn("id", "pwd_cipher", 
"pwd_plain");
-        when(result.getString("udt_name")).thenReturn("INT");
-        when(result.getString("table_schema")).thenReturn("public");
-        return result;
-    }
-    
-    private ResultSet createColumnResultSetForOracle() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, true, true, false);
-        when(result.getString("TABLE_NAME")).thenReturn("T_ORDER_0");
-        when(result.getString("COLUMN_NAME")).thenReturn("ID", "PWD_CIPHER", 
"PWD_PLAIN");
-        when(result.getString("DATA_TYPE")).thenReturn("INT");
-        return result;
-    }
-    
-    private ResultSet createColumnResultSet(final String actualTable) throws 
SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, true, true, false);
-        when(result.getString("TABLE_NAME")).thenReturn(actualTable);
-        when(result.getString("COLUMN_NAME")).thenReturn("id", "pwd_cipher", 
"pwd_plain");
-        when(result.getString("TYPE_NAME")).thenReturn("INT");
-        when(result.getString("DATA_TYPE")).thenReturn("INT");
-        return result;
-    }
-    
-    private ResultSet createDataTypeResultSet() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        when(result.getString("TYPE_NAME")).thenReturn("INT");
-        when(result.getInt("DATA_TYPE")).thenReturn(1);
-        return result;
-    }
-    
-    @Test
-    public void assertLoadTablesH2() throws SQLException {
-        
when(props.getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED)).thenReturn(false);
-        when(databaseType.getType()).thenReturn("H2");
-        Collection<String> tableNames = new LinkedList<>();
-        tableNames.add(TABLE_NAME);
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
-        ShardingSchemaMetaDataBuilder loader = (ShardingSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(shardingRule);
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
shardingRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, props, "sharding_db"));
-        assertResult(actual, "sharding_db");
-    }
-    
-    @Test
-    public void assertLoadTablesMySQL() throws SQLException {
-        
when(props.getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED)).thenReturn(false);
-        when(databaseType.getType()).thenReturn("MySQL");
-        Collection<String> tableNames = new LinkedList<>();
-        tableNames.add(TABLE_NAME);
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
-        ShardingSchemaMetaDataBuilder loader = (ShardingSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(shardingRule);
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
shardingRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, props, "sharding_db"));
-        assertResult(actual, "sharding_db");
-    }
-    
-    @Test
-    public void assertLoadTablesOracle() throws SQLException {
-        ShardingRule shardingRule = createShardingRuleForOracle();
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
-        ShardingSchemaMetaDataBuilder loader = (ShardingSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(shardingRule);
-        
when(props.getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED)).thenReturn(false);
-        DatabaseType databaseType = mock(OracleDatabaseType.class);
-        when(databaseType.getType()).thenReturn("Oracle");
-        Map<String, SchemaMetaData> actual = 
loader.load(Collections.singletonList(TABLE_NAME), shardingRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, props, "sharding_db"));
-        
assertThat(actual.get("sharding_db").getTables().keySet().iterator().next(), 
is("T_ORDER_0"));
-        TableMetaData tableMetaData = 
actual.get("sharding_db").getTables().values().iterator().next();
-        List<String> actualColumnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(0)).getName(), 
is("ID"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(1)).getName(), 
is("PWD_CIPHER"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(2)).getName(), 
is("PWD_PLAIN"));
-        
assertThat(tableMetaData.getIndexes().values().iterator().next().getName(), 
is("ORDER_INDEX_T_ORDER_T_ORDER_0"));
-    }
-    
-    private ShardingRule createShardingRuleForOracle() {
-        ShardingTableRuleConfiguration tableRuleConfig = new 
ShardingTableRuleConfiguration(TABLE_NAME, "ds.T_ORDER_${0..1}");
-        ShardingRuleConfiguration shardingRuleConfig = new 
ShardingRuleConfiguration();
-        shardingRuleConfig.getTables().add(tableRuleConfig);
-        return new ShardingRule(shardingRuleConfig, 
Collections.singletonList("ds"));
-    }
-    
-    @Test
-    public void assertLoadTablesPGSQL() throws SQLException {
-        
when(props.getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED)).thenReturn(false);
-        when(databaseType.getType()).thenReturn("PostgreSQL");
-        Collection<String> tableNames = new LinkedList<>();
-        tableNames.add(TABLE_NAME);
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
-        ShardingSchemaMetaDataBuilder loader = (ShardingSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(shardingRule);
-        ResultSet roleTableGrantsResultSet = mockRoleTableGrantsResultSet();
-        when(dataSource.getConnection().prepareStatement(startsWith("SELECT 
table_name FROM 
information_schema.role_table_grants")).executeQuery()).thenReturn(roleTableGrantsResultSet);
-        ResultSet schemaMetaData = mockSchemaMetaData();
-        
when(dataSource.getConnection().getMetaData().getSchemas()).thenReturn(schemaMetaData);
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
shardingRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, props, "sharding_db"));
-        assertResult(actual, "public");
-    }
-    
-    private ResultSet mockSchemaMetaData() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        when(result.getString("TABLE_SCHEM")).thenReturn("public");
-        return result;
-    }
-    
-    private ResultSet mockRoleTableGrantsResultSet() throws SQLException {
-        ResultSet result = mock(ResultSet.class);
-        when(result.next()).thenReturn(true, false);
-        when(result.getString("table_name")).thenReturn("t_order_0");
-        return result;
-    }
-    
-    @Test
-    public void assertLoadTablesSQLServer() throws SQLException {
-        
when(props.getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED)).thenReturn(false);
-        when(databaseType.getType()).thenReturn("SQLServer");
-        Collection<String> tableNames = new LinkedList<>();
-        tableNames.add(TABLE_NAME);
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
-        ShardingSchemaMetaDataBuilder loader = (ShardingSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(shardingRule);
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
shardingRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, props, "sharding_db"));
-        assertResult(actual, "sharding_db");
-    }
-    
-    private void assertResult(final Map<String, SchemaMetaData> 
schemaMetaDataMap, final String schemaName) {
-        TableMetaData tableMetaData = 
schemaMetaDataMap.get(schemaName).getTables().values().iterator().next();
-        List<String> actualColumnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(0)).getName(), 
is("id"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(1)).getName(), 
is("pwd_cipher"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(2)).getName(), 
is("pwd_plain"));
-        IndexMetaData indexMetaData = 
tableMetaData.getIndexes().values().iterator().next();
-        assertThat(indexMetaData.getName(), 
is("order_index_t_order_t_order_0"));
-    }
-    
-    @Test
-    public void assertLoadTablesDefault() throws SQLException {
-        
when(props.getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED)).thenReturn(false);
-        when(databaseType.getType()).thenReturn("default");
-        
when(databaseType.formatTableNamePattern("t_order_0")).thenReturn("t_order_0");
-        Collection<String> tableNames = new LinkedList<>();
-        tableNames.add(TABLE_NAME);
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
-        ShardingSchemaMetaDataBuilder loader = (ShardingSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(shardingRule);
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
shardingRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, props, "sharding_db"));
-        TableMetaData tableMetaData = 
actual.get("sharding_db").getTables().values().iterator().next();
-        List<String> actualColumnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(0)).getName(), 
is("id"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(1)).getName(), 
is("pwd_cipher"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(2)).getName(), 
is("pwd_plain"));
-    }
-    
-    @Test
-    public void assertLoadTablesWithCheck() throws SQLException {
-        
when(props.getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED)).thenReturn(true);
-        
when(databaseType.formatTableNamePattern("t_order_0")).thenReturn("t_order_0");
-        
when(databaseType.formatTableNamePattern("t_order_1")).thenReturn("t_order_1");
-        Collection<String> tableNames = new LinkedList<>();
-        tableNames.add(TABLE_NAME);
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
-        ShardingSchemaMetaDataBuilder loader = (ShardingSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(shardingRule);
-        Map<String, SchemaMetaData> actual = loader.load(tableNames, 
shardingRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, props, "sharding_db"));
-        TableMetaData tableMetaData = 
actual.get("sharding_db").getTables().values().iterator().next();
-        List<String> actualColumnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(0)).getName(), 
is("id"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(1)).getName(), 
is("pwd_cipher"));
-        
assertThat(tableMetaData.getColumns().get(actualColumnNames.get(2)).getName(), 
is("pwd_plain"));
-    }
-    
-    @Test
-    public void assertDecorateWithKeyGenerateStrategy() throws SQLException {
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
-        ShardingSchemaMetaDataBuilder builder = 
(ShardingSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(shardingRule);
-        Map<String, TableMetaData> tableMetaDataMap = new LinkedHashMap<>();
-        tableMetaDataMap.put(TABLE_NAME, createTableMetaData());
-        Map<String, ColumnMetaData> columns = 
builder.decorate(Collections.singletonMap("sharding_db", new 
SchemaMetaData("sharding_db", tableMetaDataMap)),
-                shardingRule, 
mock(GenericSchemaBuilderMaterials.class)).get("sharding_db").getTables().get(TABLE_NAME).getColumns();
-        Iterator<ColumnMetaData> iterator = columns.values().iterator();
-        assertTrue(iterator.next().isGenerated());
-        assertFalse(iterator.next().isGenerated());
-        assertFalse(iterator.next().isGenerated());
-        assertFalse(iterator.next().isGenerated());
-    }
-    
-    private TableMetaData createTableMetaData() {
-        Collection<ColumnMetaData> columns = Arrays.asList(new 
ColumnMetaData("id", 1, true, true, true),
-                new ColumnMetaData("pwd_cipher", 2, false, false, true),
-                new ColumnMetaData("pwd_plain", 2, false, false, true),
-                new ColumnMetaData("product_id", 2, false, false, true));
-        return new TableMetaData(TABLE_NAME, columns, Collections.emptyList(), 
Collections.emptyList());
-    }
-}
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecoratorTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecoratorTest.java
new file mode 100644
index 00000000000..ce8b419cc48
--- /dev/null
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecoratorTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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;
+
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecoratorFactory;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
+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.sharding.rule.ShardingRule;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public final class ShardingSchemaMetaDataDecoratorTest {
+    
+    private static final String TABLE_NAME = "t_order";
+    
+    @Test
+    public void assertDecorateWithKeyGenerateStrategy() {
+        ShardingRule shardingRule = mock(ShardingRule.class);
+        
when(shardingRule.findLogicTableByActualTable(TABLE_NAME)).thenReturn(Optional.of(TABLE_NAME));
+        Collection<ShardingSphereRule> rules = 
Collections.singletonList(shardingRule);
+        ShardingSchemaMetaDataDecorator builder = 
(ShardingSchemaMetaDataDecorator) 
RuleBasedSchemaMetaDataDecoratorFactory.getInstances(rules).get(shardingRule);
+        Map<String, TableMetaData> tableMetaDataMap = new LinkedHashMap<>();
+        tableMetaDataMap.put(TABLE_NAME, createTableMetaData());
+        GenericSchemaBuilderMaterials materials = 
mock(GenericSchemaBuilderMaterials.class);
+        when(materials.getProps()).thenReturn(new ConfigurationProperties(new 
Properties()));
+        Map<String, SchemaMetaData> actual = 
builder.decorate(Collections.singletonMap("sharding_db",
+                new SchemaMetaData("sharding_db", tableMetaDataMap)), 
shardingRule, materials);
+        Map<String, ColumnMetaData> columns = 
actual.get("sharding_db").getTables().get(TABLE_NAME).getColumns();
+        Iterator<ColumnMetaData> iterator = columns.values().iterator();
+        assertTrue(iterator.next().isGenerated());
+        assertFalse(iterator.next().isGenerated());
+        assertFalse(iterator.next().isGenerated());
+        assertFalse(iterator.next().isGenerated());
+    }
+    
+    private TableMetaData createTableMetaData() {
+        Collection<ColumnMetaData> columns = Arrays.asList(new 
ColumnMetaData("id", 1, true, true, true),
+                new ColumnMetaData("pwd_cipher", 2, false, false, true),
+                new ColumnMetaData("pwd_plain", 2, false, false, true),
+                new ColumnMetaData("product_id", 2, false, false, true));
+        return new TableMetaData(TABLE_NAME, columns, Collections.emptyList(), 
Collections.emptyList());
+    }
+}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
index a5339446492..1d7295a5cc8 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
@@ -17,12 +17,16 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.builder;
 
+import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilderFactory;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecoratorFactory;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.SchemaMetaDataLoaderEngine;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.TableMetaDataLoaderMaterial;
 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.metadata.database.schema.util.TableMetaDataUtil;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 
@@ -73,7 +77,7 @@ public final class GenericSchemaBuilder {
     }
     
     private static Map<String, SchemaMetaData> loadSchemaMetaDataMap(final 
Collection<String> tableNames, final GenericSchemaBuilderMaterials materials) 
throws SQLException {
-        Map<String, SchemaMetaData> result = 
loadSchemasWithTableContainedRules(tableNames, materials);
+        Map<String, SchemaMetaData> result = loadSchemas(tableNames, 
materials);
         if (!materials.getProtocolType().equals(materials.getStorageType())) {
             result = translate(result, materials);
         }
@@ -84,32 +88,13 @@ public final class GenericSchemaBuilder {
         return rules.stream().filter(each -> each instanceof 
TableContainedRule).flatMap(each -> ((TableContainedRule) 
each).getTables().stream()).collect(Collectors.toSet());
     }
     
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    private static Map<String, SchemaMetaData> 
loadSchemasWithTableContainedRules(final Collection<String> tableNames, final 
GenericSchemaBuilderMaterials materials) throws SQLException {
-        Map<String, SchemaMetaData> result = new LinkedHashMap<>();
-        for (Entry<ShardingSphereRule, RuleBasedSchemaMetaDataBuilder> entry : 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(materials.getRules()).entrySet())
 {
-            ShardingSphereRule rule = entry.getKey();
-            if (rule instanceof TableContainedRule) {
-                Collection<String> loadingTables = 
filterLoadingTables(tableNames, (TableContainedRule) rule, result.values());
-                mergeSchemaMetaDataMap(result, 
entry.getValue().load(loadingTables, (TableContainedRule) rule, 
materials).values());
-            }
-        }
-        return result;
-    }
-    
-    private static Collection<String> filterLoadingTables(final 
Collection<String> tableNames, final TableContainedRule rule, final 
Collection<SchemaMetaData> loadedSchemaMetaDataList) {
-        return tableNames.stream().filter(each -> 
rule.getTables().contains(each) && !containsTable(loadedSchemaMetaDataList, 
each)).collect(Collectors.toList());
-    }
-    
-    private static boolean containsTable(final Collection<SchemaMetaData> 
schemaMetaDataList, final String tableName) {
-        return schemaMetaDataList.stream().anyMatch(each -> 
each.getTables().containsKey(tableName));
-    }
-    
-    private static void mergeSchemaMetaDataMap(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final Collection<SchemaMetaData> 
addedSchemaMetaDataList) {
-        for (SchemaMetaData each : addedSchemaMetaDataList) {
-            SchemaMetaData schemaMetaData = 
schemaMetaDataMap.computeIfAbsent(each.getName(), key -> new 
SchemaMetaData(each.getName(), new LinkedHashMap<>()));
-            schemaMetaData.getTables().putAll(each.getTables());
+    private static Map<String, SchemaMetaData> loadSchemas(final 
Collection<String> tableNames, final GenericSchemaBuilderMaterials materials) 
throws SQLException {
+        boolean isCheckingMetaData = 
materials.getProps().getValue(ConfigurationPropertyKey.CHECK_TABLE_METADATA_ENABLED);
+        Collection<TableMetaDataLoaderMaterial> tableMetaDataLoaderMaterials = 
TableMetaDataUtil.getTableMetaDataLoadMaterial(tableNames, materials, 
isCheckingMetaData);
+        if (tableMetaDataLoaderMaterials.isEmpty()) {
+            return Collections.emptyMap();
         }
+        return SchemaMetaDataLoaderEngine.load(tableMetaDataLoaderMaterials, 
materials.getStorageType());
     }
     
     private static Map<String, SchemaMetaData> translate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final GenericSchemaBuilderMaterials 
materials) {
@@ -122,9 +107,9 @@ public final class GenericSchemaBuilder {
     }
     
     @SuppressWarnings({"unchecked", "rawtypes"})
-    private static Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final GenericSchemaBuilderMaterials 
materials) throws SQLException {
+    private static Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final GenericSchemaBuilderMaterials 
materials) {
         Map<String, SchemaMetaData> result = new 
LinkedHashMap<>(schemaMetaDataMap);
-        for (Entry<ShardingSphereRule, RuleBasedSchemaMetaDataBuilder> entry : 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(materials.getRules()).entrySet())
 {
+        for (Entry<ShardingSphereRule, RuleBasedSchemaMetaDataDecorator> entry 
: 
RuleBasedSchemaMetaDataDecoratorFactory.getInstances(materials.getRules()).entrySet())
 {
             if (!(entry.getKey() instanceof TableContainedRule)) {
                 continue;
             }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecorator.java
similarity index 72%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilder.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecorator.java
index 943d58aa1b0..7502ee131ab 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecorator.java
@@ -23,28 +23,15 @@ import 
org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 import org.apache.shardingsphere.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.spi.type.ordered.OrderedSPI;
 
-import java.sql.SQLException;
-import java.util.Collection;
 import java.util.Map;
 
 /**
- * Rule based schema meta data builder.
+ * Rule based schema meta data decorator.
  * 
  * @param <T> type of ShardingSphere rule
  */
 @SingletonSPI
-public interface RuleBasedSchemaMetaDataBuilder<T extends TableContainedRule> 
extends OrderedSPI<T> {
-    
-    /**
-     * Load schema meta data.
-     *
-     * @param tableNames tables name
-     * @param rule ShardingSphere rule
-     * @param materials SchemaBuilderMaterials materials
-     * @return schema meta data map
-     * @throws SQLException SQL exception
-     */
-    Map<String, SchemaMetaData> load(Collection<String> tableNames, T rule, 
GenericSchemaBuilderMaterials materials) throws SQLException;
+public interface RuleBasedSchemaMetaDataDecorator<T extends 
TableContainedRule> extends OrderedSPI<T> {
     
     /**
      * Decorate schema meta data.
@@ -53,7 +40,6 @@ public interface RuleBasedSchemaMetaDataBuilder<T extends 
TableContainedRule> ex
      * @param rule ShardingSphere rule
      * @param materials SchemaBuilderMaterials materials
      * @return schema meta data map
-     * @throws SQLException SQL exception
      */
-    Map<String, SchemaMetaData> decorate(Map<String, SchemaMetaData> 
schemaMetaDataMap, T rule, GenericSchemaBuilderMaterials materials) throws 
SQLException;
+    Map<String, SchemaMetaData> decorate(Map<String, SchemaMetaData> 
schemaMetaDataMap, T rule, GenericSchemaBuilderMaterials materials);
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilderFactory.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecoratorFactory.java
similarity index 82%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilderFactory.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecoratorFactory.java
index 29f9144dfdf..e08dbca8e68 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilderFactory.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecoratorFactory.java
@@ -25,22 +25,22 @@ import java.util.Collection;
 import java.util.Map;
 
 /**
- * Rule based schema meta data builder factory.
+ * Rule based schema meta data decorator factory.
  */
-public final class RuleBasedSchemaMetaDataBuilderFactory {
+public final class RuleBasedSchemaMetaDataDecoratorFactory {
     
     static {
-        
ShardingSphereServiceLoader.register(RuleBasedSchemaMetaDataBuilder.class);
+        
ShardingSphereServiceLoader.register(RuleBasedSchemaMetaDataDecorator.class);
     }
     
     /**
-     * Get instances of rule based schema meta data builder.
+     * Get instances of rule based schema meta data decorator.
      * 
      * @param rules rules
      * @return got instances
      */
     @SuppressWarnings("rawtypes")
-    public static Map<ShardingSphereRule, RuleBasedSchemaMetaDataBuilder> 
getInstances(final Collection<ShardingSphereRule> rules) {
-        return 
OrderedSPIRegistry.getRegisteredServices(RuleBasedSchemaMetaDataBuilder.class, 
rules);
+    public static Map<ShardingSphereRule, RuleBasedSchemaMetaDataDecorator> 
getInstances(final Collection<ShardingSphereRule> rules) {
+        return 
OrderedSPIRegistry.getRegisteredServices(RuleBasedSchemaMetaDataDecorator.class,
 rules);
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java
new file mode 100644
index 00000000000..a17d13c2520
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.metadata.database.schema.builder;
+
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.DefaultDatabase;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.rule.CommonFixtureRule;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.rule.DataNodeContainedFixtureRule;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.SchemaMetaDataLoaderEngine;
+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.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.mockStatic;
+
+@RunWith(MockitoJUnitRunner.class)
+public final class GenericSchemaBuilderTest {
+    
+    @Mock
+    private DatabaseType databaseType;
+    
+    private GenericSchemaBuilderMaterials materials;
+    
+    private MockedStatic<SchemaMetaDataLoaderEngine> 
schemaMetaDataLoaderEngine;
+    
+    @Before
+    public void setUp() {
+        Collection<ShardingSphereRule> rules = Arrays.asList(new 
CommonFixtureRule(), new DataNodeContainedFixtureRule());
+        materials = new GenericSchemaBuilderMaterials(databaseType, 
databaseType, Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
+                mock(DataSource.class)), rules, new 
ConfigurationProperties(new Properties()), DefaultDatabase.LOGIC_NAME);
+        schemaMetaDataLoaderEngine = 
mockStatic(SchemaMetaDataLoaderEngine.class);
+    }
+    
+    @Test
+    public void assertLoadWithExistedTableName() throws SQLException {
+        Collection<String> tableNames = 
Collections.singletonList("data_node_routed_table1");
+        schemaMetaDataLoaderEngine.when(() -> 
SchemaMetaDataLoaderEngine.load(any(), 
any())).thenReturn(mockSchemaMetaDataMap(tableNames, materials));
+        assertFalse(GenericSchemaBuilder.build(tableNames, 
materials).get(DefaultDatabase.LOGIC_NAME).getTables().isEmpty());
+    }
+    
+    @Test
+    public void assertLoadWithNotExistedTableName() throws SQLException {
+        Collection<String> tableNames = 
Collections.singletonList("invalid_table");
+        schemaMetaDataLoaderEngine.when(() -> 
SchemaMetaDataLoaderEngine.load(any(), 
any())).thenReturn(mockSchemaMetaDataMap(tableNames, materials));
+        assertTrue(GenericSchemaBuilder.build(tableNames, 
materials).get(DefaultDatabase.LOGIC_NAME).getTables().isEmpty());
+    }
+    
+    @Test
+    public void assertLoadAllTables() throws SQLException {
+        Collection<String> tableNames = new 
DataNodeContainedFixtureRule().getTables();
+        schemaMetaDataLoaderEngine.when(() -> 
SchemaMetaDataLoaderEngine.load(any(), 
any())).thenReturn(mockSchemaMetaDataMap(tableNames, materials));
+        Map<String, ShardingSphereSchema> actual = 
GenericSchemaBuilder.build(tableNames, materials);
+        assertThat(actual.size(), is(1));
+        assertTables(new 
ShardingSphereSchema(actual.values().iterator().next().getTables()).getTables());
+    }
+    
+    @After
+    public void cleanUp() {
+        schemaMetaDataLoaderEngine.close();
+    }
+    
+    private void assertTables(final Map<String, TableMetaData> actual) {
+        assertThat(actual.size(), is(2));
+        
assertTrue(actual.get("data_node_routed_table1").getColumns().isEmpty());
+        
assertTrue(actual.get("data_node_routed_table2").getColumns().isEmpty());
+    }
+    
+    private Map<String, SchemaMetaData> mockSchemaMetaDataMap(final 
Collection<String> tableNames, final GenericSchemaBuilderMaterials materials) {
+        if (!tableNames.isEmpty() && 
(tableNames.contains("data_node_routed_table1") || 
tableNames.contains("data_node_routed_table2"))) {
+            Map<String, TableMetaData> tableMetaDataMap = new 
LinkedHashMap<>();
+            for (String each : tableNames) {
+                tableMetaDataMap.put(each, new TableMetaData(each, 
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
+            }
+            return Collections.singletonMap(materials.getDefaultSchemaName(), 
new SchemaMetaData(materials.getDefaultSchemaName(), tableMetaDataMap));
+        }
+        return Collections.emptyMap();
+    }
+}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/SchemaMetaDataBuilderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/SchemaMetaDataBuilderTest.java
deleted file mode 100644
index 9e59a24b37e..00000000000
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/SchemaMetaDataBuilderTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.metadata.database.schema.builder;
-
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.database.DefaultDatabase;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.rule.CommonFixtureRule;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.rule.DataNodeContainedFixtureRule;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
-import org.apache.shardingsphere.test.mock.MockedDataSource;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Properties;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(MockitoJUnitRunner.class)
-public final class SchemaMetaDataBuilderTest {
-    
-    @Mock
-    private DatabaseType databaseType;
-    
-    @Test
-    public void assertLoadWithExistedTableName() throws SQLException {
-        GenericSchemaBuilderMaterials materials = new 
GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, new MockedDataSource()),
-                Arrays.asList(new CommonFixtureRule(), new 
DataNodeContainedFixtureRule()), new ConfigurationProperties(new Properties()), 
DefaultDatabase.LOGIC_NAME);
-        
assertFalse(GenericSchemaBuilder.build(Collections.singletonList("data_node_routed_table1"),
 materials).get(DefaultDatabase.LOGIC_NAME).getTables().isEmpty());
-    }
-    
-    @Test
-    public void assertLoadWithNotExistedTableName() throws SQLException {
-        GenericSchemaBuilderMaterials materials = new 
GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, new MockedDataSource()),
-                Arrays.asList(new CommonFixtureRule(), new 
DataNodeContainedFixtureRule()), new ConfigurationProperties(new Properties()), 
DefaultDatabase.LOGIC_NAME);
-        
assertTrue(GenericSchemaBuilder.build(Collections.singletonList("invalid_table"),
 materials).get(DefaultDatabase.LOGIC_NAME).getTables().isEmpty());
-    }
-    
-    @Test
-    public void assertLoadAllTables() throws SQLException {
-        GenericSchemaBuilderMaterials materials = new 
GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, new MockedDataSource()),
-                Arrays.asList(new CommonFixtureRule(), new 
DataNodeContainedFixtureRule()), new ConfigurationProperties(new Properties()), 
DefaultDatabase.LOGIC_NAME);
-        Map<String, ShardingSphereSchema> actual = 
GenericSchemaBuilder.build(new DataNodeContainedFixtureRule().getTables(), 
materials);
-        assertThat(actual.size(), is(1));
-        assertTables(new 
ShardingSphereSchema(actual.values().iterator().next().getTables()).getTables());
-    }
-    
-    private void assertTables(final Map<String, TableMetaData> actual) {
-        assertThat(actual.size(), is(2));
-        
assertTrue(actual.get("data_node_routed_table1").getColumns().isEmpty());
-        
assertTrue(actual.get("data_node_routed_table2").getColumns().isEmpty());
-    }
-}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilderFactoryTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecoratorFactoryTest.java
similarity index 82%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilderFactoryTest.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecoratorFactoryTest.java
index 71b96379952..02674d87a93 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataBuilderFactoryTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/spi/RuleBasedSchemaMetaDataDecoratorFactoryTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.builder.spi;
 
-import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.loader.CommonFixtureSchemaMetaDataBuilder;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.loader.CommonFixtureSchemaMetaDataDecorator;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.rule.CommonFixtureRule;
 import org.junit.Test;
 
@@ -26,11 +26,11 @@ import java.util.Collections;
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.junit.Assert.assertThat;
 
-public final class RuleBasedSchemaMetaDataBuilderFactoryTest {
+public final class RuleBasedSchemaMetaDataDecoratorFactoryTest {
     
     @Test
     public void assertGetInstances() {
         CommonFixtureRule rule = new CommonFixtureRule();
-        
assertThat(RuleBasedSchemaMetaDataBuilderFactory.getInstances(Collections.singleton(rule)).get(rule),
 instanceOf(CommonFixtureSchemaMetaDataBuilder.class));
+        
assertThat(RuleBasedSchemaMetaDataDecoratorFactory.getInstances(Collections.singleton(rule)).get(rule),
 instanceOf(CommonFixtureSchemaMetaDataDecorator.class));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/CommonFixtureSchemaMetaDataBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/CommonFixtureSchemaMetaDataDecorator.java
similarity index 74%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/CommonFixtureSchemaMetaDataBuilder.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/CommonFixtureSchemaMetaDataDecorator.java
index 4c6a8d3e14c..25404cd70bd 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/CommonFixtureSchemaMetaDataBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/CommonFixtureSchemaMetaDataDecorator.java
@@ -18,24 +18,16 @@
 package 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.loader;
 
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.rule.CommonFixtureRule;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 
-public final class CommonFixtureSchemaMetaDataBuilder implements 
RuleBasedSchemaMetaDataBuilder<CommonFixtureRule> {
+public final class CommonFixtureSchemaMetaDataDecorator implements 
RuleBasedSchemaMetaDataDecorator<CommonFixtureRule> {
     
     @Override
-    public Map<String, SchemaMetaData> load(final Collection<String> 
tableNames, final CommonFixtureRule rule, final GenericSchemaBuilderMaterials 
materials) throws SQLException {
-        return Collections.emptyMap();
-    }
-    
-    @Override
-    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final CommonFixtureRule rule, final 
GenericSchemaBuilderMaterials materials) throws SQLException {
+    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final CommonFixtureRule rule, final 
GenericSchemaBuilderMaterials materials) {
         return schemaMetaDataMap;
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/DataNodeContainedFixtureRuleBasedSchemaMetaDataBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/DataNodeContainedFixtureRuleBasedSchemaMetaDataDecorator.java
similarity index 54%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/DataNodeContainedFixtureRuleBasedSchemaMetaDataBuilder.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/DataNodeContainedFixtureRuleBasedSchemaMetaDataDecorator.java
index a0d5a11ca6e..033ec051461 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/DataNodeContainedFixtureRuleBasedSchemaMetaDataBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/fixture/loader/DataNodeContainedFixtureRuleBasedSchemaMetaDataDecorator.java
@@ -18,34 +18,16 @@
 package 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.loader;
 
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.fixture.rule.DataNodeContainedFixtureRule;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
 
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.Map;
 
-public final class DataNodeContainedFixtureRuleBasedSchemaMetaDataBuilder 
implements RuleBasedSchemaMetaDataBuilder<DataNodeContainedFixtureRule> {
+public final class DataNodeContainedFixtureRuleBasedSchemaMetaDataDecorator 
implements RuleBasedSchemaMetaDataDecorator<DataNodeContainedFixtureRule> {
     
     @Override
-    public Map<String, SchemaMetaData> load(final Collection<String> 
tableNames, final DataNodeContainedFixtureRule rule, final 
GenericSchemaBuilderMaterials materials) throws SQLException {
-        if (!tableNames.isEmpty() && 
(tableNames.contains("data_node_routed_table1") || 
tableNames.contains("data_node_routed_table2"))) {
-            Map<String, TableMetaData> tableMetaDataMap = new 
LinkedHashMap<>();
-            for (String tableName : tableNames) {
-                tableMetaDataMap.put(tableName, new TableMetaData(tableName, 
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()));
-            }
-            return Collections.singletonMap(materials.getDefaultSchemaName(), 
new SchemaMetaData(materials.getDefaultSchemaName(), tableMetaDataMap));
-        }
-        return Collections.emptyMap();
-    }
-    
-    @Override
-    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap,
-                                                final 
DataNodeContainedFixtureRule rule, final GenericSchemaBuilderMaterials 
materials) throws SQLException {
+    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final DataNodeContainedFixtureRule rule, 
final GenericSchemaBuilderMaterials materials) {
         return schemaMetaDataMap;
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
similarity index 89%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
index 90cababb128..715f78fb9b4 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
@@ -15,5 +15,5 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.infra.metadata.database.schema.fixture.loader.CommonFixtureSchemaMetaDataBuilder
-org.apache.shardingsphere.infra.metadata.database.schema.fixture.loader.DataNodeContainedFixtureRuleBasedSchemaMetaDataBuilder
+org.apache.shardingsphere.infra.metadata.database.schema.fixture.loader.CommonFixtureSchemaMetaDataDecorator
+org.apache.shardingsphere.infra.metadata.database.schema.fixture.loader.DataNodeContainedFixtureRuleBasedSchemaMetaDataDecorator
diff --git 
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java
 
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java
index 644d142c1af..0793b70c878 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java
@@ -35,6 +35,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.Sim
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.RenameTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
+import org.apache.shardingsphere.test.mock.MockedDataSource;
 import org.junit.Test;
 
 import java.sql.SQLException;
@@ -42,6 +43,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
@@ -55,7 +57,7 @@ public final class RenameTableStatementSchemaRefresherTest {
         RenameTableLister listener = new RenameTableLister(2);
         ShardingSphereEventBus.getInstance().register(listener);
         new 
RenameTableStatementSchemaRefresher().refresh(createDatabaseMetaData(), new 
FederationDatabaseMetaData("foo_database", Collections.emptyMap()),
-                new HashMap<>(), Collections.singleton("foo_ds"), 
"foo_schema", createRenameTableStatement(), 
mock(ConfigurationProperties.class));
+                new HashMap<>(), Collections.singleton("foo_ds"), 
"foo_schema", createRenameTableStatement(), new ConfigurationProperties(new 
Properties()));
         assertThat(listener.getActualCount(), is(listener.getRenameCount()));
         ShardingSphereEventBus.getInstance().unregister(listener);
     }
@@ -81,7 +83,7 @@ public final class RenameTableStatementSchemaRefresherTest {
     
     private ShardingSphereResource mockShardingSphereResource() {
         ShardingSphereResource result = mock(ShardingSphereResource.class);
-        when(result.getDataSources()).thenReturn(Collections.emptyMap());
+        
when(result.getDataSources()).thenReturn(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 new MockedDataSource()));
         when(result.getDatabaseType()).thenReturn(new SQL92DatabaseType());
         return result;
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/test/java/org/apache/shardingsphere/infra/federation/executor/customized/fixture/CommonFixtureRule.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/test/java/org/apache/shardingsphere/infra/federation/executor/customized/fixture/CommonFixtureRule.java
deleted file mode 100644
index 34a4bd43bc2..00000000000
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/test/java/org/apache/shardingsphere/infra/federation/executor/customized/fixture/CommonFixtureRule.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.federation.executor.customized.fixture;
-
-import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
-
-import java.util.Collection;
-import java.util.Collections;
-
-public final class CommonFixtureRule implements TableContainedRule {
-    
-    @Override
-    public Collection<String> getTables() {
-        return Collections.singletonList("t_order_new");
-    }
-    
-    @Override
-    public String getType() {
-        return CommonFixtureRule.class.getSimpleName();
-    }
-}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/test/resources/META-INF.services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/test/resources/META-INF.services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder
deleted file mode 100644
index a58cf11ad21..00000000000
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/test/resources/META-INF.services/org.apache.shardingsphere.infra.metadata.schema.builder.spi.RuleBasedTableMetaDataBuilder
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.apache.shardingsphere.infra.federation.optimizer.metadata.fixture.CommonFixtureTableMetaDataBuilder
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/fixture/CommonFixtureRule.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/fixture/CommonFixtureRule.java
deleted file mode 100644
index 26a34ce0a6e..00000000000
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/fixture/CommonFixtureRule.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.federation.optimizer.metadata.fixture;
-
-import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
-
-import java.util.Collection;
-import java.util.Collections;
-
-public final class CommonFixtureRule implements TableContainedRule {
-    
-    @Override
-    public Collection<String> getTables() {
-        return Collections.singletonList("t_order_new");
-    }
-    
-    @Override
-    public String getType() {
-        return CommonFixtureRule.class.getSimpleName();
-    }
-}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/fixture/CommonFixtureSchemaMetaDataBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/fixture/CommonFixtureSchemaMetaDataBuilder.java
deleted file mode 100644
index ec6e5d1b0b6..00000000000
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/metadata/fixture/CommonFixtureSchemaMetaDataBuilder.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.federation.optimizer.metadata.fixture;
-
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
-
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-
-public final class CommonFixtureSchemaMetaDataBuilder implements 
RuleBasedSchemaMetaDataBuilder<CommonFixtureRule> {
-    
-    @Override
-    public Map<String, SchemaMetaData> load(final Collection<String> 
tableNames, final CommonFixtureRule rule, final GenericSchemaBuilderMaterials 
materials) throws SQLException {
-        Map<String, TableMetaData> tableMetaDataMap = 
Collections.singletonMap("t_order_new",
-                new TableMetaData("t_order_new", Collections.emptyList(), 
Collections.emptyList(), Collections.emptyList()));
-        return Collections.singletonMap(materials.getDefaultSchemaName(), new 
SchemaMetaData(materials.getDefaultSchemaName(), tableMetaDataMap));
-    }
-    
-    @Override
-    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final CommonFixtureRule rule, final 
GenericSchemaBuilderMaterials materials) throws SQLException {
-        return schemaMetaDataMap;
-    }
-    
-    @Override
-    public int getOrder() {
-        return 1;
-    }
-    
-    @Override
-    public Class<CommonFixtureRule> getTypeClass() {
-        return CommonFixtureRule.class;
-    }
-}
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
deleted file mode 100644
index 05ec57efa1b..00000000000
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-org.apache.shardingsphere.infra.federation.optimizer.metadata.fixture.CommonFixtureSchemaMetaDataBuilder
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataBuilder.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataDecorator.java
similarity index 71%
rename from 
shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataBuilder.java
rename to 
shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataDecorator.java
index 6f17097bcf6..14ca0bc60df 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataBuilder.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataDecorator.java
@@ -18,47 +18,28 @@
 package org.apache.shardingsphere.singletable.metadata;
 
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.SchemaMetaDataLoaderEngine;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.TableMetaDataLoaderMaterial;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 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.metadata.database.schema.util.IndexMetaDataUtil;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.util.TableMetaDataUtil;
 import org.apache.shardingsphere.singletable.constant.SingleTableOrder;
 import org.apache.shardingsphere.singletable.rule.SingleTableRule;
 
-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.stream.Collectors;
 
 /**
- * Schema meta data builder for single table.
+ * Schema meta data decorator for single table.
  */
-public final class SingleTableSchemaMetaDataBuilder implements 
RuleBasedSchemaMetaDataBuilder<SingleTableRule> {
+public final class SingleTableSchemaMetaDataDecorator implements 
RuleBasedSchemaMetaDataDecorator<SingleTableRule> {
     
     @Override
-    public Map<String, SchemaMetaData> load(final Collection<String> 
tableNames, final SingleTableRule rule, final GenericSchemaBuilderMaterials 
materials) throws SQLException {
-        Collection<String> ruleTables = rule.getTables();
-        Collection<String> needLoadTables = 
tableNames.stream().filter(ruleTables::contains).collect(Collectors.toSet());
-        if (needLoadTables.isEmpty()) {
-            return Collections.emptyMap();
-        }
-        Collection<TableMetaDataLoaderMaterial> tableMetaDataLoaderMaterials = 
TableMetaDataUtil.getTableMetaDataLoadMaterial(needLoadTables, materials, 
false);
-        if (tableMetaDataLoaderMaterials.isEmpty()) {
-            return Collections.emptyMap();
-        }
-        return SchemaMetaDataLoaderEngine.load(tableMetaDataLoaderMaterials, 
materials.getStorageType());
-    }
-    
-    @Override
-    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final SingleTableRule rule, final 
GenericSchemaBuilderMaterials materials) throws SQLException {
+    public Map<String, SchemaMetaData> decorate(final Map<String, 
SchemaMetaData> schemaMetaDataMap, final SingleTableRule rule, final 
GenericSchemaBuilderMaterials materials) {
         Map<String, SchemaMetaData> result = new LinkedHashMap<>();
         for (Entry<String, SchemaMetaData> entry : 
schemaMetaDataMap.entrySet()) {
             Map<String, TableMetaData> tables = new 
LinkedHashMap<>(entry.getValue().getTables().size(), 1);
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
similarity index 97%
rename from 
shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
rename to 
shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
index 616e38faa37..be441e1a4b7 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilder
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecorator
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.singletable.metadata.SingleTableSchemaMetaDataBuilder
+org.apache.shardingsphere.singletable.metadata.SingleTableSchemaMetaDataDecorator
diff --git 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataBuilderTest.java
 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataBuilderTest.java
index 6293b9c5744..3acd4abd30c 100644
--- 
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataBuilderTest.java
+++ 
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/metadata/SingleTableSchemaMetaDataBuilderTest.java
@@ -17,133 +17,40 @@
 
 package org.apache.shardingsphere.singletable.metadata;
 
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.database.DefaultDatabase;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataBuilderFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterials;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.spi.RuleBasedSchemaMetaDataDecoratorFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 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.singletable.config.SingleTableRuleConfiguration;
 import org.apache.shardingsphere.singletable.rule.SingleTableRule;
-import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
 
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
-@RunWith(MockitoJUnitRunner.class)
 public final class SingleTableSchemaMetaDataBuilderTest {
     
-    private SingleTableRule singleTableRule;
-    
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private DatabaseType databaseType;
-    
-    @Mock
-    private DataSource dataSource;
-    
-    @Before
-    public void setUp() throws SQLException {
-        Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
-        when(dataSource.getConnection()).thenReturn(connection);
-        mockSingleTableLoad(connection);
-        singleTableRule = new SingleTableRule(new 
SingleTableRuleConfiguration(), DefaultDatabase.LOGIC_NAME, databaseType,
-                Collections.singletonMap("ds", dataSource), 
Collections.emptyList(), new ConfigurationProperties(new Properties()));
-        when(databaseType.formatTableNamePattern("tbl")).thenReturn("tbl");
-        mockTableIsExist(connection);
-        mockTables(connection);
-        when(databaseType.getQuoteCharacter().wrap("tbl")).thenReturn("tbl");
-    }
-    
-    private void mockTables(final Connection connection) throws SQLException {
-        ResultSet resultSet = mock(ResultSet.class);
-        when(resultSet.next()).thenReturn(true, true, true, false);
-        when(resultSet.getString("TABLE_NAME")).thenReturn("tbl");
-        when(resultSet.getString("COLUMN_NAME")).thenReturn("id", "name", 
"doc");
-        when(resultSet.getInt("DATA_TYPE")).thenReturn(4, 12, -1);
-        when(connection.getMetaData().getColumns(any(), any(), any(), 
eq("%"))).thenReturn(resultSet);
-        ResultSet indexResultSet = mock(ResultSet.class, 
Answers.RETURNS_DEEP_STUBS);
-        when(connection.getMetaData().getIndexInfo(any(), any(), eq("tbl"), 
eq(false), eq(false))).thenReturn(indexResultSet);
-        when(indexResultSet.getString("INDEX_NAME")).thenReturn("id", 
"idx_name_tbl");
-        when(indexResultSet.next()).thenReturn(true, true, false);
-        ResultSet primaryResultSet = mock(ResultSet.class);
-        when(connection.getMetaData().getPrimaryKeys(any(), any(), 
eq("tbl"))).thenReturn(primaryResultSet);
-        when(primaryResultSet.next()).thenReturn(true, false);
-        when(primaryResultSet.getString("COLUMN_NAME")).thenReturn("id");
-    }
-    
-    private void mockTableIsExist(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = mock(ResultSet.class);
-        when(connection.getMetaData().getTables(any(), any(), eq("tbl"), 
eq(null))).thenReturn(resultSet);
-        when(resultSet.next()).thenReturn(true);
-    }
-    
-    private void mockSingleTableLoad(final Connection connection) throws 
SQLException {
-        ResultSet resultSet = mock(ResultSet.class);
-        when(connection.getMetaData().getTables(any(), any(), eq(null), 
any())).thenReturn(resultSet);
-        when(resultSet.next()).thenReturn(true, false);
-        when(resultSet.getString("TABLE_NAME")).thenReturn("tbl");
-    }
-    
-    @Test
-    public void assertLoad() throws SQLException {
-        Collection<ShardingSphereRule> rules = 
Collections.singletonList(singleTableRule);
-        SingleTableSchemaMetaDataBuilder builder = 
(SingleTableSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(singleTableRule);
-        Map<String, SchemaMetaData> actual = 
builder.load(Collections.singleton("tbl"), singleTableRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, new 
ConfigurationProperties(new Properties()), "sharding_db"));
-        assertFalse(actual.isEmpty());
-        assertTrue(actual.containsKey("sharding_db"));
-        assertTrue(actual.get("sharding_db").getTables().containsKey("tbl"));
-        TableMetaData actualTableMetaData = 
actual.get("sharding_db").getTables().get("tbl");
-        assertThat(actualTableMetaData.getColumns().size(), is(3));
-        List<String> columnNames = new 
ArrayList<>(actualTableMetaData.getColumns().keySet());
-        assertThat(actualTableMetaData.getColumns().get(columnNames.get(0)), 
is(new ColumnMetaData("id", 4, true, false, false)));
-        assertThat(actualTableMetaData.getColumns().get(columnNames.get(1)), 
is(new ColumnMetaData("name", 12, false, false, false)));
-        assertThat(actualTableMetaData.getColumns().get(columnNames.get(2)), 
is(new ColumnMetaData("doc", -1, false, false, false)));
-    }
+    private static final String TABLE_NAME = "t_single";
     
     @Test
-    public void assertDecorate() throws SQLException {
+    public void assertDecorate() {
+        SingleTableRule singleTableRule = mock(SingleTableRule.class);
         Collection<ShardingSphereRule> rules = 
Collections.singletonList(singleTableRule);
-        final SingleTableSchemaMetaDataBuilder builder = 
(SingleTableSchemaMetaDataBuilder) 
RuleBasedSchemaMetaDataBuilderFactory.getInstances(rules).get(singleTableRule);
-        Map<String, SchemaMetaData> actual = 
builder.load(Collections.singleton("tbl"), singleTableRule,
-                new GenericSchemaBuilderMaterials(databaseType, databaseType, 
Collections.singletonMap("ds", dataSource), rules, new 
ConfigurationProperties(new Properties()), "sharding_db"));
-        assertFalse(actual.isEmpty());
-        assertTrue(actual.containsKey("sharding_db"));
-        TableMetaData actualTableMetaData = 
actual.get("sharding_db").getTables().get("tbl");
-        assertThat(actualTableMetaData.getColumns().size(), is(3));
-        List<String> actualColumnNames = new 
ArrayList<>(actualTableMetaData.getColumns().keySet());
-        
assertThat(actualTableMetaData.getColumns().get(actualColumnNames.get(0)), 
is(new ColumnMetaData("id", 4, true, false, false)));
-        
assertThat(actualTableMetaData.getColumns().get(actualColumnNames.get(1)), 
is(new ColumnMetaData("name", 12, false, false, false)));
-        
assertThat(actualTableMetaData.getColumns().get(actualColumnNames.get(2)), 
is(new ColumnMetaData("doc", -1, false, false, false)));
-        TableMetaData tableMetaData = builder.decorate(actual, 
singleTableRule, 
mock(GenericSchemaBuilderMaterials.class)).get("sharding_db").getTables().get("tbl");
-        actualColumnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
+        SingleTableSchemaMetaDataDecorator builder = 
(SingleTableSchemaMetaDataDecorator) 
RuleBasedSchemaMetaDataDecoratorFactory.getInstances(rules).get(singleTableRule);
+        Map<String, SchemaMetaData> schemaMetaDataMap = 
mockSchemaMetaDataMap();
+        TableMetaData tableMetaData = builder.decorate(schemaMetaDataMap, 
singleTableRule, 
mock(GenericSchemaBuilderMaterials.class)).get("sharding_db").getTables().get(TABLE_NAME);
+        List<String> actualColumnNames = new 
ArrayList<>(tableMetaData.getColumns().keySet());
         assertThat(tableMetaData.getColumns().get(actualColumnNames.get(0)), 
is(new ColumnMetaData("id", 4, true, false, false)));
         assertThat(tableMetaData.getColumns().get(actualColumnNames.get(1)), 
is(new ColumnMetaData("name", 12, false, false, false)));
         assertThat(tableMetaData.getColumns().get(actualColumnNames.get(2)), 
is(new ColumnMetaData("doc", -1, false, false, false)));
@@ -151,4 +58,14 @@ public final class SingleTableSchemaMetaDataBuilderTest {
         assertThat(tableMetaData.getIndexes().get("id"), is(new 
IndexMetaData("id")));
         assertThat(tableMetaData.getIndexes().get("idx_name"), is(new 
IndexMetaData("idx_name")));
     }
+    
+    private Map<String, SchemaMetaData> mockSchemaMetaDataMap() {
+        Collection<ColumnMetaData> columns = Arrays.asList(new 
ColumnMetaData("id", 4, true, false, false),
+                new ColumnMetaData("name", 12, false, false, false),
+                new ColumnMetaData("doc", -1, false, false, false));
+        Collection<IndexMetaData> indexMetaDataList = Arrays.asList(new 
IndexMetaData("id_" + TABLE_NAME), new IndexMetaData("idx_name_" + TABLE_NAME));
+        Map<String, TableMetaData> tableMetaDataMap = new LinkedHashMap<>();
+        tableMetaDataMap.put(TABLE_NAME, new TableMetaData(TABLE_NAME, 
columns, indexMetaDataList, Collections.emptyList()));
+        return Collections.singletonMap("sharding_db", new 
SchemaMetaData("sharding_db", tableMetaDataMap));
+    }
 }
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-scaling/src/test/java/org/apache/shardingsphere/integration/data/pipeline/cases/base/BaseITCase.java
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-scaling/src/test/java/org/apache/shardingsphere/integration/data/pipeline/cases/base/BaseITCase.java
index a07ce91d290..6eb31d0a6bb 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-scaling/src/test/java/org/apache/shardingsphere/integration/data/pipeline/cases/base/BaseITCase.java
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-scaling/src/test/java/org/apache/shardingsphere/integration/data/pipeline/cases/base/BaseITCase.java
@@ -291,7 +291,7 @@ public abstract class BaseITCase {
         List<Map<String, Object>> previewResults = 
queryForListWithLog("PREVIEW SELECT COUNT(1) FROM t_order");
         Set<Object> targetSources = previewResults.stream().map(each -> 
each.get("actual_sql")).collect(Collectors.toSet());
         assertThat(previewResults.stream().map(each -> 
each.get("data_source_name")).collect(Collectors.toSet()), is(new 
HashSet<>(Arrays.asList("ds_2", "ds_3", "ds_4"))));
-        assertThat(targetSources, is(new HashSet<>(Arrays.asList("SELECT 
COUNT(1) FROM t_order_0 UNION ALL SELECT COUNT(1) FROM t_order_3", 
+        assertThat(targetSources, is(new HashSet<>(Arrays.asList("SELECT 
COUNT(1) FROM t_order_0 UNION ALL SELECT COUNT(1) FROM t_order_3",
                 "SELECT COUNT(1) FROM t_order_1 UNION ALL SELECT COUNT(1) FROM 
t_order_4", "SELECT COUNT(1) FROM t_order_2 UNION ALL SELECT COUNT(1) FROM 
t_order_5"))));
     }
 }

Reply via email to