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 d34e3651041 Refactor ContextManager.addResource (#18938)
d34e3651041 is described below

commit d34e3651041d90c5eb2e2c93aae0ff3f00fa6384
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jul 7 19:16:53 2022 +0800

    Refactor ContextManager.addResource (#18938)
---
 .../optimizer/context/OptimizerContext.java        | 14 ++++++++++++++
 .../mode/manager/ContextManager.java               | 22 +++++-----------------
 2 files changed, 19 insertions(+), 17 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 cd2ad256466..398137ba4d5 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
@@ -26,6 +26,8 @@ import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.Opti
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 
@@ -60,6 +62,18 @@ public final class OptimizerContext {
         plannerContexts.put(databaseName, 
OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
     }
     
+    /**
+     * Alter database.
+     *
+     * @param database to be altered database
+     * @param globalRuleMetaData global rule meta data
+     */
+    public void alterDatabase(final ShardingSphereDatabase database, final 
ShardingSphereRuleMetaData globalRuleMetaData) {
+        OptimizerContext toBeAlteredOptimizerContext = 
OptimizerContextFactory.create(Collections.singletonMap(database.getName(), 
database), globalRuleMetaData);
+        federationMetaData.getDatabases().put(database.getName(), 
toBeAlteredOptimizerContext.getFederationMetaData().getDatabases().get(database.getName()));
+        plannerContexts.put(database.getName(), 
toBeAlteredOptimizerContext.getPlannerContexts().get(database.getName()));
+    }
+    
     /**
      * Drop database.
      *
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 37d63d132ab..90ea3c56726 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
@@ -205,26 +205,14 @@ public final class ContextManager implements 
AutoCloseable {
      * @throws SQLException SQL exception
      */
     public synchronized void addResource(final String databaseName, final 
Map<String, DataSourceProperties> toBeAddedDataSourcePropsMap) throws 
SQLException {
-        MetaDataContexts changedMetaDataContexts = 
buildChangedMetaDataContextWithAddedDataSource(databaseName, 
toBeAddedDataSourcePropsMap);
-        refreshMetaDataContext(databaseName, changedMetaDataContexts);
+        SwitchingResource switchingResource = new 
ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(),
 toBeAddedDataSourcePropsMap);
+        
metaDataContexts.getMetaData().getDatabases().putAll(createChangedDatabases(databaseName,
 switchingResource, null));
+        
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each
 -> 
each.addResource(metaDataContexts.getMetaData().getDatabases().get(databaseName)));
+        
metaDataContexts.getOptimizerContext().alterDatabase(metaDataContexts.getMetaData().getDatabases().get(databaseName),
 metaDataContexts.getMetaData().getGlobalRuleMetaData());
+        persistMetaData(metaDataContexts);
         metaDataContexts.getPersistService().ifPresent(optional -> 
optional.getDataSourceService().append(databaseName, 
toBeAddedDataSourcePropsMap));
     }
     
-    private MetaDataContexts 
buildChangedMetaDataContextWithAddedDataSource(final String databaseName, final 
Map<String, DataSourceProperties> addedDataSourceProps) throws SQLException {
-        ShardingSphereDatabase database = 
metaDataContexts.getMetaData().getDatabases().get(databaseName);
-        Map<String, DataSource> dataSourceMap = new 
HashMap<>(database.getResource().getDataSources());
-        
dataSourceMap.putAll(DataSourcePoolCreator.create(addedDataSourceProps));
-        ConfigurationProperties props = 
metaDataContexts.getMetaData().getProps();
-        DatabaseConfiguration databaseConfig = new 
DataSourceProvidedDatabaseConfiguration(dataSourceMap, 
database.getRuleMetaData().getConfigurations());
-        Map<String, ShardingSphereDatabase> databases = 
ShardingSphereDatabasesFactory.create(Collections.singletonMap(database.getName(),
 databaseConfig), props, instanceContext);
-        ShardingSphereRuleMetaData globalMetaData = new 
ShardingSphereRuleMetaData(
-                
GlobalRulesBuilder.buildRules(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations(),
 databases, instanceContext));
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(databases, globalMetaData, props);
-        MetaDataContexts result = newMetaDataContexts(metaData, 
OptimizerContextFactory.create(databases, globalMetaData));
-        persistMetaData(result);
-        return result;
-    }
-    
     /**
      * Alter resource.
      *

Reply via email to