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);
}