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

Reply via email to