This is an automated email from the ASF dual-hosted git repository. zhangliang 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 f18436543dd refactor(metadata): turn SchemaMetaDataLoader into a utility class (#35306) f18436543dd is described below commit f18436543dd86e399e2752e862c6b07b1de665a9 Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Thu May 1 13:27:02 2025 +0800 refactor(metadata): turn SchemaMetaDataLoader into a utility class (#35306) - Remove static methods and make SchemaMetaDataLoader a utility class - Update related test cases to use the new utility class - Modify OpenGaussMetaDataLoader and PostgreSQLMetaDataLoader to use the new utility class- Update SingleTableDataNodeLoader to use the new utility class --- .../data/loader/type/SchemaMetaDataLoader.java | 30 +++++++++++----------- .../data/loader/MySQLSchemaMetaDataLoaderTest.java | 7 +++-- .../data/loader/OpenGaussMetaDataLoader.java | 4 +-- .../loader/OpenGaussSchemaMetaDataLoaderTest.java | 9 ++++--- .../data/loader/PostgreSQLMetaDataLoader.java | 4 +-- .../loader/PostgreSQLSchemaMetaDataLoaderTest.java | 8 +++--- .../single/datanode/SingleTableDataNodeLoader.java | 2 +- 7 files changed, 34 insertions(+), 30 deletions(-) diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/type/SchemaMetaDataLoader.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/type/SchemaMetaDataLoader.java index 3eff99f9e7c..45c60069486 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/type/SchemaMetaDataLoader.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/type/SchemaMetaDataLoader.java @@ -19,10 +19,7 @@ package org.apache.shardingsphere.infra.database.core.metadata.data.loader.type; import com.cedarsoftware.util.CaseInsensitiveMap; import com.cedarsoftware.util.CaseInsensitiveSet; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; import org.apache.shardingsphere.infra.database.core.metadata.data.loader.MetaDataLoaderConnection; -import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.DialectDatabaseMetaData; import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.schema.DialectSchemaOption; import org.apache.shardingsphere.infra.database.core.metadata.database.system.SystemDatabase; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; @@ -40,7 +37,6 @@ import java.util.Map; /** * Schema meta data loader. */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class SchemaMetaDataLoader { private static final String TABLE_TYPE = "TABLE"; @@ -57,24 +53,30 @@ public final class SchemaMetaDataLoader { private static final String TABLE_SCHEME = "TABLE_SCHEM"; + private final DatabaseType databaseType; + + private final DialectSchemaOption schemaOption; + + public SchemaMetaDataLoader(final DatabaseType databaseType) { + this.databaseType = databaseType; + schemaOption = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSchemaOption(); + } + /** * Load schema table names. * * @param databaseName database name - * @param databaseType database type * @param dataSource data source * @param excludedTables excluded tables * @return loaded schema table names * @throws SQLException SQL exception */ - public static Map<String, Collection<String>> loadSchemaTableNames(final String databaseName, final DatabaseType databaseType, final DataSource dataSource, - final Collection<String> excludedTables) throws SQLException { + public Map<String, Collection<String>> loadSchemaTableNames(final String databaseName, final DataSource dataSource, final Collection<String> excludedTables) throws SQLException { try (MetaDataLoaderConnection connection = new MetaDataLoaderConnection(databaseType, dataSource.getConnection())) { - Collection<String> schemaNames = loadSchemaNames(connection, databaseType); - DialectDatabaseMetaData dialectDatabaseMetaData = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData(); + Collection<String> schemaNames = loadSchemaNames(connection); Map<String, Collection<String>> result = new CaseInsensitiveMap<>(schemaNames.size(), 1F); for (String each : schemaNames) { - String schemaName = dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().isPresent() ? each : databaseName; + String schemaName = schemaOption.getDefaultSchema().isPresent() ? each : databaseName; result.put(schemaName, loadTableNames(connection, each, excludedTables)); } return result; @@ -85,12 +87,10 @@ public final class SchemaMetaDataLoader { * Load schema names. * * @param connection connection - * @param databaseType database type * @return schema names collection * @throws SQLException SQL exception */ - public static Collection<String> loadSchemaNames(final Connection connection, final DatabaseType databaseType) throws SQLException { - DialectSchemaOption schemaOption = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSchemaOption(); + public Collection<String> loadSchemaNames(final Connection connection) throws SQLException { if (!schemaOption.getDefaultSchema().isPresent()) { return Collections.singletonList(connection.getSchema()); } @@ -107,7 +107,7 @@ public final class SchemaMetaDataLoader { return result.isEmpty() ? Collections.singletonList(connection.getSchema()) : result; } - private static Collection<String> loadTableNames(final Connection connection, final String schemaName, final Collection<String> excludedTables) throws SQLException { + private Collection<String> loadTableNames(final Connection connection, final String schemaName, final Collection<String> excludedTables) throws SQLException { Collection<String> result = new CaseInsensitiveSet<>(); try ( ResultSet resultSet = connection.getMetaData().getTables(connection.getCatalog(), schemaName, null, @@ -122,7 +122,7 @@ public final class SchemaMetaDataLoader { return result; } - private static boolean isSystemTable(final String table) { + private boolean isSystemTable(final String table) { return table.contains("$") || table.contains("/") || table.contains("##"); } } diff --git a/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLSchemaMetaDataLoaderTest.java b/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLSchemaMetaDataLoaderTest.java index 78b7735b9d1..46b635a7173 100644 --- a/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLSchemaMetaDataLoaderTest.java +++ b/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLSchemaMetaDataLoaderTest.java @@ -50,6 +50,9 @@ class MySQLSchemaMetaDataLoaderTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private DataSource dataSource; + private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "MySQL"); + + @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed") @BeforeEach void setUp() throws SQLException { ResultSet tableResultSet = mockTableResultSet(); @@ -78,11 +81,11 @@ class MySQLSchemaMetaDataLoaderTest { @Test void assertLoadSchemaTableNames() throws SQLException { Map<String, Collection<String>> schemaTableNames = Collections.singletonMap("foo_db", new CaseInsensitiveSet<>(Arrays.asList("tbl", "partitioned_tbl"))); - assertThat(SchemaMetaDataLoader.loadSchemaTableNames("foo_db", TypedSPILoader.getService(DatabaseType.class, "MySQL"), dataSource, Collections.emptyList()), is(schemaTableNames)); + assertThat(new SchemaMetaDataLoader(databaseType).loadSchemaTableNames("foo_db", dataSource, Collections.emptyList()), is(schemaTableNames)); } @Test void assertLoadSchemaNames() throws SQLException { - assertThat(SchemaMetaDataLoader.loadSchemaNames(dataSource.getConnection(), TypedSPILoader.getService(DatabaseType.class, "MySQL")), is(Collections.singletonList("public"))); + assertThat(new SchemaMetaDataLoader(databaseType).loadSchemaNames(dataSource.getConnection()), is(Collections.singletonList("public"))); } } diff --git a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoader.java b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoader.java index 855e01b92ba..7981c91c91d 100644 --- a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoader.java +++ b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoader.java @@ -27,8 +27,6 @@ import org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMe import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData; import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; import org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import java.sql.Connection; import java.sql.PreparedStatement; @@ -70,7 +68,7 @@ public final class OpenGaussMetaDataLoader implements DialectMetaDataLoader { @Override public Collection<SchemaMetaData> load(final MetaDataLoaderMaterial material) throws SQLException { try (Connection connection = material.getDataSource().getConnection()) { - Collection<String> schemaNames = SchemaMetaDataLoader.loadSchemaNames(connection, TypedSPILoader.getService(DatabaseType.class, "openGauss")); + Collection<String> schemaNames = new SchemaMetaDataLoader(getType()).loadSchemaNames(connection); Map<String, Multimap<String, IndexMetaData>> schemaIndexMetaDataMap = loadIndexMetaDataMap(connection, schemaNames); Map<String, Multimap<String, ColumnMetaData>> schemaColumnMetaDataMap = loadColumnMetaDataMap(connection, material.getActualTableNames(), schemaNames); Collection<SchemaMetaData> result = new LinkedList<>(); diff --git a/infra/database/type/opengauss/src/test/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussSchemaMetaDataLoaderTest.java b/infra/database/type/opengauss/src/test/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussSchemaMetaDataLoaderTest.java index b41212ec4fe..d07234275b6 100644 --- a/infra/database/type/opengauss/src/test/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussSchemaMetaDataLoaderTest.java +++ b/infra/database/type/opengauss/src/test/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussSchemaMetaDataLoaderTest.java @@ -51,6 +51,9 @@ class OpenGaussSchemaMetaDataLoaderTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private DataSource dataSource; + private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "openGauss"); + + @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed") @BeforeEach void setUp() throws SQLException { ResultSet tableResultSet = mockTableResultSet(); @@ -78,11 +81,11 @@ class OpenGaussSchemaMetaDataLoaderTest { @Test void assertLoadSchemaTableNames() throws SQLException { - assertThat(SchemaMetaDataLoader.loadSchemaTableNames("foo_db", TypedSPILoader.getService(DatabaseType.class, "openGauss"), dataSource, Collections.emptyList()), is(createSchemaTableNames())); + assertThat(new SchemaMetaDataLoader(databaseType).loadSchemaTableNames("foo_db", dataSource, Collections.emptyList()), is(createSchemaTableNames())); } private Map<String, Collection<String>> createSchemaTableNames() { - Map<String, Collection<String>> result = new LinkedHashMap<>(); + Map<String, Collection<String>> result = new LinkedHashMap<>(3, 1F); result.put("public", new CaseInsensitiveSet<>(Arrays.asList("tbl", "partitioned_tbl"))); result.put("schema_1", Collections.emptySet()); result.put("schema_2", Collections.emptySet()); @@ -91,6 +94,6 @@ class OpenGaussSchemaMetaDataLoaderTest { @Test void assertLoadSchemaNames() throws SQLException { - assertThat(SchemaMetaDataLoader.loadSchemaNames(dataSource.getConnection(), TypedSPILoader.getService(DatabaseType.class, "openGauss")), is(Arrays.asList("public", "schema_1", "schema_2"))); + assertThat(new SchemaMetaDataLoader(databaseType).loadSchemaNames(dataSource.getConnection()), is(Arrays.asList("public", "schema_1", "schema_2"))); } } diff --git a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java index ec151ec8c99..fe0607dd00d 100644 --- a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java +++ b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java @@ -29,8 +29,6 @@ import org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaM import org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData; import org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry; import org.apache.shardingsphere.infra.database.core.metadata.database.enums.TableType; -import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader; import java.sql.Connection; import java.sql.PreparedStatement; @@ -84,7 +82,7 @@ public final class PostgreSQLMetaDataLoader implements DialectMetaDataLoader { @Override public Collection<SchemaMetaData> load(final MetaDataLoaderMaterial material) throws SQLException { try (Connection connection = material.getDataSource().getConnection()) { - Collection<String> schemaNames = SchemaMetaDataLoader.loadSchemaNames(connection, TypedSPILoader.getService(DatabaseType.class, "PostgreSQL")); + Collection<String> schemaNames = new SchemaMetaDataLoader(getType()).loadSchemaNames(connection); Map<String, Multimap<String, IndexMetaData>> schemaIndexMetaDataMap = loadIndexMetaDataMap(connection, schemaNames); Map<String, Multimap<String, ColumnMetaData>> schemaColumnMetaDataMap = loadColumnMetaDataMap(connection, material.getActualTableNames(), schemaNames); Map<String, Multimap<String, ConstraintMetaData>> schemaConstraintMetaDataMap = loadConstraintMetaDataMap(connection, schemaNames); diff --git a/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLSchemaMetaDataLoaderTest.java b/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLSchemaMetaDataLoaderTest.java index 471f61647ac..98f49d46226 100644 --- a/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLSchemaMetaDataLoaderTest.java +++ b/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLSchemaMetaDataLoaderTest.java @@ -51,6 +51,9 @@ class PostgreSQLSchemaMetaDataLoaderTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private DataSource dataSource; + private final DatabaseType databaseType = TypedSPILoader.getService(DatabaseType.class, "PostgreSQL"); + + @SuppressWarnings("JDBCResourceOpenedButNotSafelyClosed") @BeforeEach void setUp() throws SQLException { ResultSet tableResultSet = mockTableResultSet(); @@ -78,8 +81,7 @@ class PostgreSQLSchemaMetaDataLoaderTest { @Test void assertLoadSchemaTableNames() throws SQLException { - assertThat(SchemaMetaDataLoader.loadSchemaTableNames("foo_db", - TypedSPILoader.getService(DatabaseType.class, "PostgreSQL"), dataSource, Collections.emptyList()), is(createSchemaTableNames())); + assertThat(new SchemaMetaDataLoader(databaseType).loadSchemaTableNames("foo_db", dataSource, Collections.emptyList()), is(createSchemaTableNames())); } private Map<String, Collection<String>> createSchemaTableNames() { @@ -92,6 +94,6 @@ class PostgreSQLSchemaMetaDataLoaderTest { @Test void assertLoadSchemaNames() throws SQLException { - assertThat(SchemaMetaDataLoader.loadSchemaNames(dataSource.getConnection(), TypedSPILoader.getService(DatabaseType.class, "PostgreSQL")), is(Arrays.asList("public", "schema_1", "schema_2"))); + assertThat(new SchemaMetaDataLoader(databaseType).loadSchemaNames(dataSource.getConnection()), is(Arrays.asList("public", "schema_1", "schema_2"))); } } diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/datanode/SingleTableDataNodeLoader.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/datanode/SingleTableDataNodeLoader.java index bc6c639ab0e..f0cc2e1d864 100644 --- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/datanode/SingleTableDataNodeLoader.java +++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/datanode/SingleTableDataNodeLoader.java @@ -182,7 +182,7 @@ public final class SingleTableDataNodeLoader { public static Map<String, Collection<String>> loadSchemaTableNames(final String databaseName, final DatabaseType storageType, final DataSource dataSource, final String dataSourceName, final Collection<String> excludedTables) { try { - return SchemaMetaDataLoader.loadSchemaTableNames(databaseName, storageType, dataSource, excludedTables); + return new SchemaMetaDataLoader(storageType).loadSchemaTableNames(databaseName, dataSource, excludedTables); } catch (final SQLException ex) { throw new SingleTablesLoadingException(databaseName, dataSourceName, ex); }