You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2026/03/19 01:36:38 UTC

(shardingsphere) branch master updated: Use IdentifierIndex to search metadata for database schema and table (#38499)

This is an automated email from the ASF dual-hosted git repository.

menghaoran 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 a5cbe902865 Use IdentifierIndex to search metadata for database schema and table (#38499)
a5cbe902865 is described below

commit a5cbe902865a3da7696bd7fed4534706b377758d
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Thu Mar 19 09:36:30 2026 +0800

    Use IdentifierIndex to search metadata for database schema and table (#38499)
---
 .../metadata/database/ShardingSphereDatabase.java  | 35 ++++++------
 .../schema/model/ShardingSphereSchema.java         | 65 ++++++++++------------
 .../database/schema/model/ShardingSphereTable.java | 44 ++++-----------
 .../database/ShardingSphereDatabaseTest.java       | 13 +----
 .../manager/resource/StorageUnitManagerTest.java   | 10 +++-
 5 files changed, 69 insertions(+), 98 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 4dbe6318226..3199e7d249d 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
@@ -46,7 +46,6 @@ import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 /**
@@ -63,9 +62,6 @@ public final class ShardingSphereDatabase {
     
     private final RuleMetaData ruleMetaData;
     
-    @Getter(AccessLevel.NONE)
-    private final Map<String, ShardingSphereSchema> schemas;
-    
     @Getter(AccessLevel.NONE)
     private final DatabaseIdentifierContext identifierContext;
     
@@ -114,9 +110,9 @@ public final class ShardingSphereDatabase {
         this.ruleMetaData = ruleMetaData;
         this.identifierContext = identifierContext;
         schemaIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.SCHEMA);
-        this.schemas = new ConcurrentHashMap<>(schemas.stream().collect(Collectors.toMap(ShardingSphereSchema::getName, each -> each)));
-        this.schemas.values().forEach(this::attachSchemaIdentifierContext);
-        rebuildSchemaIndex();
+        Map<String, ShardingSphereSchema> schemaMap = createSchemaMap(schemas);
+        schemaMap.values().forEach(this::attachSchemaIdentifierContext);
+        schemaIndex.rebuild(schemaMap);
     }
     
     /**
@@ -125,7 +121,7 @@ public final class ShardingSphereDatabase {
      * @return all schemas
      */
     public Collection<ShardingSphereSchema> getAllSchemas() {
-        return schemas.values();
+        return schemaIndex.getAll();
     }
     
     /**
@@ -185,8 +181,7 @@ public final class ShardingSphereDatabase {
      */
     public void addSchema(final ShardingSphereSchema schema) {
         attachSchemaIdentifierContext(schema);
-        schemas.put(schema.getName(), schema);
-        rebuildSchemaIndex();
+        schemaIndex.put(schema.getName(), schema);
     }
     
     /**
@@ -199,8 +194,7 @@ public final class ShardingSphereDatabase {
         if (null == schema) {
             return;
         }
-        schemas.remove(schema.getName());
-        rebuildSchemaIndex();
+        schemaIndex.remove(schema.getName());
     }
     
     /**
@@ -259,8 +253,12 @@ public final class ShardingSphereDatabase {
      */
     public synchronized void refreshIdentifierContext(final ConfigurationProperties props) {
         DatabaseIdentifierContextFactory.refresh(identifierContext, protocolType, resourceMetaData, props);
-        schemas.values().forEach(this::attachSchemaIdentifierContext);
-        rebuildSchemaIndex();
+        Map<String, ShardingSphereSchema> schemaMap = new LinkedHashMap<>(schemaIndex.size(), 1F);
+        schemaIndex.getAll().forEach(each -> {
+            attachSchemaIdentifierContext(each);
+            schemaMap.put(each.getName(), each);
+        });
+        schemaIndex.rebuild(schemaMap);
     }
     
     /**
@@ -280,11 +278,12 @@ public final class ShardingSphereDatabase {
         return decorator.get().decorate(name, dataSources, ruleMetaData.getRules(), ruleConfig);
     }
     
-    private void rebuildSchemaIndex() {
-        schemaIndex.rebuild(new LinkedHashMap<>(schemas));
-    }
-    
     private void attachSchemaIdentifierContext(final ShardingSphereSchema schema) {
         schema.attachIdentifierContext(identifierContext);
     }
+    
+    private Map<String, ShardingSphereSchema> createSchemaMap(final Collection<ShardingSphereSchema> schemas) {
+        return schemas.stream().collect(Collectors.toMap(ShardingSphereSchema::getName, each -> each, (oldValue, currentValue) -> currentValue,
+                () -> new LinkedHashMap<>(schemas.size(), 1F)));
+    }
 }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
index a2e80c17edb..702f5c0df0a 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchema.java
@@ -30,10 +30,11 @@ import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.Iden
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
  * ShardingSphere schema.
@@ -46,12 +47,6 @@ public final class ShardingSphereSchema {
     @Getter
     private final DatabaseType protocolType;
     
-    @Getter(AccessLevel.NONE)
-    private final Map<String, ShardingSphereTable> tables = new ConcurrentHashMap<>();
-    
-    @Getter(AccessLevel.NONE)
-    private final Map<String, ShardingSphereView> views = new ConcurrentHashMap<>();
-    
     @Getter(AccessLevel.NONE)
     private DatabaseIdentifierContext identifierContext;
     
@@ -75,7 +70,8 @@ public final class ShardingSphereSchema {
         identifierContext = DatabaseIdentifierContextFactory.createDefault();
         tableIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.TABLE);
         viewIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.VIEW);
-        rebuildIdentifierIndexes();
+        tableIndex.rebuild(Collections.emptyMap());
+        viewIndex.rebuild(Collections.emptyMap());
     }
     
     /**
@@ -90,10 +86,11 @@ public final class ShardingSphereSchema {
      */
     public ShardingSphereSchema(final String name, final DatabaseType protocolType, final Collection<ShardingSphereTable> tables, final Collection<ShardingSphereView> views) {
         this(name, protocolType);
-        tables.forEach(each -> this.tables.put(each.getName(), each));
-        views.forEach(each -> this.views.put(each.getName(), each));
-        this.tables.values().forEach(this::attachTableIdentifierContext);
-        rebuildIdentifierIndexes();
+        Map<String, ShardingSphereTable> tableMap = createTableMap(tables);
+        Map<String, ShardingSphereView> viewMap = createViewMap(views);
+        tableMap.values().forEach(this::attachTableIdentifierContext);
+        tableIndex.rebuild(tableMap);
+        viewIndex.rebuild(viewMap);
     }
     
     /**
@@ -102,7 +99,7 @@ public final class ShardingSphereSchema {
      * @return all tables
      */
     public Collection<ShardingSphereTable> getAllTables() {
-        return tables.values();
+        return tableIndex.getAll();
     }
     
     /**
@@ -162,8 +159,7 @@ public final class ShardingSphereSchema {
      */
     public void putTable(final ShardingSphereTable table) {
         attachTableIdentifierContext(table);
-        tables.put(table.getName(), table);
-        rebuildTableIndex();
+        tableIndex.put(table.getName(), table);
     }
     
     /**
@@ -176,8 +172,7 @@ public final class ShardingSphereSchema {
         if (null == table) {
             return;
         }
-        tables.remove(table.getName());
-        rebuildTableIndex();
+        tableIndex.remove(table.getName());
     }
     
     /**
@@ -186,7 +181,7 @@ public final class ShardingSphereSchema {
      * @return all views
      */
     public Collection<ShardingSphereView> getAllViews() {
-        return views.values();
+        return viewIndex.getAll();
     }
     
     /**
@@ -245,8 +240,7 @@ public final class ShardingSphereSchema {
      * @param view view
      */
     public void putView(final ShardingSphereView view) {
-        views.put(view.getName(), view);
-        rebuildViewIndex();
+        viewIndex.put(view.getName(), view);
     }
     
     /**
@@ -259,8 +253,7 @@ public final class ShardingSphereSchema {
         if (null == view) {
             return;
         }
-        views.remove(view.getName());
-        rebuildViewIndex();
+        viewIndex.remove(view.getName());
     }
     
     /**
@@ -269,11 +262,14 @@ public final class ShardingSphereSchema {
      * @param identifierContext database identifier context
      */
     public void attachIdentifierContext(final DatabaseIdentifierContext identifierContext) {
+        final Collection<ShardingSphereTable> tables = new LinkedList<>(tableIndex.getAll());
+        final Collection<ShardingSphereView> views = new LinkedList<>(viewIndex.getAll());
         this.identifierContext = identifierContext;
         tableIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.TABLE);
         viewIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.VIEW);
-        tables.values().forEach(this::attachTableIdentifierContext);
-        rebuildIdentifierIndexes();
+        tables.forEach(this::attachTableIdentifierContext);
+        tableIndex.rebuild(createTableMap(tables));
+        viewIndex.rebuild(createViewMap(views));
     }
     
     /**
@@ -313,23 +309,20 @@ public final class ShardingSphereSchema {
      * @return empty schema or not
      */
     public boolean isEmpty() {
-        return tables.isEmpty() && views.isEmpty();
-    }
-    
-    private void rebuildIdentifierIndexes() {
-        rebuildTableIndex();
-        rebuildViewIndex();
+        return tableIndex.isEmpty() && viewIndex.isEmpty();
     }
     
-    private void rebuildTableIndex() {
-        tableIndex.rebuild(new LinkedHashMap<>(tables));
+    private void attachTableIdentifierContext(final ShardingSphereTable table) {
+        table.attachIdentifierContext(identifierContext);
     }
     
-    private void rebuildViewIndex() {
-        viewIndex.rebuild(new LinkedHashMap<>(views));
+    private Map<String, ShardingSphereTable> createTableMap(final Collection<ShardingSphereTable> tables) {
+        return tables.stream().collect(Collectors.toMap(ShardingSphereTable::getName, each -> each, (oldValue, currentValue) -> currentValue,
+                () -> new LinkedHashMap<>(tables.size(), 1F)));
     }
     
-    private void attachTableIdentifierContext(final ShardingSphereTable table) {
-        table.attachIdentifierContext(identifierContext);
+    private Map<String, ShardingSphereView> createViewMap(final Collection<ShardingSphereView> views) {
+        return views.stream().collect(Collectors.toMap(ShardingSphereView::getName, each -> each, (oldValue, currentValue) -> currentValue,
+                () -> new LinkedHashMap<>(views.size(), 1F)));
     }
 }
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereTable.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereTable.java
index d159939e7cc..d5b2d39a611 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereTable.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereTable.java
@@ -35,6 +35,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -60,12 +61,6 @@ public final class ShardingSphereTable {
     
     private final Map<String, Integer> visibleColumnAndIndexMap = new CaseInsensitiveMap<>();
     
-    @Getter(AccessLevel.NONE)
-    private final Map<String, ShardingSphereIndex> indexes;
-    
-    @Getter(AccessLevel.NONE)
-    private final Map<String, ShardingSphereConstraint> constraints;
-    
     @Getter(AccessLevel.NONE)
     private DatabaseIdentifierContext identifierContext;
     
@@ -114,10 +109,10 @@ public final class ShardingSphereTable {
         indexIdentifierIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.INDEX);
         constraintIdentifierIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.CONSTRAINT);
         this.columns = createColumns(columns);
-        this.indexes = createIndexes(indexes);
-        this.constraints = createConstraints(constraints);
         this.type = type;
-        rebuildIdentifierIndexes();
+        columnIndex.rebuild(new LinkedHashMap<>(this.columns));
+        indexIdentifierIndex.rebuild(createIndexes(indexes));
+        constraintIdentifierIndex.rebuild(createConstraints(constraints));
     }
     
     private Map<String, ShardingSphereColumn> createColumns(final Collection<ShardingSphereColumn> columns) {
@@ -346,7 +341,7 @@ public final class ShardingSphereTable {
      * @return indexes
      */
     public Collection<ShardingSphereIndex> getAllIndexes() {
-        return indexes.values();
+        return indexIdentifierIndex.getAll();
     }
     
     /**
@@ -355,8 +350,7 @@ public final class ShardingSphereTable {
      * @param index index
      */
     public void putIndex(final ShardingSphereIndex index) {
-        indexes.put(index.getName(), index);
-        rebuildIndexIdentifierIndex();
+        indexIdentifierIndex.put(index.getName(), index);
     }
     
     /**
@@ -372,8 +366,7 @@ public final class ShardingSphereTable {
         if (null == index) {
             return;
         }
-        indexes.remove(index.getName());
-        rebuildIndexIdentifierIndex();
+        indexIdentifierIndex.remove(index.getName());
     }
     
     /**
@@ -382,7 +375,7 @@ public final class ShardingSphereTable {
      * @return constraint
      */
     public Collection<ShardingSphereConstraint> getAllConstraints() {
-        return constraints.values();
+        return constraintIdentifierIndex.getAll();
     }
     
     /**
@@ -391,28 +384,15 @@ public final class ShardingSphereTable {
      * @param identifierContext database identifier context
      */
     public void attachIdentifierContext(final DatabaseIdentifierContext identifierContext) {
+        final Collection<ShardingSphereIndex> indexes = new LinkedList<>(indexIdentifierIndex.getAll());
+        final Collection<ShardingSphereConstraint> constraints = new LinkedList<>(constraintIdentifierIndex.getAll());
         this.identifierContext = identifierContext;
         columnIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.COLUMN);
         indexIdentifierIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.INDEX);
         constraintIdentifierIndex = new IdentifierIndex<>(identifierContext, IdentifierScope.CONSTRAINT);
-        rebuildIdentifierIndexes();
-    }
-    
-    private void rebuildIdentifierIndexes() {
-        rebuildColumnIndex();
-        rebuildIndexIdentifierIndex();
-        rebuildConstraintIdentifierIndex();
-    }
-    
-    private void rebuildColumnIndex() {
         columnIndex.rebuild(new LinkedHashMap<>(columns));
+        indexIdentifierIndex.rebuild(createIndexes(indexes));
+        constraintIdentifierIndex.rebuild(createConstraints(constraints));
     }
     
-    private void rebuildIndexIdentifierIndex() {
-        indexIdentifierIndex.rebuild(new LinkedHashMap<>(indexes));
-    }
-    
-    private void rebuildConstraintIdentifierIndex() {
-        constraintIdentifierIndex.rebuild(new LinkedHashMap<>(constraints));
-    }
 }
diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
index a8436c3136b..01ed01fb072 100644
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
+++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
@@ -112,15 +112,8 @@ class ShardingSphereDatabaseTest {
         ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", databaseType, mock(ResourceMetaData.class), new RuleMetaData(Collections.emptyList()), Collections.emptyList());
         ShardingSphereSchema schema = new ShardingSphereSchema("new_schema", databaseType);
         database.addSchema(schema);
-        Map<String, ShardingSphereSchema> actualSchemas = getSchemas(database);
-        assertThat(actualSchemas.size(), is(1));
-        assertThat(actualSchemas.get("new_schema"), is(schema));
-    }
-    
-    @SneakyThrows(ReflectiveOperationException.class)
-    @SuppressWarnings("unchecked")
-    private Map<String, ShardingSphereSchema> getSchemas(final ShardingSphereDatabase database) {
-        return (Map<String, ShardingSphereSchema>) Plugins.getMemberAccessor().get(ShardingSphereDatabase.class.getDeclaredField("schemas"), database);
+        assertThat(database.getAllSchemas().size(), is(1));
+        assertThat(database.getSchema("new_schema"), is(schema));
     }
     
     @ParameterizedTest(name = "{0}")
@@ -129,7 +122,7 @@ class ShardingSphereDatabaseTest {
         ShardingSphereDatabase database = new ShardingSphereDatabase(
                 "foo_db", databaseType, mock(ResourceMetaData.class), new RuleMetaData(Collections.emptyList()), Collections.singleton(new ShardingSphereSchema("foo_schema", databaseType)));
         database.dropSchema(schemaName);
-        assertThat(getSchemas(database).containsKey("foo_schema"), is(expectedSchemaRetained));
+        assertThat(database.containsSchema("foo_schema"), is(expectedSchemaRetained));
     }
     
     @ParameterizedTest(name = "{0}")
diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
index 186d8a0524b..115cd9839bb 100644
--- a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
+++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
@@ -29,6 +29,8 @@ import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistFacade;
+import org.apache.shardingsphere.mode.metadata.persist.metadata.DatabaseMetaDataPersistFacade;
+import org.apache.shardingsphere.mode.metadata.persist.metadata.service.ViewMetaDataPersistService;
 import org.apache.shardingsphere.test.infra.framework.extension.mock.AutoMockExtension;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -167,8 +169,12 @@ class StorageUnitManagerTest {
     }
     
     private StorageUnitManager createManager(final MetaDataContexts metaDataContexts, final ResourceSwitchManager resourceSwitchManager) {
-        MetaDataPersistFacade metaDataPersistFacade = mock(MetaDataPersistFacade.class, RETURNS_DEEP_STUBS);
-        lenient().when(metaDataPersistFacade.getDatabaseMetaDataFacade().getView().load(anyString(), anyString())).thenReturn(Collections.emptyList());
+        MetaDataPersistFacade metaDataPersistFacade = mock(MetaDataPersistFacade.class);
+        DatabaseMetaDataPersistFacade databaseMetaDataPersistFacade = mock(DatabaseMetaDataPersistFacade.class);
+        ViewMetaDataPersistService viewMetaDataPersistService = mock(ViewMetaDataPersistService.class);
+        lenient().when(metaDataPersistFacade.getDatabaseMetaDataFacade()).thenReturn(databaseMetaDataPersistFacade);
+        lenient().when(databaseMetaDataPersistFacade.getView()).thenReturn(viewMetaDataPersistService);
+        lenient().when(viewMetaDataPersistService.load(anyString(), anyString())).thenReturn(Collections.emptyList());
         return new StorageUnitManager(metaDataContexts, mock(ComputeNodeInstanceContext.class), resourceSwitchManager, metaDataPersistFacade);
     }