This is an automated email from the ASF dual-hosted git repository.
menghaoranss 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 0a72b6f3b72 Add protocolType parameter to metadata loading methods
(#39291)
0a72b6f3b72 is described below
commit 0a72b6f3b72f6b08ede1eca6d21801206e40ebe3
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Aug 3 10:59:44 2026 +0800
Add protocolType parameter to metadata loading methods (#39291)
---
.../schema/builder/GenericSchemaBuilder.java | 7 +++---
.../database/schema/util/SchemaMetaDataUtils.java | 12 ++++++----
.../schema/util/SchemaMetaDataUtilsTest.java | 27 +++++++++++++++++-----
3 files changed, 33 insertions(+), 13 deletions(-)
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
index 2466ee0f009..842cc9dd239 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
@@ -71,7 +71,7 @@ public final class GenericSchemaBuilder {
* @throws SQLException SQL exception
*/
public static Map<String, ShardingSphereSchema> build(final
Collection<String> tableNames, final DatabaseType protocolType, final
GenericSchemaBuilderMaterial material) throws SQLException {
- Map<String, SchemaMetaData> result = loadSchemas(tableNames, material);
+ Map<String, SchemaMetaData> result = loadSchemas(tableNames,
protocolType, material);
if (!isSchemaCompatible(protocolType, material.getStorageUnits())) {
result = translate(result, protocolType, material);
}
@@ -86,8 +86,9 @@ public final class GenericSchemaBuilder {
return result;
}
- private static Map<String, SchemaMetaData> loadSchemas(final
Collection<String> tableNames, final GenericSchemaBuilderMaterial material)
throws SQLException {
- Collection<MetaDataLoaderMaterial> materials =
SchemaMetaDataUtils.getMetaDataLoaderMaterials(tableNames, material);
+ private static Map<String, SchemaMetaData> loadSchemas(final
Collection<String> tableNames, final DatabaseType protocolType,
+ final
GenericSchemaBuilderMaterial material) throws SQLException {
+ Collection<MetaDataLoaderMaterial> materials =
SchemaMetaDataUtils.getMetaDataLoaderMaterials(tableNames, protocolType,
material);
return materials.isEmpty() ? Collections.emptyMap() :
MetaDataLoader.load(materials);
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
index e23ed99629e..dfb1bc4b7e8 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
@@ -56,10 +56,12 @@ public final class SchemaMetaDataUtils {
* Get meta data loader materials.
*
* @param tableNames table name collection
+ * @param protocolType protocol type
* @param material material
* @return meta data loader materials
*/
- public static Collection<MetaDataLoaderMaterial>
getMetaDataLoaderMaterials(final Collection<String> tableNames, final
GenericSchemaBuilderMaterial material) {
+ public static Collection<MetaDataLoaderMaterial>
getMetaDataLoaderMaterials(final Collection<String> tableNames, final
DatabaseType protocolType,
+
final GenericSchemaBuilderMaterial material) {
Map<String, Collection<String>> dataSourceTableGroups = new
LinkedHashMap<>();
Collection<DatabaseType>
unsupportedThreeTierStorageStructureDatabaseTypes =
getUnsupportedThreeTierStorageStructureDatabaseTypes(material.getStorageUnits().values());
DataNodes dataNodes = new DataNodes(material.getRules());
@@ -77,17 +79,19 @@ public final class SchemaMetaDataUtils {
for (Entry<String, Collection<String>> entry :
dataSourceTableGroups.entrySet()) {
DatabaseType storageType =
material.getStorageUnits().get(entry.getKey()).getStorageType();
String defaultSchemaName = new
DatabaseTypeRegistry(storageType).getDefaultSchemaName(material.getDefaultSchemaName());
- result.addAll(buildMaterials(material, entry.getKey(),
entry.getValue(), storageType, defaultSchemaName, loadTableMetadataBatchSize));
+ result.addAll(buildMaterials(material, entry.getKey(),
entry.getValue(), protocolType, storageType, defaultSchemaName,
loadTableMetadataBatchSize));
}
return result;
}
private static Collection<MetaDataLoaderMaterial> buildMaterials(final
GenericSchemaBuilderMaterial material, final String dataSourceName, final
Collection<String> actualTableNames,
- final
DatabaseType storageType, final String defaultSchemaName, final int
loadTableMetadataBatchSize) {
+ final
DatabaseType protocolType, final DatabaseType storageType, final String
defaultSchemaName,
+ final int
loadTableMetadataBatchSize) {
Collection<MetaDataLoaderMaterial> result = new LinkedList<>();
DataSource dataSource = getDataSource(material, dataSourceName);
for (List<String> each : Lists.partition(new
ArrayList<>(actualTableNames), loadTableMetadataBatchSize)) {
- result.add(new MetaDataLoaderMaterial(normalize(each,
material.getIdentifierContext()), dataSourceName, dataSource, storageType,
defaultSchemaName));
+ Collection<String> tableNames = protocolType.equals(storageType) ?
each : normalize(each, material.getIdentifierContext());
+ result.add(new MetaDataLoaderMaterial(tableNames, dataSourceName,
dataSource, storageType, defaultSchemaName));
}
return result;
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
index 8f99c4848de..66f4096611f 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
@@ -72,6 +72,8 @@ class SchemaMetaDataUtilsTest {
private static final DatabaseType ORACLE_DATABASE_TYPE =
TypedSPILoader.getService(DatabaseType.class, "Oracle");
+ private static final DatabaseType POSTGRESQL_DATABASE_TYPE =
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
+
@AfterEach
void clearCachedDatabaseTables() {
GlobalDataSourceRegistry.getInstance().getCachedDatabaseTables().clear();
@@ -84,7 +86,7 @@ class SchemaMetaDataUtilsTest {
final List<List<String>>
expectedActualTableNames, final List<String> expectedDefaultSchemaNames) {
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(storageUnits,
Collections.singleton(mockDataNodeRule(dataNodes)), props, defaultSchemaName,
DatabaseIdentifierContextFactory.createDefault());
- List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
material));
+ List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
FIXTURE_DATABASE_TYPE, material));
assertThat(actual.size(), is(expectedStorageUnitNames.size()));
for (int i = 0; i < actual.size(); i++) {
assertThat(actual.get(i).getStorageUnitName(),
is(expectedStorageUnitNames.get(i)));
@@ -102,7 +104,7 @@ class SchemaMetaDataUtilsTest {
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(storageUnits,
Collections.singleton(mockDataNodeRule(Collections.singleton(new
DataNode("ds.foo_db", "foo_db", "foo_tbl")))),
createProperties(Boolean.FALSE, null), "foo_db",
DatabaseIdentifierContextFactory.createDefault());
- List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
material));
+ List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
MYSQL_DATABASE_TYPE, material));
assertThat(actual.size(), is(1));
assertThat(actual.get(0).getStorageUnitName(), is("ds.foo_db"));
assertThat(actual.get(0).getDataSource(), is(dataSource));
@@ -120,7 +122,7 @@ class SchemaMetaDataUtilsTest {
Collections.singleton(mockDataNodeRule(Collections.singleton(new
DataNode("ds.foo_db", "foo_db", "foo_tbl")))),
createProperties(Boolean.FALSE, null), "foo_db",
DatabaseIdentifierContextFactory.createDefault());
UnsupportedActualDataNodeStructureException actual =
assertThrows(UnsupportedActualDataNodeStructureException.class,
- () ->
SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
material));
+ () ->
SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
FIXTURE_DATABASE_TYPE, material));
assertThat(actual.getMessage(), is("Can not support 3-tier structure
for actual data node 'ds.foo_db.foo_tbl' with JDBC 'jdbc:mock'."));
}
@@ -131,7 +133,7 @@ class SchemaMetaDataUtilsTest {
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(storageUnits, Collections.singleton(
mockDataNodeRule(Arrays.asList(new DataNode("ds_0.foo_tbl_0"),
new DataNode("ds_0.foo_tbl_1"), new DataNode("ds_0.foo_tbl_2")))),
createProperties(Boolean.TRUE, 2), "foo_db",
DatabaseIdentifierContextFactory.createDefault());
- List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
material));
+ List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
FIXTURE_DATABASE_TYPE, material));
assertThat(actual.size(), is(2));
assertThat(actual.get(0).getStorageUnitName(), is("ds_0"));
assertThat(new ArrayList<>(actual.get(0).getActualTableNames()),
is(Arrays.asList("foo_tbl_0", "foo_tbl_1")));
@@ -147,7 +149,20 @@ class SchemaMetaDataUtilsTest {
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(storageUnits,
Collections.singleton(mockDataNodeRule(Collections.singleton(new
DataNode("ds_0.t_user")))), props, "foo_db",
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
new ResourceMetaData(Collections.emptyMap(), storageUnits), props));
- List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
material));
+ List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
MYSQL_DATABASE_TYPE, material));
+ assertThat(actual.size(), is(1));
+ assertThat(new ArrayList<>(actual.get(0).getActualTableNames()),
is(Collections.singletonList("T_USER")));
+ }
+
+ @Test
+ void
assertGetMetaDataLoaderMaterialsPreservesActualTableNamesForSameDatabaseType() {
+ Map<String, StorageUnit> storageUnits =
Collections.singletonMap("ds_0", mockStorageUnit(POSTGRESQL_DATABASE_TYPE,
mock(DataSource.class)));
+ ConfigurationProperties props = createProperties(Boolean.TRUE, null);
+ GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(storageUnits,
+
Collections.singleton(mockDataNodeRule(Collections.singleton(new
DataNode("ds_0.T_USER")))), props, "foo_db",
+
DatabaseIdentifierContextFactory.create(POSTGRESQL_DATABASE_TYPE, new
ResourceMetaData(Collections.emptyMap(), storageUnits), props));
+ List<MetaDataLoaderMaterial> actual = new ArrayList<>(
+
SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
POSTGRESQL_DATABASE_TYPE, material));
assertThat(actual.size(), is(1));
assertThat(new ArrayList<>(actual.get(0).getActualTableNames()),
is(Collections.singletonList("T_USER")));
}
@@ -161,7 +176,7 @@ class SchemaMetaDataUtilsTest {
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(storageUnits, Collections.singleton(
mockDataNodeRule(Arrays.asList(new
DataNode("ds_mysql.t_order"), new DataNode("ds_oracle.t_user")))), props,
"foo_db",
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
new ResourceMetaData(Collections.emptyMap(), storageUnits), props));
- List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
material));
+ List<MetaDataLoaderMaterial> actual = new
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
MYSQL_DATABASE_TYPE, material));
assertThat(actual.size(), is(2));
assertThat(actual.get(0).getStorageUnitName(), is("ds_mysql"));
assertThat(new ArrayList<>(actual.get(0).getActualTableNames()),
is(Collections.singletonList("t_order")));