This is an automated email from the ASF dual-hosted git repository. menghaoran 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 2babbf4ad25 private ContextManager.alterSchemas (#18722) 2babbf4ad25 is described below commit 2babbf4ad257c59cf6bb560d378c1e31e12c5604 Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Thu Jun 30 14:58:46 2022 +0800 private ContextManager.alterSchemas (#18722) * Refactor SingleTableDropSchemaMetadataValidatorTest * Refactor ContextManager * private ContextManager.alterSchemas * private ContextManager.alterSchemas --- .../mode/manager/ContextManager.java | 41 +++++++++------------- .../mode/manager/ContextManagerTest.java | 12 ------- 2 files changed, 17 insertions(+), 36 deletions(-) diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index 49dcc0a24de..bdde5be8436 100644 --- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -156,19 +156,18 @@ public final class ContextManager implements AutoCloseable { } private void alterTable(final String databaseName, final String schemaName, final ShardingSphereTable beBoChangedTable) { - ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabases().get(databaseName); - alterSingleTableDataNodes(database, schemaName, beBoChangedTable); - database.getSchemas().get(schemaName).put(beBoChangedTable.getName(), beBoChangedTable); + alterTable(metaDataContexts.getMetaData().getDatabases().get(databaseName), schemaName, beBoChangedTable); metaDataContexts.getOptimizerContext().alterTable(databaseName, schemaName, beBoChangedTable); } - private void alterSingleTableDataNodes(final ShardingSphereDatabase database, final String schemaName, final ShardingSphereTable changedTableMetaData) { - if (containsMutableDataNodeContainedRule(database, schemaName, changedTableMetaData.getName())) { + private void alterTable(final ShardingSphereDatabase database, final String schemaName, final ShardingSphereTable beBoChangedTable) { + if (containsMutableDataNodeRule(database, schemaName, beBoChangedTable.getName())) { refreshRules(database); } + database.getSchemas().get(schemaName).put(beBoChangedTable.getName(), beBoChangedTable); } - private boolean containsMutableDataNodeContainedRule(final ShardingSphereDatabase database, final String schemaName, final String tableName) { + private boolean containsMutableDataNodeRule(final ShardingSphereDatabase database, final String schemaName, final String tableName) { return database.getRuleMetaData().findRules(MutableDataNodeRule.class).stream().anyMatch(each -> each.findSingleTableDataNode(schemaName, tableName).isPresent()); } @@ -179,24 +178,6 @@ public final class ContextManager implements AutoCloseable { } } - /** - * Alter schemas. - * - * @param databaseName database name - * @param schemas schemas - */ - public void alterSchemas(final String databaseName, final Map<String, ShardingSphereSchema> schemas) { - ShardingSphereDatabase alteredMetaData = new ShardingSphereDatabase(databaseName, metaDataContexts.getMetaData().getDatabases().get(databaseName).getProtocolType(), - metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(), metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData(), schemas); - Map<String, ShardingSphereDatabase> alteredDatabases = new HashMap<>(metaDataContexts.getMetaData().getDatabases()); - alteredDatabases.put(databaseName, alteredMetaData); - FederationDatabaseMetaData alteredDatabaseMetaData = new FederationDatabaseMetaData(databaseName, schemas); - metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().put(databaseName, alteredDatabaseMetaData); - metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName, OptimizerPlannerContextFactory.create(alteredDatabaseMetaData)); - renewMetaDataContexts( - rebuildMetaDataContexts(new ShardingSphereMetaData(alteredDatabases, metaDataContexts.getMetaData().getGlobalRuleMetaData(), metaDataContexts.getMetaData().getProps()))); - } - private void persistMetaData(final MetaDataContexts metaDataContexts) { metaDataContexts.getMetaData().getDatabases().forEach((databaseName, schemas) -> schemas.getSchemas() .forEach((schemaName, tables) -> metaDataContexts.getPersistService().ifPresent(optional -> optional.getSchemaMetaDataService().persistMetaData(databaseName, schemaName, tables)))); @@ -428,6 +409,18 @@ public final class ContextManager implements AutoCloseable { } } + private void alterSchemas(final String databaseName, final Map<String, ShardingSphereSchema> schemas) { + ShardingSphereDatabase alteredMetaData = new ShardingSphereDatabase(databaseName, metaDataContexts.getMetaData().getDatabases().get(databaseName).getProtocolType(), + metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(), metaDataContexts.getMetaData().getDatabases().get(databaseName).getRuleMetaData(), schemas); + Map<String, ShardingSphereDatabase> alteredDatabases = new HashMap<>(metaDataContexts.getMetaData().getDatabases()); + alteredDatabases.put(databaseName, alteredMetaData); + FederationDatabaseMetaData alteredDatabaseMetaData = new FederationDatabaseMetaData(databaseName, schemas); + metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().put(databaseName, alteredDatabaseMetaData); + metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName, OptimizerPlannerContextFactory.create(alteredDatabaseMetaData)); + renewMetaDataContexts( + rebuildMetaDataContexts(new ShardingSphereMetaData(alteredDatabases, metaDataContexts.getMetaData().getGlobalRuleMetaData(), metaDataContexts.getMetaData().getProps()))); + } + private void deleteSchemas(final String databaseName, final Map<String, ShardingSphereSchema> actualSchemas) { Map<String, ShardingSphereSchema> originalSchemas = metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas(); if (originalSchemas.isEmpty()) { diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java index 759f178ec32..05528dd7092 100644 --- a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java +++ b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java @@ -27,13 +27,11 @@ import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties; import org.apache.shardingsphere.infra.federation.optimizer.context.parser.OptimizerParserContext; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext; import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData; -import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationSchemaMetaData; import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource; import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData; import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema; -import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.mode.metadata.persist.service.SchemaMetaDataPersistService; @@ -131,16 +129,6 @@ public final class ContextManagerTest { verify(metaDataContexts.getOptimizerContext(), times(0)).addSchema("foo_db", "foo_schema"); } - @Test - public void assertAlterSchemas() { - contextManager.alterSchemas("foo_db", Collections.singletonMap("foo_db", new ShardingSphereSchema(Collections.singletonMap("foo_table", - new ShardingSphereTable("foo_table", Collections.emptyList(), Collections.emptyList(), Collections.emptyList()))))); - assertTrue(contextManager.getMetaDataContexts().getMetaData().getDatabases().get("foo_db").getSchemas().get("foo_db").containsTable("foo_table")); - assertTrue(contextManager.getMetaDataContexts().getOptimizerContext().getFederationMetaData().getDatabases().containsKey("foo_db")); - Map<String, FederationSchemaMetaData> schemas = contextManager.getMetaDataContexts().getOptimizerContext().getFederationMetaData().getDatabases().get("foo_db").getSchemas(); - assertTrue(schemas.get("foo_db").getTables().containsKey("foo_table")); - } - @Test public void assertDeleteDatabase() { when(metaDataContexts.getMetaData().getDatabases()).thenReturn(new HashMap<>(Collections.singletonMap("foo_db", mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS))));