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 030030c77d5 New metadata structure for Standalone mode (#28027)
030030c77d5 is described below

commit 030030c77d5a1708070e957d62d11aa8a8dcb927
Author: zhaojinchao <[email protected]>
AuthorDate: Fri Aug 11 10:06:50 2023 +0800

    New metadata structure for Standalone mode (#28027)
    
    * New metadata structure for Standalone mode
    
    * Fix ci
    
    * Update
    
    * Fix unit test
    
    * Fix bug
---
 ...ava => NewStandaloneContextManagerBuilder.java} |  19 +-
 .../NewStandaloneModeContextManager.java           | 333 +++++++++++++++++++++
 .../StandaloneContextManagerBuilder.java           |   7 +-
 ...YamlPersistRepositoryConfigurationSwapper.java} |   7 +-
 ...eYamlPersistRepositoryConfigurationSwapper.java |   2 +-
 ....mode.YamlPersistRepositoryConfigurationSwapper |   1 +
 ...ardingsphere.mode.manager.ContextManagerBuilder |   1 +
 .../distsql/ral/RALBackendHandlerFactory.java      |   3 +-
 .../distsql/rdl/RDLBackendHandlerFactory.java      |   3 +-
 .../rdl/rule/NewRuleDefinitionBackendHandler.java  |   2 +-
 10 files changed, 356 insertions(+), 22 deletions(-)

diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneContextManagerBuilder.java
similarity index 79%
copy from 
mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
copy to 
mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneContextManagerBuilder.java
index 3495bd889c0..eeb80576e06 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneContextManagerBuilder.java
@@ -20,9 +20,9 @@ package org.apache.shardingsphere.mode.manager.standalone;
 import 
org.apache.shardingsphere.infra.config.mode.PersistRepositoryConfiguration;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
-import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
+import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
 import org.apache.shardingsphere.mode.lock.GlobalLockContext;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilder;
@@ -30,26 +30,27 @@ import 
org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
 import 
org.apache.shardingsphere.mode.manager.standalone.subscriber.StandaloneProcessSubscriber;
 import 
org.apache.shardingsphere.mode.manager.standalone.workerid.generator.StandaloneWorkerIdGenerator;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.NewMetaDataContextsFactory;
 import 
org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepository;
 
 import java.sql.SQLException;
 import java.util.Properties;
 
 /**
- * Standalone context manager builder.
+ * TODO Rename StandaloneContextManagerBuilder when metadata structure 
adjustment completed. #25485
+ * New Standalone context manager builder.
  */
