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.
      *

Reply via email to