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