-public final class StandaloneContextManagerBuilder implements 
ContextManagerBuilder {
+public final class NewStandaloneContextManagerBuilder implements 
ContextManagerBuilder {
     
     @Override
     public ContextManager build(final ContextManagerBuilderParameter param) 
throws SQLException {
         PersistRepositoryConfiguration repositoryConfig = 
param.getModeConfiguration().getRepository();
         StandalonePersistRepository repository = TypedSPILoader.getService(
                 StandalonePersistRepository.class, null == repositoryConfig ? 
null : repositoryConfig.getType(), null == repositoryConfig ? new Properties() 
: repositoryConfig.getProps());
-        MetaDataPersistService persistService = new 
MetaDataPersistService(repository);
+        NewMetaDataPersistService persistService = new 
NewMetaDataPersistService(repository);
         InstanceContext instanceContext = buildInstanceContext(param);
         new StandaloneProcessSubscriber(instanceContext.getEventBusContext());
-        MetaDataContexts metaDataContexts = 
MetaDataContextsFactory.create(persistService, param, instanceContext);
+        MetaDataContexts metaDataContexts = 
NewMetaDataContextsFactory.create(persistService, param, instanceContext);
         ContextManager result = new ContextManager(metaDataContexts, 
instanceContext);
         setContextManagerAware(result);
         return result;
@@ -57,11 +58,11 @@ public final class StandaloneContextManagerBuilder 
implements ContextManagerBuil
     
     private InstanceContext buildInstanceContext(final 
ContextManagerBuilderParameter param) {
         return new InstanceContext(new 
ComputeNodeInstance(param.getInstanceMetaData()),
-                new StandaloneWorkerIdGenerator(), 
param.getModeConfiguration(), new StandaloneModeContextManager(), new 
GlobalLockContext(null), new EventBusContext());
+                new StandaloneWorkerIdGenerator(), 
param.getModeConfiguration(), new NewStandaloneModeContextManager(), new 
GlobalLockContext(null), new EventBusContext());
     }
     
     private void setContextManagerAware(final ContextManager contextManager) {
-        ((StandaloneModeContextManager) 
contextManager.getInstanceContext().getModeContextManager()).setContextManagerAware(contextManager);
+        ((NewStandaloneModeContextManager) 
contextManager.getInstanceContext().getModeContextManager()).setContextManagerAware(contextManager);
     }
     
     @Override
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
new file mode 100644
index 00000000000..edfe3280a8f
--- /dev/null
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
@@ -0,0 +1,333 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.manager.standalone;
+
+import com.google.common.base.Strings;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.datasource.pool.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.instance.mode.ModeContextManager;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
+import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
+import org.apache.shardingsphere.infra.rule.identifier.type.MetaDataHeldRule;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
+import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
+import 
org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache;
+import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.manager.ContextManagerAware;
+import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager;
+import org.apache.shardingsphere.mode.manager.switcher.SwitchingResource;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.stream.Collectors;
+
+/**
+ * TODO Rename StandaloneModeContextManager when metadata structure adjustment 
completed. #25485
+ * New Standalone mode context manager.
+ */
+public final class NewStandaloneModeContextManager implements 
ModeContextManager, ContextManagerAware {
+    
+    private ContextManager contextManager;
+    
+    @Override
+    public void createDatabase(final String databaseName) {
+        
contextManager.getResourceMetaDataContextManager().addDatabase(databaseName);
+        
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().addDatabase(databaseName);
+        clearServiceCache();
+    }
+    
+    @Override
+    public void dropDatabase(final String databaseName) {
+        
contextManager.getResourceMetaDataContextManager().dropDatabase(databaseName);
+        
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().dropDatabase(databaseName);
+        clearServiceCache();
+    }
+    
+    @Override
+    public void createSchema(final String databaseName, final String 
schemaName) {
+        ShardingSphereSchema schema = new ShardingSphereSchema();
+        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
+        database.putSchema(schemaName, schema);
+        refreshMetaDataHeldRule(database);
+        
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().persist(databaseName,
 schemaName, schema);
+    }
+    
+    @Override
+    public void alterSchema(final AlterSchemaPOJO alterSchemaPOJO) {
+        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(alterSchemaPOJO.getDatabaseName());
+        putSchemaMetaData(database, alterSchemaPOJO.getSchemaName(), 
alterSchemaPOJO.getRenameSchemaName(), 
alterSchemaPOJO.getLogicDataSourceName());
+        removeSchemaMetaData(database, alterSchemaPOJO.getSchemaName());
+        refreshMetaDataHeldRule(database);
+        DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
+        databaseMetaDataService.persist(alterSchemaPOJO.getDatabaseName(), 
alterSchemaPOJO.getRenameSchemaName(), 
database.getSchema(alterSchemaPOJO.getRenameSchemaName()));
+        
databaseMetaDataService.getViewMetaDataPersistService().persist(alterSchemaPOJO.getDatabaseName(),
 alterSchemaPOJO.getRenameSchemaName(),
+                
database.getSchema(alterSchemaPOJO.getRenameSchemaName()).getViews());
+        databaseMetaDataService.dropSchema(alterSchemaPOJO.getDatabaseName(), 
alterSchemaPOJO.getSchemaName());
+    }
+    
+    private void putSchemaMetaData(final ShardingSphereDatabase database, 
final String schemaName, final String renameSchemaName, final String 
logicDataSourceName) {
+        ShardingSphereSchema schema = database.getSchema(schemaName);
+        database.putSchema(renameSchemaName, schema);
+        addDataNode(database, logicDataSourceName, schemaName, 
schema.getAllTableNames());
+    }
+    
+    private void addDataNode(final ShardingSphereDatabase database, final 
String logicDataSourceName, final String schemaName, final Collection<String> 
tobeAddedTableNames) {
+        tobeAddedTableNames.forEach(each -> {
+            if (!Strings.isNullOrEmpty(logicDataSourceName) && 
isSingleTable(each, database)) {
+                
database.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(rule -> 
rule.put(logicDataSourceName, schemaName, each));
+            }
+        });
+    }
+    
+    private void addDataNode(final ShardingSphereDatabase database, final 
String logicDataSourceName, final String schemaName, final Map<String, 
ShardingSphereTable> toBeAddedTables,
+                             final Map<String, ShardingSphereView> 
toBeAddedViews) {
+        addTablesToDataNode(database, schemaName, logicDataSourceName, 
toBeAddedTables);
+        addViewsToDataNode(database, schemaName, logicDataSourceName, 
toBeAddedTables, toBeAddedViews);
+    }
+    
+    private void addTablesToDataNode(final ShardingSphereDatabase database, 
final String schemaName, final String logicDataSourceName, final Map<String, 
ShardingSphereTable> toBeAddedTables) {
+        for (Entry<String, ShardingSphereTable> entry : 
toBeAddedTables.entrySet()) {
+            if (!Strings.isNullOrEmpty(logicDataSourceName) && 
isSingleTable(entry.getKey(), database)) {
+                
database.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(rule -> 
rule.put(logicDataSourceName, schemaName, entry.getKey()));
+            }
+            database.getSchema(schemaName).putTable(entry.getKey(), 
entry.getValue());
+        }
+    }
+    
+    private void addViewsToDataNode(final ShardingSphereDatabase database, 
final String schemaName, final String logicDataSourceName,
+                                    final Map<String, ShardingSphereTable> 
toBeAddedTables, final Map<String, ShardingSphereView> toBeAddedViews) {
+        for (Entry<String, ShardingSphereView> entry : 
toBeAddedViews.entrySet()) {
+            if (!Strings.isNullOrEmpty(logicDataSourceName) && 
isSingleTable(entry.getKey(), database)) {
+                
database.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(rule -> 
rule.put(logicDataSourceName, schemaName, entry.getKey()));
+            }
+            database.getSchema(schemaName).putTable(entry.getKey(), 
toBeAddedTables.get(entry.getKey().toLowerCase()));
+            database.getSchema(schemaName).putView(entry.getKey(), 
entry.getValue());
+        }
+    }
+    
+    private boolean isSingleTable(final String tableName, final 
ShardingSphereDatabase database) {
+        return 
database.getRuleMetaData().findRules(TableContainedRule.class).stream().noneMatch(each
 -> each.getDistributedTableMapper().contains(tableName));
+    }
+    
+    private void removeSchemaMetaData(final ShardingSphereDatabase database, 
final String schemaName) {
+        ShardingSphereSchema schema = new 
ShardingSphereSchema(database.getSchema(schemaName).getTables(), 
database.getSchema(schemaName).getViews());
+        database.removeSchema(schemaName);
+        
removeDataNode(database.getRuleMetaData().findRules(MutableDataNodeRule.class), 
Collections.singletonList(schemaName), schema.getAllTableNames());
+    }
+    
+    private void removeDataNode(final Collection<MutableDataNodeRule> rules, 
final Collection<String> schemaNames, final Collection<String> 
tobeRemovedTables) {
+        tobeRemovedTables.forEach(each -> rules.forEach(rule -> 
rule.remove(schemaNames, each)));
+    }
+    
+    private void removeDataNode(final ShardingSphereDatabase database, final 
String schemaName, final Collection<String> tobeRemovedTables, final 
Collection<String> tobeRemovedViews) {
+        removeTablesToDataNode(database, schemaName, tobeRemovedTables);
+        removeViewsToDataNode(database, schemaName, tobeRemovedTables, 
tobeRemovedViews);
+    }
+    
+    private void removeDataNode(final Collection<MutableDataNodeRule> rules, 
final String schemaName, final Collection<String> tobeRemovedTables) {
+        tobeRemovedTables.forEach(each -> rules.forEach(rule -> 
rule.remove(schemaName, each)));
+    }
+    
+    private void removeTablesToDataNode(final ShardingSphereDatabase database, 
final String schemaName, final Collection<String> toBeDroppedTables) {
+        
removeDataNode(database.getRuleMetaData().findRules(MutableDataNodeRule.class), 
schemaName, toBeDroppedTables);
+        toBeDroppedTables.forEach(each -> 
database.getSchema(schemaName).removeTable(each));
+    }
+    
+    private void removeViewsToDataNode(final ShardingSphereDatabase database, 
final String schemaName, final Collection<String> toBeDroppedTables, final 
Collection<String> toBeDroppedViews) {
+        
removeDataNode(database.getRuleMetaData().findRules(MutableDataNodeRule.class), 
schemaName, toBeDroppedViews);
+        ShardingSphereSchema schema = database.getSchema(schemaName);
+        toBeDroppedTables.forEach(schema::removeTable);
+        toBeDroppedViews.forEach(schema::removeView);
+    }
+    
+    @Override
+    public void dropSchema(final String databaseName, final Collection<String> 
schemaNames) {
+        Collection<String> tobeRemovedTables = new LinkedHashSet<>();
+        Collection<String> tobeRemovedSchemas = new LinkedHashSet<>();
+        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
+        for (String each : schemaNames) {
+            ShardingSphereSchema schema = new 
ShardingSphereSchema(database.getSchema(each).getTables(), 
database.getSchema(each).getViews());
+            database.removeSchema(each);
+            Optional.of(schema).ifPresent(optional -> 
tobeRemovedTables.addAll(optional.getAllTableNames()));
+            tobeRemovedSchemas.add(each.toLowerCase());
+        }
+        
removeDataNode(database.getRuleMetaData().findRules(MutableDataNodeRule.class), 
tobeRemovedSchemas, tobeRemovedTables);
+        refreshMetaDataHeldRule(database);
+    }
+    
+    @Override
+    public void alterSchemaMetaData(final AlterSchemaMetaDataPOJO 
alterSchemaMetaDataPOJO) {
+        String databaseName = alterSchemaMetaDataPOJO.getDatabaseName();
+        String schemaName = alterSchemaMetaDataPOJO.getSchemaName();
+        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
+        Map<String, ShardingSphereTable> tables = 
alterSchemaMetaDataPOJO.getAlteredTables().stream().collect(Collectors.toMap(ShardingSphereTable::getName,
 table -> table));
+        Map<String, ShardingSphereView> views = 
alterSchemaMetaDataPOJO.getAlteredViews().stream().collect(Collectors.toMap(ShardingSphereView::getName,
 view -> view));
+        addDataNode(database, 
alterSchemaMetaDataPOJO.getLogicDataSourceName(), schemaName, tables, views);
+        removeDataNode(database, schemaName, 
alterSchemaMetaDataPOJO.getDroppedTables(), 
alterSchemaMetaDataPOJO.getDroppedViews());
+        refreshMetaDataHeldRule(database);
+        DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
+        
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName, 
schemaName, tables);
+        
databaseMetaDataService.getViewMetaDataPersistService().persist(databaseName, 
schemaName, views);
+        alterSchemaMetaDataPOJO.getDroppedTables().forEach(each -> 
databaseMetaDataService.getTableMetaDataPersistService().delete(databaseName, 
schemaName, each));
+        alterSchemaMetaDataPOJO.getDroppedViews().forEach(each -> 
databaseMetaDataService.getViewMetaDataPersistService().delete(databaseName, 
schemaName, each));
+    }
+    
+    private void refreshMetaDataHeldRule(final ShardingSphereDatabase 
database) {
+        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findRules(MetaDataHeldRule.class).forEach(each
 -> each.alterDatabase(database));
+    }
+    
+    @Override
+    public void registerStorageUnits(final String databaseName, final 
Map<String, DataSourceProperties> toBeRegisterStorageUnitProps) throws 
SQLException {
+        SwitchingResource switchingResource =
+                new 
ResourceSwitchManager().create(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeRegisterStorageUnitProps);
+        
contextManager.getMetaDataContexts().getMetaData().getDatabases().putAll(contextManager.getConfigurationContextManager().createChangedDatabases(databaseName,
 false, switchingResource, null));
+        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class)
+                .forEach(each -> 
each.addResource(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName)));
+        
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getSchemas()
+                .forEach((schemaName, schema) -> 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService()
+                        
.persist(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 schemaName, schema));
+        
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().append(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
+                toBeRegisterStorageUnitProps);
+        clearServiceCache();
+    }
+    
+    @Override
+    public void alterStorageUnits(final String databaseName, final Map<String, 
DataSourceProperties> toBeUpdatedStorageUnitProps) throws SQLException {
+        SwitchingResource switchingResource =
+                new 
ResourceSwitchManager().create(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeUpdatedStorageUnitProps);
+        
contextManager.getMetaDataContexts().getMetaData().getDatabases().putAll(contextManager.getConfigurationContextManager().createChangedDatabases(databaseName,
 true, switchingResource, null));
+        
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class)
+                .forEach(each -> 
each.addResource(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName)));
+        
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().append(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
+                toBeUpdatedStorageUnitProps);
+        switchingResource.closeStaleDataSources();
+        clearServiceCache();
+    }
+    
+    @Override
+    public void unregisterStorageUnits(final String databaseName, final 
Collection<String> toBeDroppedStorageUnitNames) throws SQLException {
+        Map<String, DataSourceProperties> dataSourcePropsMap = 
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService()
+                
.load(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName());
+        Map<String, DataSourceProperties> toBeDeletedDataSourcePropsMap = 
getToBeDeletedDataSourcePropsMap(dataSourcePropsMap, 
toBeDroppedStorageUnitNames);
+        SwitchingResource switchingResource =
+                new 
ResourceSwitchManager().createByDropResource(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData(),
 toBeDeletedDataSourcePropsMap);
+        contextManager.getMetaDataContexts().getMetaData().getDatabases()
+                
.putAll(contextManager.getConfigurationContextManager().renewDatabase(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName),
 switchingResource));
