You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2024/12/01 09:44:27 UTC

(shardingsphere) branch master updated: Refactor ShardingSphereDatabase.create() (#33863)

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 7a8f0ad8049 Refactor ShardingSphereDatabase.create() (#33863)
7a8f0ad8049 is described below

commit 7a8f0ad8049fbd07c5a6d074b575089a4c2c1cc9
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun Dec 1 17:44:22 2024 +0800

    Refactor ShardingSphereDatabase.create() (#33863)
    
    * Refactor ShardingSphereDatabase.create()
    
    * Refactor ShardingSphereDatabase.create()
    
    * Refactor ShardingSphereDatabase.create()
---
 .../metadata/database/ShardingSphereDatabase.java  | 23 ++++++++++++++++++++++
 .../schema/SchemaMetaDataPersistService.java       |  9 +++------
 .../factory/InternalMetaDataFactoryTest.java       |  4 ++--
 .../schema/SchemaMetaDataPersistServiceTest.java   |  8 ++++----
 .../mode/metadata/manager/StorageUnitManager.java  | 19 +++++++++---------
 5 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
index 204042b884d..2a62a04aed4 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
@@ -122,6 +122,29 @@ public final class ShardingSphereDatabase {
         return create(name, protocolType, new LinkedList<>(), SystemSchemaBuilder.build(name, protocolType, props), resourceMetaData);
     }
     
+    /**
+     * Create database.
+     *
+     * @param name database name
+     * @param protocolType database protocol type
+     * @param databaseConfig database configuration
+     * @param computeNodeInstanceContext compute node instance context
+     * @param schemas schemas
+     * @return database
+     */
+    public static ShardingSphereDatabase create(final String name, final DatabaseType protocolType, final DatabaseConfiguration databaseConfig,
+                                                final ComputeNodeInstanceContext computeNodeInstanceContext, final Collection<ShardingSphereSchema> schemas) {
+        ResourceMetaData resourceMetaData = createResourceMetaData(databaseConfig.getDataSources(), databaseConfig.getStorageUnits());
+        Collection<ShardingSphereRule> rules = DatabaseRulesBuilder.build(name, protocolType, databaseConfig, computeNodeInstanceContext, resourceMetaData);
+        return create(name, protocolType, rules, schemas, resourceMetaData);
+    }
+    
+    private static ShardingSphereDatabase create(final String name, final DatabaseType protocolType, final Collection<ShardingSphereRule> rules,
+                                                 final Collection<ShardingSphereSchema> schemas, final ResourceMetaData resourceMetaData) {
+        RuleMetaData ruleMetaData = new RuleMetaData(rules);
+        return new ShardingSphereDatabase(name, protocolType, resourceMetaData, ruleMetaData, schemas);
+    }
+    
     /**
      * Create database.
      *
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/schema/SchemaMetaDataPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/schema/SchemaMetaDataPersistService.java
index b4fa2340d9b..3c49e1d4941 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/schema/SchemaMetaDataPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/metadata/schema/SchemaMetaDataPersistService.java
@@ -27,8 +27,6 @@ import org.apache.shardingsphere.mode.spi.PersistRepository;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -114,9 +112,8 @@ public final class SchemaMetaDataPersistService {
      * @param databaseName database name
      * @return schemas
      */
-    public Map<String, ShardingSphereSchema> load(final String databaseName) {
-        Collection<String> schemaNames = repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataSchemasPath(databaseName));
-        return schemaNames.stream().collect(Collectors.toMap(String::toLowerCase, each -> new ShardingSphereSchema(each, tableMetaDataPersistService.load(databaseName, each),
-                viewMetaDataPersistService.load(databaseName, each)), (a, b) -> b, () -> new LinkedHashMap<>(schemaNames.size(), 1F)));
+    public Collection<ShardingSphereSchema> load(final String databaseName) {
+        return repository.getChildrenKeys(DatabaseMetaDataNode.getMetaDataSchemasPath(databaseName)).stream()
+                .map(each -> new ShardingSphereSchema(each, tableMetaDataPersistService.load(databaseName, each), viewMetaDataPersistService.load(databaseName, each))).collect(Collectors.toList());
     }
 }
diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactoryTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactoryTest.java
index 51a59eb30df..c9da6c0e2c0 100644
--- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactoryTest.java
+++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactoryTest.java
@@ -44,7 +44,7 @@ class InternalMetaDataFactoryTest {
     @Test
     void assertCreateWithDatabaseName() {
         MetaDataPersistService persistService = mock(MetaDataPersistService.class, RETURNS_DEEP_STUBS);
-        when(persistService.getDatabaseMetaDataFacade().getSchema().load("foo_db")).thenReturn(Collections.emptyMap());
+        when(persistService.getDatabaseMetaDataFacade().getSchema().load("foo_db")).thenReturn(Collections.emptyList());
         ShardingSphereDatabase database = InternalMetaDataFactory.create(
                 "foo_db", persistService, mock(DatabaseConfiguration.class), new ConfigurationProperties(new Properties()), mock(ComputeNodeInstanceContext.class));
         assertThat(database.getName(), is("foo_db"));
@@ -67,7 +67,7 @@ class InternalMetaDataFactoryTest {
     @Test
     void assertCreateWithDatabasesWithStorageUnits() {
         MetaDataPersistService persistService = mock(MetaDataPersistService.class, RETURNS_DEEP_STUBS);
-        when(persistService.getDatabaseMetaDataFacade().getSchema().load("foo_db")).thenReturn(Collections.emptyMap());
+        when(persistService.getDatabaseMetaDataFacade().getSchema().load("foo_db")).thenReturn(Collections.emptyList());
         DatabaseConfiguration databaseConfig = mock(DatabaseConfiguration.class);
         StorageUnit storageUnit = mock(StorageUnit.class);
         when(storageUnit.getDataSource()).thenReturn(new MockedDataSource());
diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/schema/SchemaMetaDataPersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/schema/SchemaMetaDataPersistServiceTest.java
index 06767521251..472747bf2f5 100644
--- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/schema/SchemaMetaDataPersistServiceTest.java
+++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/metadata/schema/SchemaMetaDataPersistServiceTest.java
@@ -31,8 +31,8 @@ import org.mockito.Mock;
 import org.mockito.internal.configuration.plugins.Plugins;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.util.Collection;
 import java.util.Collections;
-import java.util.Map;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -110,10 +110,10 @@ class SchemaMetaDataPersistServiceTest {
         ShardingSphereView view = mock(ShardingSphereView.class);
         when(view.getName()).thenReturn("foo_view");
         when(viewMetaDataPersistService.load("foo_db", "foo_schema")).thenReturn(Collections.singleton(view));
-        Map<String, ShardingSphereSchema> actual = persistService.load("foo_db");
+        Collection<ShardingSphereSchema> actual = persistService.load("foo_db");
         assertThat(actual.size(), is(1));
-        assertThat(actual.get("foo_schema").getTable("foo_tbl"), is(table));
-        assertThat(actual.get("foo_schema").getView("foo_view"), is(view));
+        assertThat(actual.iterator().next().getTable("foo_tbl"), is(table));
+        assertThat(actual.iterator().next().getView("foo_view"), is(view));
     }
     
     @Test
diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
index 2e32f865d7a..7ff9a0d176a 100644
--- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
+++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
@@ -30,10 +30,11 @@ import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 
 import java.sql.SQLException;
+import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 /**
  * Storage unit manager.
@@ -110,20 +111,18 @@ public final class StorageUnitManager {
         MetaDataContexts reloadMetaDataContexts = MetaDataContextsFactory.createBySwitchResource(databaseName, true,
                 switchingResource, metaDataContexts.get(), metaDataPersistService, computeNodeInstanceContext);
         metaDataContexts.set(reloadMetaDataContexts);
-        metaDataContexts.get().getMetaData().getDatabases().putAll(buildShardingSphereDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName)));
+        metaDataContexts.get().getMetaData().getDatabases().putAll(buildDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName)));
         switchingResource.closeStaleDataSources();
     }
     
-    private Map<String, ShardingSphereDatabase> buildShardingSphereDatabase(final ShardingSphereDatabase originalDatabase) {
-        return Collections.singletonMap(originalDatabase.getName().toLowerCase(), new ShardingSphereDatabase(originalDatabase.getName(),
-                originalDatabase.getProtocolType(), originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(), buildSchemas(originalDatabase)));
+    private Map<String, ShardingSphereDatabase> buildDatabase(final ShardingSphereDatabase originalDatabase) {
+        return Collections.singletonMap(originalDatabase.getName().toLowerCase(), new ShardingSphereDatabase(
+                originalDatabase.getName(), originalDatabase.getProtocolType(), originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(), buildSchemas(originalDatabase)));
     }
     
-    private Map<String, ShardingSphereSchema> buildSchemas(final ShardingSphereDatabase originalDatabase) {
-        Map<String, ShardingSphereSchema> result = new LinkedHashMap<>(originalDatabase.getAllSchemas().size(), 1F);
-        originalDatabase.getAllSchemas().forEach(each -> result.put(each.getName().toLowerCase(),
-                new ShardingSphereSchema(each.getName(), each.getAllTables(), metaDataPersistService.getDatabaseMetaDataFacade().getView().load(originalDatabase.getName(), each.getName()))));
-        return result;
+    private Collection<ShardingSphereSchema> buildSchemas(final ShardingSphereDatabase originalDatabase) {
+        return originalDatabase.getAllSchemas().stream().map(each -> new ShardingSphereSchema(
+                each.getName(), each.getAllTables(), metaDataPersistService.getDatabaseMetaDataFacade().getView().load(originalDatabase.getName(), each.getName()))).collect(Collectors.toList());
     }
     
     @SneakyThrows(Exception.class)