This is an automated email from the ASF dual-hosted git repository.
panjuan 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 3441d148208 Add OptimizerContext.alterTable (#18683)
3441d148208 is described below
commit 3441d1482087ea3738c6362de8731308b18a23b6
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jun 29 14:30:56 2022 +0800
Add OptimizerContext.alterTable (#18683)
---
.../optimizer/context/OptimizerContext.java | 13 ++++
.../mode/manager/ContextManager.java | 86 +++++++++++-----------
2 files changed, 55 insertions(+), 44 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
index f6864a10781..e19abda5345 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
@@ -71,4 +71,17 @@ public final class OptimizerContext {
// TODO add schema only
plannerContexts.put(databaseName,
OptimizerPlannerContextFactory.create(federationMetaData.getDatabases().get(databaseName)));
}
+
+ /**
+ * Alter table.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param changedTable changed table
+ */
+ public void alterTable(final String databaseName, final String schemaName,
final ShardingSphereTable changedTable) {
+ FederationDatabaseMetaData federationDatabaseMetaData =
federationMetaData.getDatabases().get(databaseName);
+ federationDatabaseMetaData.putTable(schemaName, changedTable);
+ plannerContexts.put(databaseName,
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
+ }
}
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 f3142720bd9..fcc754decd1 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
@@ -141,6 +141,48 @@ public final class ContextManager implements AutoCloseable
{
metaDataContexts.getOptimizerContext().addSchema(databaseName,
schemaName);
}
+ /**
+ * Alter schema.
+ *
+ * @param databaseName database name
+ * @param schemaName schema name
+ * @param changedTable changed table
+ * @param deletedTableName deleted table name
+ */
+ public void alterSchema(final String databaseName, final String
schemaName, final ShardingSphereTable changedTable, final String
deletedTableName) {
+ if
(metaDataContexts.getMetaData().getDatabases().containsKey(databaseName)) {
+ Optional.ofNullable(changedTable).ifPresent(optional ->
alterTableSchema(databaseName, schemaName, optional));
+ Optional.ofNullable(deletedTableName).ifPresent(optional ->
deleteTable(databaseName, schemaName, optional));
+ }
+ }
+
+ private void alterTableSchema(final String databaseName, final String
schemaName, final ShardingSphereTable changedTable) {
+ ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabases().get(databaseName);
+ alterSingleTableDataNodes(databaseName, database, changedTable);
+ database.getSchemas().get(schemaName).put(changedTable.getName(),
changedTable);
+ metaDataContexts.getOptimizerContext().alterTable(databaseName,
schemaName, changedTable);
+ }
+
+ private void alterSingleTableDataNodes(final String databaseName, final
ShardingSphereDatabase database, final ShardingSphereTable
changedTableMetaData) {
+ if
(!containsInImmutableDataNodeContainedRule(changedTableMetaData.getName(),
database)) {
+ refreshRules(databaseName, database);
+ }
+ }
+
+ private boolean containsInImmutableDataNodeContainedRule(final String
tableName, final ShardingSphereDatabase database) {
+ return
database.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
+ .filter(each -> !(each instanceof
MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
+ }
+
+ private void deleteTable(final String databaseName, final String
schemaName, final String deletedTableName) {
+ if (null !=
metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas().get(schemaName))
{
+
metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas().get(schemaName).remove(deletedTableName);
+ FederationDatabaseMetaData databaseMetaData =
metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
+ databaseMetaData.removeTableMetadata(schemaName, deletedTableName);
+
metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName,
OptimizerPlannerContextFactory.create(databaseMetaData));
+ }
+ }
+
/**
* Alter schemas.
*
@@ -159,41 +201,11 @@ public final class ContextManager implements
AutoCloseable {
rebuildMetaDataContexts(new
ShardingSphereMetaData(alteredDatabases,
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
metaDataContexts.getMetaData().getProps())));
}
- /**
- * Alter schema.
- *
- * @param databaseName database name
- * @param schemaName schema name
- * @param changedTableMetaData changed table meta data
- * @param deletedTable deleted table
- */
- public void alterSchema(final String databaseName, final String
schemaName, final ShardingSphereTable changedTableMetaData, final String
deletedTable) {
- if (null !=
metaDataContexts.getMetaData().getDatabases().get(databaseName)) {
- Optional.ofNullable(changedTableMetaData).ifPresent(optional ->
alterTableSchema(databaseName, schemaName, optional));
- Optional.ofNullable(deletedTable).ifPresent(optional ->
deleteTable(databaseName, schemaName, optional));
- }
- }
-
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))));
}
- private void alterTableSchema(final String databaseName, final String
schemaName, final ShardingSphereTable changedTableMetaData) {
- ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabases().get(databaseName);
- alterSingleTableDataNodes(databaseName, database,
changedTableMetaData);
- FederationDatabaseMetaData federationDatabaseMetaData =
metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
-
database.getSchemas().get(schemaName).put(changedTableMetaData.getName(),
changedTableMetaData);
- federationDatabaseMetaData.putTable(schemaName, changedTableMetaData);
-
metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName,
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
- }
-
- private void alterSingleTableDataNodes(final String databaseName, final
ShardingSphereDatabase database, final ShardingSphereTable
changedTableMetaData) {
- if
(!containsInImmutableDataNodeContainedRule(changedTableMetaData.getName(),
database)) {
- refreshRules(databaseName, database);
- }
- }
-
private void refreshRules(final String databaseName, final
ShardingSphereDatabase database) {
Collection<ShardingSphereRule> databaseRules =
DatabaseRulesBuilder.build(
databaseName, new
DataSourceProvidedDatabaseConfiguration(database.getResource().getDataSources(),
database.getRuleMetaData().getConfigurations()));
@@ -201,20 +213,6 @@ public final class ContextManager implements AutoCloseable
{
database.getRuleMetaData().getRules().addAll(databaseRules);
}
- private void deleteTable(final String databaseName, final String
schemaName, final String deletedTable) {
- if (null !=
metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas().get(schemaName))
{
-
metaDataContexts.getMetaData().getDatabases().get(databaseName).getSchemas().get(schemaName).remove(deletedTable);
- FederationDatabaseMetaData databaseMetaData =
metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().get(databaseName);
- databaseMetaData.removeTableMetadata(schemaName, deletedTable);
-
metaDataContexts.getOptimizerContext().getPlannerContexts().put(databaseName,
OptimizerPlannerContextFactory.create(databaseMetaData));
- }
- }
-
- private boolean containsInImmutableDataNodeContainedRule(final String
tableName, final ShardingSphereDatabase schemaMetaData) {
- return
schemaMetaData.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
- .filter(each -> !(each instanceof
MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
- }
-
/**
* Delete database.
*