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 e91e2d78835 Refactor OpenGaussSystemTableQueryExecutorFactory (#36892)
e91e2d78835 is described below
commit e91e2d788359013075eb5c8ec45f285b7f25204f
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Oct 17 22:45:12 2025 +0800
Refactor OpenGaussSystemTableQueryExecutorFactory (#36892)
* Refactor OpenGaussSystemTableQueryExecutorFactory
* Refactor OpenGaussSystemTableQueryExecutorFactory
---
.../admin/OpenGaussAdminExecutorCreator.java | 6 +-
.../OpenGaussSystemTableQueryExecutorFactory.java | 87 +++++++++-------------
.../admin/OpenGaussAdminExecutorCreatorTest.java | 4 +
...enGaussSystemTableQueryExecutorFactoryTest.java | 8 +-
4 files changed, 46 insertions(+), 59 deletions(-)
diff --git
a/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreator.java
b/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreator.java
index 886ff2a23ae..b3ae0b4fccc 100644
---
a/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreator.java
+++
b/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreator.java
@@ -40,9 +40,9 @@ public final class OpenGaussAdminExecutorCreator implements
DatabaseAdminExecuto
@Override
public Optional<DatabaseAdminExecutor> create(final SQLStatementContext
sqlStatementContext, final String sql, final String databaseName, final
List<Object> parameters) {
if (sqlStatementContext instanceof SelectStatementContext) {
- OpenGaussSystemTableQueryExecutorFactory
systemTableQueryExecutorCreator = new
OpenGaussSystemTableQueryExecutorFactory((SelectStatementContext)
sqlStatementContext, sql, parameters);
- if (systemTableQueryExecutorCreator.accept()) {
- return systemTableQueryExecutorCreator.newInstance();
+ Optional<DatabaseAdminExecutor> systemTableQueryExecutor =
OpenGaussSystemTableQueryExecutorFactory.newInstance((SelectStatementContext)
sqlStatementContext, sql, parameters);
+ if (systemTableQueryExecutor.isPresent()) {
+ return systemTableQueryExecutor;
}
OpenGaussSystemFunctionQueryExecutorFactory
functionQueryExecutorCreator = new
OpenGaussSystemFunctionQueryExecutorFactory((SelectStatementContext)
sqlStatementContext);
if (functionQueryExecutorCreator.accept()) {
diff --git
a/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/factory/OpenGaussSystemTableQueryExecutorFactory.java
b/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/factory/OpenGaussSystemTableQueryExecutorFactory.java
index d1cd16ac6ad..248e3c78f39 100644
---
a/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/factory/OpenGaussSystemTableQueryExecutorFactory.java
+++
b/proxy/backend/dialect/opengauss/src/main/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/factory/OpenGaussSystemTableQueryExecutorFactory.java
@@ -19,7 +19,8 @@ package
org.apache.shardingsphere.proxy.backend.opengauss.handler.admin.factory;
import com.cedarsoftware.util.CaseInsensitiveMap;
import com.cedarsoftware.util.CaseInsensitiveSet;
-import lombok.RequiredArgsConstructor;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.Projection;
@@ -48,29 +49,27 @@ import java.util.Optional;
/**
* System table query executor factory for openGauss.
*/
-@RequiredArgsConstructor
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class OpenGaussSystemTableQueryExecutorFactory {
+ private static final DatabaseType DATABASE_TYPE =
TypedSPILoader.getService(DatabaseType.class, "openGauss");
+
private static final Map<String, Collection<String>> SCHEMA_TABLES = new
CaseInsensitiveMap<>();
static {
SCHEMA_TABLES.put("shardingsphere", new
CaseInsensitiveSet<>(Collections.singletonList("cluster_information")));
}
- private final SelectStatementContext sqlStatementContext;
-
- private final String sql;
-
- private final List<Object> parameters;
-
- private Map<String, Collection<String>> selectedSchemaTables = new
CaseInsensitiveMap<>();
-
/**
* Create new instance of system table query executor.
*
+ * @param sqlStatementContext select statement context
+ * @param sql SQL
+ * @param parameters SQL parameters
* @return created instance
*/
- public Optional<DatabaseAdminExecutor> newInstance() {
+ public static Optional<DatabaseAdminExecutor> newInstance(final
SelectStatementContext sqlStatementContext, final String sql, final
List<Object> parameters) {
+ Map<String, Collection<String>> selectedSchemaTables =
getSelectedSchemaTables(sqlStatementContext);
if (isSelectSystemTable(selectedSchemaTables) &&
isSelectDatCompatibility(sqlStatementContext)) {
return Optional.of(new OpenGaussSelectDatCompatibilityExecutor());
}
@@ -83,7 +82,30 @@ public final class OpenGaussSystemTableQueryExecutorFactory {
return Optional.empty();
}
- private boolean isSelectDatCompatibility(final SelectStatementContext
selectStatementContext) {
+ private static Map<String, Collection<String>>
getSelectedSchemaTables(final SelectStatementContext selectStatementContext) {
+ Map<String, Collection<String>> result = new CaseInsensitiveMap<>();
+ for (SimpleTableSegment each :
selectStatementContext.getTablesContext().getSimpleTables()) {
+ TableNameSegment tableNameSegment = each.getTableName();
+ String tableName = tableNameSegment.getIdentifier().getValue();
+ String schemaName =
tableNameSegment.getTableBoundInfo().map(TableSegmentBoundInfo::getOriginalSchema).map(IdentifierValue::getValue).orElse(null);
+ Optional.ofNullable(schemaName).ifPresent(optional ->
result.computeIfAbsent(optional, key -> new
CaseInsensitiveSet<>()).add(tableName));
+ }
+ return result;
+ }
+
+ private static boolean isSelectSystemTable(final Map<String,
Collection<String>> selectedSchemaTables) {
+ if (selectedSchemaTables.isEmpty()) {
+ return false;
+ }
+ for (Entry<String, Collection<String>> each :
selectedSchemaTables.entrySet()) {
+ if (!SystemSchemaManager.isSystemTable("openGauss", each.getKey(),
each.getValue())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static boolean isSelectDatCompatibility(final
SelectStatementContext selectStatementContext) {
TablesContext tablesContext =
selectStatementContext.getTablesContext();
boolean isSelectFromPgDatabase = 1 ==
tablesContext.getSimpleTables().size()
&&
"pg_database".equalsIgnoreCase(tablesContext.getSimpleTables().iterator().next().getTableName().getIdentifier().getValue());
@@ -98,35 +120,12 @@ public final class
OpenGaussSystemTableQueryExecutorFactory {
return false;
}
- /**
- * Accept.
- *
- * @return true or false
- */
- public boolean accept() {
- selectedSchemaTables = getSelectedSchemaTables(sqlStatementContext);
- return isSelectSystemTable(selectedSchemaTables);
- }
-
- private Map<String, Collection<String>> getSelectedSchemaTables(final
SelectStatementContext selectStatementContext) {
- Map<String, Collection<String>> result = new CaseInsensitiveMap<>();
- TablesContext tablesContext =
selectStatementContext.getTablesContext();
- for (SimpleTableSegment each : tablesContext.getSimpleTables()) {
- TableNameSegment tableNameSegment = each.getTableName();
- String tableName = tableNameSegment.getIdentifier().getValue();
- String schemaName =
tableNameSegment.getTableBoundInfo().map(TableSegmentBoundInfo::getOriginalSchema).map(IdentifierValue::getValue).orElse(null);
- Optional.ofNullable(schemaName).ifPresent(optional ->
result.computeIfAbsent(optional, key -> new
CaseInsensitiveSet<>()).add(tableName));
- }
- return result;
- }
-
- private boolean isSelectedStatisticsSystemTable(final Map<String,
Collection<String>> selectedSchemaTables) {
- DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "openGauss");
- Optional<DialectDatabaseStatisticsCollector>
dialectStatisticsCollector =
DatabaseTypedSPILoader.findService(DialectDatabaseStatisticsCollector.class,
databaseType);
+ private static boolean isSelectedStatisticsSystemTable(final Map<String,
Collection<String>> selectedSchemaTables) {
+ Optional<DialectDatabaseStatisticsCollector>
dialectStatisticsCollector =
DatabaseTypedSPILoader.findService(DialectDatabaseStatisticsCollector.class,
DATABASE_TYPE);
return
dialectStatisticsCollector.map(dialectDatabaseStatisticsCollector ->
dialectDatabaseStatisticsCollector.isStatisticsTables(selectedSchemaTables)).orElse(false);
}
- private boolean isSelectedShardingSphereSystemTable(final Map<String,
Collection<String>> selectedSchemaTables) {
+ private static boolean isSelectedShardingSphereSystemTable(final
Map<String, Collection<String>> selectedSchemaTables) {
if (selectedSchemaTables.isEmpty()) {
return false;
}
@@ -140,16 +139,4 @@ public final class
OpenGaussSystemTableQueryExecutorFactory {
}
return true;
}
-
- private boolean isSelectSystemTable(final Map<String, Collection<String>>
selectedSchemaTables) {
- if (selectedSchemaTables.isEmpty()) {
- return false;
- }
- for (Entry<String, Collection<String>> each :
selectedSchemaTables.entrySet()) {
- if (!SystemSchemaManager.isSystemTable("openGauss", each.getKey(),
each.getValue())) {
- return false;
- }
- }
- return true;
- }
}
diff --git
a/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreatorTest.java
b/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreatorTest.java
index 070c9ef09d0..dc8d5f8bf51 100644
---
a/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreatorTest.java
+++
b/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/OpenGaussAdminExecutorCreatorTest.java
@@ -89,6 +89,7 @@ class OpenGaussAdminExecutorCreatorTest {
@Test
void assertCreateExecutorForSelectVersion() {
+ initDialectDatabaseStatisticsCollector(false);
String sql = "SELECT VERSION()";
String expression = "VERSION()";
assertCreateExecutorForFunction(sql, expression,
OpenGaussSelectVersionExecutor.class);
@@ -96,6 +97,7 @@ class OpenGaussAdminExecutorCreatorTest {
@Test
void assertCreateExecutorForSelectGsPasswordDeadline() {
+ initDialectDatabaseStatisticsCollector(false);
String sql = "SELECT
pg_catalog.intervaltonum(pg_catalog.gs_password_deadline())";
String expression =
"pg_catalog.intervaltonum(pg_catalog.gs_password_deadline())";
assertCreateExecutorForFunction(sql, expression,
OpenGaussSelectPasswordDeadlineExecutor.class);
@@ -103,6 +105,7 @@ class OpenGaussAdminExecutorCreatorTest {
@Test
void assertCreateExecutorForSelectGsPasswordNotifyTime() {
+ initDialectDatabaseStatisticsCollector(false);
String sql = "SELECT pg_catalog.gs_password_notifytime()";
String expression = "pg_catalog.gs_password_notifytime()";
assertCreateExecutorForFunction(sql, expression,
OpenGaussSelectPasswordNotifyTimeExecutor.class);
@@ -112,6 +115,7 @@ class OpenGaussAdminExecutorCreatorTest {
DialectDatabaseStatisticsCollector statisticsCollector =
mock(DialectDatabaseStatisticsCollector.class);
when(statisticsCollector.isStatisticsTables(anyMap())).thenReturn(isStatisticsTables);
when(DatabaseTypedSPILoader.findService(DialectDatabaseStatisticsCollector.class,
TypedSPILoader.getService(DatabaseType.class,
"openGauss"))).thenReturn(Optional.of(statisticsCollector));
+
when(DatabaseTypedSPILoader.findService(DialectDatabaseStatisticsCollector.class,
TypedSPILoader.getService(DatabaseType.class,
"PostgreSQL"))).thenReturn(Optional.of(statisticsCollector));
}
private void assertCreateExecutorForFunction(final String sql, final
String expression, final Class<?> type) {
diff --git
a/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/factory/OpenGaussSystemTableQueryExecutorFactoryTest.java
b/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/factory/OpenGaussSystemTableQueryExecutorFactoryTest.java
index 395fae7a159..c0e4dd0959e 100644
---
a/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/factory/OpenGaussSystemTableQueryExecutorFactoryTest.java
+++
b/proxy/backend/dialect/opengauss/src/test/java/org/apache/shardingsphere/proxy/backend/opengauss/handler/admin/factory/OpenGaussSystemTableQueryExecutorFactoryTest.java
@@ -46,9 +46,7 @@ class OpenGaussSystemTableQueryExecutorFactoryTest {
void assertSelectDatCompatibilityFromPgDatabase() {
String sql = "SELECT datcompatibility FROM pg_database WHERE
datname='sharding_db'";
SelectStatementContext sqlStatementContext =
mockSelectStatementContext("pg_catalog", "pg_database", "datcompatibility");
- OpenGaussSystemTableQueryExecutorFactory creator = new
OpenGaussSystemTableQueryExecutorFactory(sqlStatementContext, sql,
Collections.emptyList());
- assertTrue(creator.accept());
- Optional<DatabaseAdminExecutor> actual = creator.newInstance();
+ Optional<DatabaseAdminExecutor> actual =
OpenGaussSystemTableQueryExecutorFactory.newInstance(sqlStatementContext, sql,
Collections.emptyList());
assertTrue(actual.isPresent());
assertThat(actual.get(),
isA(OpenGaussSelectDatCompatibilityExecutor.class));
}
@@ -57,9 +55,7 @@ class OpenGaussSystemTableQueryExecutorFactoryTest {
void assertSelectFromNotCollectedTable() {
String sql = "SELECT name FROM pg_type'";
SelectStatementContext sqlStatementContext =
mockSelectStatementContext("pg_catalog", "pg_type", "name");
- OpenGaussSystemTableQueryExecutorFactory creator = new
OpenGaussSystemTableQueryExecutorFactory(sqlStatementContext, sql,
Collections.emptyList());
- assertTrue(creator.accept());
- Optional<DatabaseAdminExecutor> actual = creator.newInstance();
+ Optional<DatabaseAdminExecutor> actual =
OpenGaussSystemTableQueryExecutorFactory.newInstance(sqlStatementContext, sql,
Collections.emptyList());
assertTrue(actual.isPresent());
assertThat(actual.get(), isA(DatabaseMetaDataExecutor.class));
}