This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 303c378e032 Fix dialect statistics appender resolution (#39322)
303c378e032 is described below
commit 303c378e032c25157c01aeb84ef89941d2002d7b
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Aug 3 20:46:09 2026 +0800
Fix dialect statistics appender resolution (#39322)
---
infra/common/pom.xml | 6 ++
.../builder/ShardingSphereStatisticsFactory.java | 14 +----
.../dialect/OpenGaussStatisticsAppender.java | 40 +++++++++++++
...ta.statistics.builder.DialectStatisticsAppender | 1 +
.../ShardingSphereStatisticsFactoryTest.java | 32 ++++++++--
.../dialect/OpenGaussStatisticsAppenderTest.java | 69 ++++++++++++++++++++++
6 files changed, 144 insertions(+), 18 deletions(-)
diff --git a/infra/common/pom.xml b/infra/common/pom.xml
index 76f6c30efbb..d2bef8e0a00 100644
--- a/infra/common/pom.xml
+++ b/infra/common/pom.xml
@@ -91,6 +91,12 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.shardingsphere</groupId>
+
<artifactId>shardingsphere-database-connector-sqlserver</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>com.alibaba</groupId>
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
index 6c7a8815170..9737524668c 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
@@ -20,17 +20,13 @@ package
org.apache.shardingsphere.infra.metadata.statistics.builder;
import com.cedarsoftware.util.CaseInsensitiveSet;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics;
import org.apache.shardingsphere.infra.metadata.statistics.SchemaStatistics;
import
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
import org.apache.shardingsphere.infra.metadata.statistics.TableStatistics;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import java.util.Collection;
import java.util.Map.Entry;
@@ -55,7 +51,8 @@ public final class ShardingSphereStatisticsFactory {
if (metaData.getAllDatabases().isEmpty()) {
return result;
}
- Optional<DialectStatisticsAppender> dialectStatisticsAppender =
DatabaseTypedSPILoader.findService(DialectStatisticsAppender.class,
getDatabaseType(metaData));
+ Optional<DialectStatisticsAppender> dialectStatisticsAppender =
DatabaseTypedSPILoader.findService(
+ DialectStatisticsAppender.class,
metaData.getAllDatabases().iterator().next().getProtocolType());
Collection<ShardingSphereDatabase> unloadedDatabases =
metaData.getAllDatabases().stream()
.filter(each ->
!loadedStatistics.containsDatabaseStatistics(each.getName())).collect(Collectors.toList());
for (ShardingSphereDatabase each : unloadedDatabases) {
@@ -70,13 +67,6 @@ public final class ShardingSphereStatisticsFactory {
return result;
}
- private static DatabaseType getDatabaseType(final ShardingSphereMetaData
metaData) {
- DatabaseType protocolType =
metaData.getAllDatabases().iterator().next().getProtocolType();
- DialectDatabaseMetaData dialectDatabaseMetaData = new
DatabaseTypeRegistry(protocolType).getDialectDatabaseMetaData();
- // TODO can `protocolType instanceof SchemaSupportedDatabaseType ?
"PostgreSQL" : protocolType.getType()` replace to trunk database type?
- return
dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().isPresent() ?
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL") : protocolType;
- }
-
private static void fillDefaultStatistics(final ShardingSphereMetaData
metaData, final ShardingSphereStatistics statistics) {
for (ShardingSphereDatabase database : metaData.getAllDatabases()) {
DatabaseStatistics defaultDatabaseStatistics = new
ShardingSphereDefaultStatisticsBuilder().build(database);
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppender.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppender.java
new file mode 100644
index 00000000000..6782a7c02a7
--- /dev/null
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppender.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.metadata.statistics.builder.dialect;
+
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics;
+import
org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender;
+
+/**
+ * Statistics appender for openGauss.
+ */
+public final class OpenGaussStatisticsAppender implements
DialectStatisticsAppender {
+
+ private final PostgreSQLStatisticsAppender delegate = new
PostgreSQLStatisticsAppender();
+
+ @Override
+ public void append(final DatabaseStatistics databaseStatistics, final
ShardingSphereDatabase database) {
+ delegate.append(databaseStatistics, database);
+ }
+
+ @Override
+ public String getDatabaseType() {
+ return "openGauss";
+ }
+}
diff --git
a/infra/common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender
b/infra/common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender
index 54f21e3a806..8e6ad825b86 100644
---
a/infra/common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender
+++
b/infra/common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender
@@ -16,3 +16,4 @@
#
org.apache.shardingsphere.infra.metadata.statistics.builder.dialect.PostgreSQLStatisticsAppender
+org.apache.shardingsphere.infra.metadata.statistics.builder.dialect.OpenGaussStatisticsAppender
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactoryTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactoryTest.java
index 5b95a137e46..274abbdfcaf 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactoryTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactoryTest.java
@@ -37,6 +37,7 @@ import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -46,8 +47,12 @@ class ShardingSphereStatisticsFactoryTest {
private final DatabaseType postgreSQLDatabaseType =
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
+ private final DatabaseType openGaussDatabaseType =
TypedSPILoader.getService(DatabaseType.class, "openGauss");
+
private final DatabaseType h2DatabaseType =
TypedSPILoader.getService(DatabaseType.class, "H2");
+ private final DatabaseType sqlServerDatabaseType =
TypedSPILoader.getService(DatabaseType.class, "SQLServer");
+
@Mock
private ShardingSphereMetaData metaData;
@@ -62,7 +67,16 @@ class ShardingSphereStatisticsFactoryTest {
@Test
void assertCreateWithPostgreSQLDatabaseAndDialectAppender() {
- ShardingSphereDatabase database =
mockPostgreSQLDatabaseWithPgCatalogSchema();
+ ShardingSphereDatabase database =
mockDatabaseWithPgCatalogSchema(postgreSQLDatabaseType);
+
when(metaData.getAllDatabases()).thenReturn(Collections.singleton(database));
+ ShardingSphereStatistics actual =
ShardingSphereStatisticsFactory.create(metaData, statistics);
+ assertThat(actual.getDatabaseStatisticsMap().size(), is(1));
+ assertTrue(actual.getDatabaseStatisticsMap().containsKey("foo_db"));
+ }
+
+ @Test
+ void assertCreateWithOpenGaussDatabaseAndDialectAppender() {
+ ShardingSphereDatabase database =
mockDatabaseWithPgCatalogSchema(openGaussDatabaseType);
when(metaData.getAllDatabases()).thenReturn(Collections.singleton(database));
ShardingSphereStatistics actual =
ShardingSphereStatisticsFactory.create(metaData, statistics);
assertThat(actual.getDatabaseStatisticsMap().size(), is(1));
@@ -79,12 +93,19 @@ class ShardingSphereStatisticsFactoryTest {
}
@Test
- void assertCreateWithH2DatabaseNoDefaultSchema() {
+ void assertCreateWithH2DatabaseNoDialectAppender() {
ShardingSphereDatabase database = mockH2Database();
when(metaData.getAllDatabases()).thenReturn(Collections.singleton(database));
assertTrue(ShardingSphereStatisticsFactory.create(metaData,
statistics).getDatabaseStatisticsMap().isEmpty());
}
+ @Test
+ void assertCreateWithSQLServerDatabaseNoDialectAppender() {
+ ShardingSphereDatabase database =
mockDatabaseWithPgCatalogSchema(sqlServerDatabaseType);
+
when(metaData.getAllDatabases()).thenReturn(Collections.singleton(database));
+ assertTrue(ShardingSphereStatisticsFactory.create(metaData,
statistics).getDatabaseStatisticsMap().isEmpty());
+ }
+
@Test
void assertCreateWithStatisticsMerging() {
ShardingSphereDatabase database =
mockPostgreSQLDatabaseWithShardingSphereSchema();
@@ -137,14 +158,13 @@ class ShardingSphereStatisticsFactoryTest {
assertThat(actualSchemaStatistics.getTableStatisticsMap().size(),
is(1));
}
- private ShardingSphereDatabase mockPostgreSQLDatabaseWithPgCatalogSchema()
{
+ private ShardingSphereDatabase mockDatabaseWithPgCatalogSchema(final
DatabaseType protocolType) {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
when(result.getName()).thenReturn("foo_db");
- when(result.getProtocolType()).thenReturn(postgreSQLDatabaseType);
+ when(result.getProtocolType()).thenReturn(protocolType);
ShardingSphereSchema schema = new ShardingSphereSchema("pg_catalog",
mock(DatabaseType.class));
when(result.getAllSchemas()).thenReturn(Collections.singleton(schema));
- when(result.containsSchema("pg_catalog")).thenReturn(true);
- when(result.getSchema("pg_catalog")).thenReturn(schema);
+ when(result.containsSchema(anyString())).thenAnswer(invocation ->
"pg_catalog".equals(invocation.getArgument(0)));
return result;
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppenderTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppenderTest.java
new file mode 100644
index 00000000000..0b397ade4ff
--- /dev/null
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/statistics/builder/dialect/OpenGaussStatisticsAppenderTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.infra.metadata.statistics.builder.dialect;
+
+import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.statistics.DatabaseStatistics;
+import
org.apache.shardingsphere.infra.metadata.statistics.builder.DialectStatisticsAppender;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.internal.configuration.plugins.Plugins;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.mockito.Mockito.verify;
+
+@ExtendWith(MockitoExtension.class)
+class OpenGaussStatisticsAppenderTest {
+
+ private final DialectStatisticsAppender appender =
DatabaseTypedSPILoader.getService(
+ DialectStatisticsAppender.class,
TypedSPILoader.getService(DatabaseType.class, "openGauss"));
+
+ @Mock
+ private PostgreSQLStatisticsAppender delegate;
+
+ private PostgreSQLStatisticsAppender originalDelegate;
+
+ @Mock
+ private DatabaseStatistics databaseStatistics;
+
+ @Mock
+ private ShardingSphereDatabase database;
+
+ @BeforeEach
+ void setUp() throws NoSuchFieldException, IllegalAccessException {
+ originalDelegate = (PostgreSQLStatisticsAppender)
Plugins.getMemberAccessor().get(OpenGaussStatisticsAppender.class.getDeclaredField("delegate"),
appender);
+
Plugins.getMemberAccessor().set(OpenGaussStatisticsAppender.class.getDeclaredField("delegate"),
appender, delegate);
+ }
+
+ @AfterEach
+ void tearDown() throws NoSuchFieldException, IllegalAccessException {
+
Plugins.getMemberAccessor().set(OpenGaussStatisticsAppender.class.getDeclaredField("delegate"),
appender, originalDelegate);
+ }
+
+ @Test
+ void assertAppend() {
+ appender.append(databaseStatistics, database);
+ verify(delegate).append(databaseStatistics, database);
+ }
+}