+        MetaDataContexts reloadMetaDataContexts = 
contextManager.getConfigurationContextManager().createMetaDataContexts(databaseName,
 false, switchingResource, null);
+        
contextManager.getConfigurationContextManager().alterSchemaMetaData(databaseName,
 reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
+                
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
+        contextManager.deletedSchemaNames(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
+        contextManager.renewMetaDataContexts(reloadMetaDataContexts);
+        Map<String, DataSourceProperties> toBeReversedDataSourcePropsMap = 
getToBeReversedDataSourcePropsMap(dataSourcePropsMap, 
toBeDroppedStorageUnitNames);
+        
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().persist(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
+                toBeReversedDataSourcePropsMap);
+        switchingResource.closeStaleDataSources();
+        clearServiceCache();
+    }
+    
+    private Map<String, DataSourceProperties> 
getToBeDeletedDataSourcePropsMap(final Map<String, DataSourceProperties> 
dataSourcePropsMap, final Collection<String> toBeDroppedResourceNames) {
+        return dataSourcePropsMap.entrySet().stream().filter(entry -> 
toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
+    }
+    
+    private Map<String, DataSourceProperties> 
getToBeReversedDataSourcePropsMap(final Map<String, DataSourceProperties> 
dataSourcePropsMap, final Collection<String> toBeDroppedResourceNames) {
+        return dataSourcePropsMap.entrySet().stream().filter(entry -> 
!toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
 Entry::getValue));
+    }
+    
+    @Override
+    public void alterRuleConfiguration(final String databaseName, final 
Collection<RuleConfiguration> ruleConfigs) {
+        
contextManager.getConfigurationContextManager().alterRuleConfiguration(databaseName,
 ruleConfigs);
+        contextManager.getMetaDataContexts().getPersistService()
+                
.getDatabaseRulePersistService().persist(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 ruleConfigs);
+        clearServiceCache();
+    }
+    
+    @Override
+    public Collection<MetaDataVersion> alterRuleConfiguration(final String 
databaseName, final RuleConfiguration toBeAlteredRuleConfig) {
+        if (null != toBeAlteredRuleConfig) {
+            
contextManager.getConfigurationContextManager().alterRuleConfiguration(databaseName,
 Collections.singletonList(toBeAlteredRuleConfig));
+            contextManager.getMetaDataContexts().getPersistService()
+                    
.getDatabaseRulePersistService().persist(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 Collections.singletonList(toBeAlteredRuleConfig));
+            clearServiceCache();
+        }
+        return Collections.emptyList();
+    }
+    
+    @Override
+    public void removeRuleConfigurationItem(final String databaseName, final 
RuleConfiguration toBeRemovedRuleConfig) {
+        if (null != toBeRemovedRuleConfig) {
+            
contextManager.getConfigurationContextManager().dropRuleConfiguration(databaseName,
 toBeRemovedRuleConfig);
+            
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().delete(databaseName,
 Collections.singleton(toBeRemovedRuleConfig));
+            clearServiceCache();
+        }
+    }
+    
+    @Override
+    public void removeRuleConfiguration(final String databaseName, final 
String ruleName) {
+        
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().delete(databaseName,
 ruleName);
+        clearServiceCache();
+    }
+    
+    @Override
+    public void alterGlobalRuleConfiguration(final 
Collection<RuleConfiguration> globalRuleConfigs) {
+        
contextManager.getConfigurationContextManager().alterGlobalRuleConfiguration(globalRuleConfigs);
+        
contextManager.getMetaDataContexts().getPersistService().getGlobalRuleService().persist(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getConfigurations());
+        clearServiceCache();
+    }
+    
+    @Override
+    public void alterGlobalRuleConfiguration(final RuleConfiguration 
toBeAlteredRuleConfig) {
+        
contextManager.getConfigurationContextManager().alterGlobalRuleConfiguration(toBeAlteredRuleConfig);
+        GlobalPersistService<Collection<RuleConfiguration>> globalRuleService 
= 
contextManager.getMetaDataContexts().getPersistService().getGlobalRuleService();
+        
contextManager.getMetaDataContexts().getPersistService().getMetaDataVersionPersistService().switchActiveVersion(globalRuleService.persistConfig(Collections.singleton(toBeAlteredRuleConfig)));
+        clearServiceCache();
+    }
+    
+    @Override
+    public void alterProperties(final Properties props) {
+        contextManager.getConfigurationContextManager().alterProperties(props);
+        if (null != 
contextManager.getMetaDataContexts().getPersistService().getPropsService()) {
+            Collection<MetaDataVersion> versions = 
contextManager.getMetaDataContexts().getPersistService().getPropsService().persistConfig(props);
+            
contextManager.getMetaDataContexts().getPersistService().getMetaDataVersionPersistService().switchActiveVersion(versions);
+        }
+        clearServiceCache();
+    }
+    
+    private void clearServiceCache() {
+        OrderedServicesCache.clearCache();
+    }
+    
+    @Override
+    public void setContextManagerAware(final ContextManager contextManager) {
+        this.contextManager = contextManager;
+    }
+}
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
index 3495bd889c0..10d41830418 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
@@ -66,11 +66,6 @@ public final class StandaloneContextManagerBuilder 
implements ContextManagerBuil
     
     @Override
     public String getType() {
-        return "Standalone";
-    }
-    
-    @Override
-    public boolean isDefault() {
-        return true;
+        return "Compatible_Standalone";
     }
 }
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/StandaloneYamlPersistRepositoryConfigurationSwapper.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/NewStandaloneYamlPersistRepositoryConfigurationSwapper.java
similarity index 84%
copy from 
mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/StandaloneYamlPersistRepositoryConfigurationSwapper.java
copy to 
mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/NewStandaloneYamlPersistRepositoryConfigurationSwapper.java
index 333044900c7..7d0fd7ce34d 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/StandaloneYamlPersistRepositoryConfigurationSwapper.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/NewStandaloneYamlPersistRepositoryConfigurationSwapper.java
@@ -17,14 +17,15 @@
 
 package org.apache.shardingsphere.mode.manager.standalone.yaml;
 
