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 2a9efaff8f9 Decouple ProxyContext and MySQLSelectAdminExecutorFactory 
(#36903)
2a9efaff8f9 is described below

commit 2a9efaff8f9bd2e123b8171f655aeb342cce0259
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Oct 20 23:08:37 2025 +0800

    Decouple ProxyContext and MySQLSelectAdminExecutorFactory (#36903)
    
    * Decouple ProxyContext and MySQLSelectAdminExecutorFactory
    
    * Decouple ProxyContext and MySQLSelectAdminExecutorFactory
    
    * Decouple ProxyContext and MySQLSelectAdminExecutorFactory
---
 .../handler/admin/MySQLAdminExecutorCreator.java   |  4 ++-
 .../factory/MySQLSelectAdminExecutorFactory.java   | 18 ++++++------
 ...MySQLSelectWithoutFromAdminExecutorFactory.java | 21 ++++++++------
 .../admin/MySQLAdminExecutorCreatorTest.java       | 32 ++++++++++++++++++----
 4 files changed, 51 insertions(+), 24 deletions(-)

diff --git 
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
 
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
index f9d90dee190..7bbf37b98a3 100644
--- 
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
+++ 
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreator.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutorCreator;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.MySQLKillProcessExecutor;
@@ -42,7 +43,8 @@ public final class MySQLAdminExecutorCreator implements 
DatabaseAdminExecutorCre
     @Override
     public Optional<DatabaseAdminExecutor> create(final SQLStatementContext 
sqlStatementContext, final String sql, final String databaseName, final 
List<Object> parameters) {
         if (sqlStatementContext instanceof SelectStatementContext) {
-            return 
MySQLSelectAdminExecutorFactory.newInstance((SelectStatementContext) 
sqlStatementContext, sql, databaseName, parameters);
+            return 
MySQLSelectAdminExecutorFactory.newInstance((SelectStatementContext) 
sqlStatementContext, sql, parameters, databaseName,
+                    
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData());
         }
         SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
         Optional<DatabaseAdminExecutor> showExecutor = 
MySQLShowAdminExecutorFactory.newInstance(sqlStatement);
diff --git 
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/MySQLSelectAdminExecutorFactory.java
 
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/MySQLSelectAdminExecutorFactory.java
index cfc83d9441c..b71070c7d2c 100644
--- 
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/MySQLSelectAdminExecutorFactory.java
+++ 
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/MySQLSelectAdminExecutorFactory.java
@@ -20,7 +20,7 @@ package 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.factory;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.factory.schema.MySQLInformationSchemaExecutorFactory;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.factory.schema.MySQLMySQLSchemaExecutorFactory;
@@ -50,24 +50,26 @@ public final class MySQLSelectAdminExecutorFactory {
      *
      * @param selectStatementContext select statement context
      * @param sql SQL
+     * @param parameters SQL parameters
      * @param databaseName database name
-     * @param parameters  SQL parameters
+     * @param metaData meta data
      * @return created instance
      */
-    public static Optional<DatabaseAdminExecutor> newInstance(final 
SelectStatementContext selectStatementContext, final String sql, final String 
databaseName, final List<Object> parameters) {
+    public static Optional<DatabaseAdminExecutor> newInstance(final 
SelectStatementContext selectStatementContext, final String sql, final 
List<Object> parameters,
+                                                              final String 
databaseName, final ShardingSphereMetaData metaData) {
         if (!selectStatementContext.getSqlStatement().getFrom().isPresent()) {
-            return 
MySQLSelectWithoutFromAdminExecutorFactory.newInstance(selectStatementContext, 
sql, databaseName);
+            return 
MySQLSelectWithoutFromAdminExecutorFactory.newInstance(selectStatementContext, 
sql, databaseName, metaData);
         }
-        if (INFORMATION_SCHEMA.equalsIgnoreCase(databaseName) && 
!ProxyContext.getInstance().getContextManager().getDatabase(databaseName).isComplete())
 {
+        if (INFORMATION_SCHEMA.equalsIgnoreCase(databaseName) && 
!metaData.getDatabase(databaseName).isComplete()) {
             return 
MySQLInformationSchemaExecutorFactory.newInstance(selectStatementContext, sql, 
parameters);
         }
-        if (PERFORMANCE_SCHEMA.equalsIgnoreCase(databaseName) && 
!ProxyContext.getInstance().getContextManager().getDatabase(databaseName).isComplete())
 {
+        if (PERFORMANCE_SCHEMA.equalsIgnoreCase(databaseName) && 
!metaData.getDatabase(databaseName).isComplete()) {
             return 
MySQLPerformanceSchemaExecutorFactory.newInstance(selectStatementContext, sql, 
parameters);
         }
-        if (MYSQL_SCHEMA.equalsIgnoreCase(databaseName) && 
!ProxyContext.getInstance().getContextManager().getDatabase(databaseName).isComplete())
 {
+        if (MYSQL_SCHEMA.equalsIgnoreCase(databaseName) && 
!metaData.getDatabase(databaseName).isComplete()) {
             return 
MySQLMySQLSchemaExecutorFactory.newInstance(selectStatementContext, sql, 
parameters);
         }
-        if (SYS_SCHEMA.equalsIgnoreCase(databaseName) && 
!ProxyContext.getInstance().getContextManager().getDatabase(databaseName).isComplete())
 {
+        if (SYS_SCHEMA.equalsIgnoreCase(databaseName) && 
!metaData.getDatabase(databaseName).isComplete()) {
             return 
MySQLSysSchemaExecutorFactory.newInstance(selectStatementContext, sql, 
parameters);
         }
         return Optional.empty();
diff --git 
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/withoutfrom/MySQLSelectWithoutFromAdminExecutorFactory.java
 
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/withoutfrom/MySQLSelectWithoutFromAdminExecutorFactory.java
index d40a5405c3d..470c536a131 100644
--- 
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/withoutfrom/MySQLSelectWithoutFromAdminExecutorFactory.java
+++ 
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/factory/withoutfrom/MySQLSelectWithoutFromAdminExecutorFactory.java
@@ -20,8 +20,8 @@ package 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.factory.with
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.MySQLSystemVariableQueryExecutor;
 import 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.select.NoResourceShowExecutor;
@@ -50,15 +50,18 @@ public final class 
MySQLSelectWithoutFromAdminExecutorFactory {
      * @param selectStatementContext select statement context
      * @param sql SQL
      * @param databaseName database name
+     * @param metaData meta data
      * @return created instance
      */
-    public static Optional<DatabaseAdminExecutor> newInstance(final 
SelectStatementContext selectStatementContext, final String sql, final String 
databaseName) {
+    public static Optional<DatabaseAdminExecutor> newInstance(final 
SelectStatementContext selectStatementContext, final String sql,
+                                                              final String 
databaseName, final ShardingSphereMetaData metaData) {
         SelectStatement selectStatement = 
selectStatementContext.getSqlStatement();
         Optional<DatabaseAdminExecutor> result = 
MySQLSystemVariableQueryExecutor.tryGetSystemVariableQueryExecutor(selectStatement);
-        return result.isPresent() ? result : 
getSelectFunctionOrVariableExecutor(selectStatement, sql, databaseName);
+        return result.isPresent() ? result : 
getSelectFunctionOrVariableExecutor(selectStatement, sql, databaseName, 
metaData);
     }
     
-    private static Optional<DatabaseAdminExecutor> 
getSelectFunctionOrVariableExecutor(final SelectStatement selectStatement, 
final String sql, final String databaseName) {
+    private static Optional<DatabaseAdminExecutor> 
getSelectFunctionOrVariableExecutor(final SelectStatement selectStatement, 
final String sql,
+                                                                               
        final String databaseName, final ShardingSphereMetaData metaData) {
         if (isShowSpecialFunction(selectStatement, 
ShowConnectionIdExecutor.FUNCTION_NAME)) {
             return Optional.of(new ShowConnectionIdExecutor(selectStatement));
         }
@@ -71,7 +74,7 @@ public final class MySQLSelectWithoutFromAdminExecutorFactory 
{
         if (isShowSpecialFunction(selectStatement, 
ShowCurrentDatabaseExecutor.FUNCTION_NAME)) {
             return Optional.of(new ShowCurrentDatabaseExecutor());
         }
-        return mockExecutor(databaseName, selectStatement, sql);
+        return mockExecutor(selectStatement, sql, databaseName, metaData);
     }
     
     private static boolean isShowSpecialFunction(final SelectStatement 
sqlStatement, final String functionName) {
@@ -85,16 +88,16 @@ public final class 
MySQLSelectWithoutFromAdminExecutorFactory {
         return functionName.equalsIgnoreCase(trimmedText);
     }
     
-    private static Optional<DatabaseAdminExecutor> mockExecutor(final String 
databaseName, final SelectStatement sqlStatement, final String sql) {
-        if (isEmptyResource()) {
+    private static Optional<DatabaseAdminExecutor> mockExecutor(final 
SelectStatement sqlStatement, final String sql, final String databaseName, 
final ShardingSphereMetaData metaData) {
+        if (isEmptyResource(metaData)) {
             return Optional.of(new NoResourceShowExecutor(sqlStatement));
         }
         boolean isUseDatabase = null != databaseName || 
sqlStatement.getFrom().isPresent();
         return isUseDatabase ? Optional.empty() : Optional.of(new 
UnicastResourceShowExecutor(sqlStatement, sql));
     }
     
-    private static boolean isEmptyResource() {
-        Collection<ShardingSphereDatabase> databases = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getAllDatabases();
+    private static boolean isEmptyResource(final ShardingSphereMetaData 
metaData) {
+        Collection<ShardingSphereDatabase> databases = 
metaData.getAllDatabases();
         return databases.isEmpty() || 
databases.stream().noneMatch(ShardingSphereDatabase::containsDataSource);
     }
 }
diff --git 
a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
 
b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
index 0fdff82b6ca..2e1220a5c89 100644
--- 
a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
+++ 
b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
@@ -201,7 +201,6 @@ class MySQLAdminExecutorCreatorTest {
     
     @Test
     void assertCreateWithSelectStatementForTransactionReadOnly() {
-        
         initProxyContext(Collections.emptyList());
         SelectStatement selectStatement = mock(SelectStatement.class);
         when(selectStatement.getFrom()).thenReturn(Optional.empty());
@@ -316,7 +315,10 @@ class MySQLAdminExecutorCreatorTest {
     
     @Test
     void 
assertCreateWithSelectStatementFromInformationSchemaOfDefaultExecutorTables() {
-        initProxyContext(Collections.emptyList());
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+        when(database.getName()).thenReturn("information_schema");
+        when(database.getProtocolType()).thenReturn(databaseType);
+        initProxyContext(Collections.singleton(database));
         SimpleTableSegment tableSegment = new SimpleTableSegment(new 
TableNameSegment(10, 13, new IdentifierValue("ENGINES")));
         tableSegment.setOwner(new OwnerSegment(7, 8, new 
IdentifierValue("information_schema")));
         SelectStatement selectStatement = mock(SelectStatement.class);
@@ -329,8 +331,12 @@ class MySQLAdminExecutorCreatorTest {
     }
     
     @Test
-    void assertCreateWithSelectStatementFromInformationSchemaOfSchemaTable() {
-        initProxyContext(Collections.emptyList());
+    void 
assertCreateWithSelectStatementFromInformationSchemaOfSchemaTableWithUnCompletedDatabase()
 {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+        when(database.getName()).thenReturn("information_schema");
+        when(database.getProtocolType()).thenReturn(databaseType);
+        when(database.isComplete()).thenReturn(false);
+        initProxyContext(Collections.singleton(database));
         SimpleTableSegment tableSegment = new SimpleTableSegment(new 
TableNameSegment(10, 13, new IdentifierValue("SCHEMATA")));
         tableSegment.setOwner(new OwnerSegment(7, 8, new 
IdentifierValue("information_schema")));
         SelectStatement selectStatement = mock(SelectStatement.class);
@@ -340,8 +346,22 @@ class MySQLAdminExecutorCreatorTest {
         Optional<DatabaseAdminExecutor> actual = new 
MySQLAdminExecutorCreator().create(sqlStatementContext, "SELECT SCHEMA_NAME 
FROM SCHEMATA", "information_schema", Collections.emptyList());
         assertTrue(actual.isPresent());
         assertThat(actual.get(), isA(SelectInformationSchemataExecutor.class));
-        
when(ProxyContext.getInstance().getContextManager().getDatabase("information_schema").isComplete()).thenReturn(true);
-        actual = new MySQLAdminExecutorCreator().create(sqlStatementContext, 
"SELECT SCHEMA_NAME FROM SCHEMATA", "information_schema", 
Collections.emptyList());
+    }
+    
+    @Test
+    void 
assertCreateWithSelectStatementFromInformationSchemaOfSchemaTableWithCompletedDatabase()
 {
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+        when(database.getName()).thenReturn("information_schema");
+        when(database.getProtocolType()).thenReturn(databaseType);
+        when(database.isComplete()).thenReturn(true);
+        initProxyContext(Collections.singleton(database));
+        SimpleTableSegment tableSegment = new SimpleTableSegment(new 
TableNameSegment(10, 13, new IdentifierValue("SCHEMATA")));
+        tableSegment.setOwner(new OwnerSegment(7, 8, new 
IdentifierValue("information_schema")));
+        SelectStatement selectStatement = mock(SelectStatement.class);
+        when(selectStatement.getFrom()).thenReturn(Optional.of(tableSegment));
+        SelectStatementContext sqlStatementContext = 
mock(SelectStatementContext.class);
+        
when(sqlStatementContext.getSqlStatement()).thenReturn(selectStatement);
+        Optional<DatabaseAdminExecutor> actual = new 
MySQLAdminExecutorCreator().create(sqlStatementContext, "SELECT SCHEMA_NAME 
FROM SCHEMATA", "information_schema", Collections.emptyList());
         assertFalse(actual.isPresent());
     }
     

Reply via email to