You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2021/09/17 09:19:50 UTC
[shardingsphere] branch master updated: Refactor
TableMetaDataBuilder And SchemaBuilder (#12483)
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 <86...@users.noreply.github.com>
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));
}