-import 
org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepositoryConfiguration;
 import 
org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlPersistRepositoryConfiguration;
 import 
org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper;
+import 
org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepositoryConfiguration;
 
 /**
- * Standalone YAML persist repository configuration swapper.
+ * TODO Rename StandaloneYamlPersistRepositoryConfigurationSwapper when 
metadata structure adjustment completed. #25485
+ * New Standalone YAML persist repository configuration swapper.
  */
-public final class StandaloneYamlPersistRepositoryConfigurationSwapper 
implements 
YamlPersistRepositoryConfigurationSwapper<StandalonePersistRepositoryConfiguration>
 {
+public final class NewStandaloneYamlPersistRepositoryConfigurationSwapper 
implements 
YamlPersistRepositoryConfigurationSwapper<StandalonePersistRepositoryConfiguration>
 {
     
     @Override
     public YamlPersistRepositoryConfiguration swapToYamlConfiguration(final 
StandalonePersistRepositoryConfiguration data) {
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/StandaloneYamlPersistRepositoryConfigurationSwapper.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/StandaloneYamlPersistRepositoryConfigurationSwapper.java
index 333044900c7..847cdf5bdee 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/StandaloneYamlPersistRepositoryConfigurationSwapper.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/yaml/StandaloneYamlPersistRepositoryConfigurationSwapper.java
@@ -41,6 +41,6 @@ public final class 
StandaloneYamlPersistRepositoryConfigurationSwapper implement
     
     @Override
     public String getType() {
-        return "Standalone";
+        return "Compatible_Standalone";
     }
 }
diff --git 
a/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper
 
b/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper
index a88aa27daa7..846ad4f18d6 100644
--- 
a/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper
+++ 
b/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper
@@ -16,3 +16,4 @@
 #
 
 
org.apache.shardingsphere.mode.manager.standalone.yaml.StandaloneYamlPersistRepositoryConfigurationSwapper
+org.apache.shardingsphere.mode.manager.standalone.yaml.NewStandaloneYamlPersistRepositoryConfigurationSwapper
diff --git 
a/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder
 
b/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder
index ee1dd93b9fa..71671fd356b 100644
--- 
a/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder
+++ 
b/mode/type/standalone/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder
@@ -16,3 +16,4 @@
 #
 
 
org.apache.shardingsphere.mode.manager.standalone.StandaloneContextManagerBuilder
+org.apache.shardingsphere.mode.manager.standalone.NewStandaloneContextManagerBuilder
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/RALBackendHandlerFactory.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/RALBackendHandlerFactory.java
index 5ee976e81bb..9f67920d932 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/RALBackendHandlerFactory.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/RALBackendHandlerFactory.java
@@ -45,7 +45,8 @@ public final class RALBackendHandlerFactory {
             return new QueryableRALBackendHandler<>((QueryableRALStatement) 
sqlStatement, connectionSession);
         }
         if (sqlStatement instanceof UpdatableGlobalRuleRALStatement) {
-            if 
("Cluster".equals(ProxyContext.getInstance().getContextManager().getInstanceContext().getModeConfiguration().getType()))
 {
+            String modeType = 
ProxyContext.getInstance().getContextManager().getInstanceContext().getModeConfiguration().getType();
+            if ("Cluster".equals(modeType) || "Standalone".equals(modeType)) {
                 return new 
NewUpdatableGlobalRuleRALBackendHandler((UpdatableGlobalRuleRALStatement) 
sqlStatement);
             }
             return new 
UpdatableGlobalRuleRALBackendHandler((UpdatableGlobalRuleRALStatement) 
sqlStatement);
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/RDLBackendHandlerFactory.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/RDLBackendHandlerFactory.java
index 07be027b282..a5a96aaaf02 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/RDLBackendHandlerFactory.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/RDLBackendHandlerFactory.java
@@ -52,7 +52,8 @@ public final class RDLBackendHandlerFactory {
             return 
getStorageUnitBackendHandler((StorageUnitDefinitionStatement) sqlStatement, 
connectionSession);
         }
         // TODO Remove when metadata structure adjustment completed. #25485
-        if 
("Cluster".equals(ProxyContext.getInstance().getContextManager().getInstanceContext().getModeConfiguration().getType()))
 {
+        String modeType = 
ProxyContext.getInstance().getContextManager().getInstanceContext().getModeConfiguration().getType();
+        if ("Cluster".equals(modeType) || "Standalone".equals(modeType)) {
             return new 
NewRuleDefinitionBackendHandler<>((RuleDefinitionStatement) sqlStatement, 
connectionSession);
         }
         return new RuleDefinitionBackendHandler<>((RuleDefinitionStatement) 
sqlStatement, connectionSession);
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
index 60b4a1ec05a..5185efcb505 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
@@ -138,7 +138,7 @@ public final class NewRuleDefinitionBackendHandler<T 
extends RuleDefinitionState
             return Collections.emptyList();
         }
         ModeContextManager modeContextManager = 
ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager();
-        final RuleConfiguration toBeDroppedRuleConfig = 
updater.buildToBeDroppedRuleConfiguration(currentRuleConfig, sqlStatement);
+        RuleConfiguration toBeDroppedRuleConfig = 
updater.buildToBeDroppedRuleConfiguration(currentRuleConfig, sqlStatement);
         // TODO remove updateCurrentRuleConfiguration after update refactor 
completed.
         if (updater.updateCurrentRuleConfiguration(sqlStatement, 
currentRuleConfig) && ((DatabaseRuleConfiguration) 
currentRuleConfig).isEmpty()) {
             modeContextManager.removeRuleConfigurationItem(database.getName(), 
toBeDroppedRuleConfig);


Reply via email to