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 001a5a3ea28 Refactor UnicastDatabaseProxyBackendHandler (#36845)
001a5a3ea28 is described below

commit 001a5a3ea28e2fbc5297ab122cdb974b044f0693
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Oct 10 22:07:57 2025 +0800

    Refactor UnicastDatabaseProxyBackendHandler (#36845)
    
    * Refactor UnicastDatabaseProxyBackendHandler
    
    * Refactor DatabaseAdminQueryProxyBackendHandler
---
 .../DatabaseAdminProxyBackendHandlerFactory.java   |  3 ++-
 .../DatabaseAdminQueryProxyBackendHandler.java     |  6 +++--
 .../executor/AbstractDatabaseMetaDataExecutor.java | 28 +++++++++----------
 .../DatabaseAdminQueryProxyBackendHandlerTest.java | 31 +++++++---------------
 .../SelectInformationSchemataExecutor.java         | 14 ++++++----
 5 files changed, 39 insertions(+), 43 deletions(-)

diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminProxyBackendHandlerFactory.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminProxyBackendHandlerFactory.java
index 0ddc41c6f20..c6232f922f3 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminProxyBackendHandlerFactory.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminProxyBackendHandlerFactory.java
@@ -22,6 +22,7 @@ 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.statement.SQLStatementContext;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutorCreator;
@@ -76,7 +77,7 @@ public final class DatabaseAdminProxyBackendHandlerFactory {
     
     private static ProxyBackendHandler createProxyBackendHandler(final 
SQLStatementContext sqlStatementContext, final ConnectionSession 
connectionSession, final DatabaseAdminExecutor executor) {
         return executor instanceof DatabaseAdminQueryExecutor
-                ? new DatabaseAdminQueryProxyBackendHandler(connectionSession, 
(DatabaseAdminQueryExecutor) executor)
+                ? new 
DatabaseAdminQueryProxyBackendHandler(ProxyContext.getInstance().getContextManager(),
 connectionSession, (DatabaseAdminQueryExecutor) executor)
                 : new 
DatabaseAdminUpdateProxyBackendHandler(connectionSession, 
sqlStatementContext.getSqlStatement(), executor);
     }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandler.java
index 76e2d6c2a8f..491df2bf00b 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandler.java
@@ -22,7 +22,7 @@ import 
org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
@@ -43,6 +43,8 @@ import java.util.List;
 @RequiredArgsConstructor
 public final class DatabaseAdminQueryProxyBackendHandler implements 
ProxyBackendHandler {
     
+    private final ContextManager contextManager;
+    
     private final ConnectionSession connectionSession;
     
     private final DatabaseAdminQueryExecutor executor;
@@ -61,7 +63,7 @@ public final class DatabaseAdminQueryProxyBackendHandler 
implements ProxyBackend
     
     private List<QueryHeader> createResponseHeader() throws SQLException {
         List<QueryHeader> result = new 
ArrayList<>(queryResultMetaData.getColumnCount());
-        ShardingSphereDatabase database = null == 
connectionSession.getUsedDatabaseName() ? null : 
ProxyContext.getInstance().getContextManager().getDatabase(connectionSession.getUsedDatabaseName());
+        ShardingSphereDatabase database = null == 
connectionSession.getUsedDatabaseName() ? null : 
contextManager.getDatabase(connectionSession.getUsedDatabaseName());
         DatabaseType databaseType = null == database ? 
connectionSession.getProtocolType() : database.getProtocolType();
         QueryHeaderBuilderEngine queryHeaderBuilderEngine = new 
QueryHeaderBuilderEngine(databaseType);
         for (int columnIndex = 1; columnIndex <= 
queryResultMetaData.getColumnCount(); columnIndex++) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
index e4f49aa1bd7..96f498d391b 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetaDataExecutor.java
@@ -33,6 +33,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 
@@ -63,6 +64,8 @@ public abstract class AbstractDatabaseMetaDataExecutor 
implements DatabaseAdminQ
     
     private MergedResult mergedResult;
     
+    private final ContextManager contextManager = 
ProxyContext.getInstance().getContextManager();
+    
     private final List<Map<String, Object>> rows = new LinkedList<>();
     
     private final Collection<String> labels = new LinkedList<>();
@@ -124,15 +127,6 @@ public abstract class AbstractDatabaseMetaDataExecutor 
implements DatabaseAdminQ
         return new RawQueryResultMetaData(columns);
     }
     
-    protected static Boolean hasDataSource(final String databaseName) {
-        return 
ProxyContext.getInstance().getContextManager().getDatabase(databaseName).containsDataSource();
-    }
-    
-    protected static boolean isAuthorized(final String databaseName, final 
Grantee grantee) {
-        AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
-        return new AuthorityChecker(authorityRule, 
grantee).isAuthorized(databaseName);
-    }
-    
     /**
      * Default database meta data executor, execute sql directly in the 
database to obtain the result source data.
      */
@@ -145,18 +139,24 @@ public abstract class AbstractDatabaseMetaDataExecutor 
implements DatabaseAdminQ
         
         @Override
         protected Collection<String> getDatabaseNames(final ConnectionSession 
connectionSession) {
-            ShardingSphereDatabase database = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
-            if (null != database && isAuthorized(database.getName(), 
connectionSession.getConnectionContext().getGrantee()) && 
hasDataSource(database.getName())) {
+            ShardingSphereDatabase database = 
getContextManager().getMetaDataContexts().getMetaData().getDatabase(connectionSession.getCurrentDatabaseName());
+            if (null != database && isAuthorized(database.getName(), 
connectionSession.getConnectionContext().getGrantee())
+                    && 
getContextManager().getDatabase(database.getName()).containsDataSource()) {
                 return Collections.singleton(database.getName());
             }
-            Collection<String> databaseNames = 
ProxyContext.getInstance().getContextManager().getAllDatabaseNames().stream()
-                    .filter(each -> isAuthorized(each, 
connectionSession.getConnectionContext().getGrantee())).filter(AbstractDatabaseMetaDataExecutor::hasDataSource).collect(Collectors.toList());
+            Collection<String> databaseNames = 
getContextManager().getAllDatabaseNames().stream()
+                    .filter(each -> isAuthorized(each, 
connectionSession.getConnectionContext().getGrantee()))
+                    .filter(each -> 
getContextManager().getDatabase(each).containsDataSource()).collect(Collectors.toList());
             return databaseNames.isEmpty() ? Collections.emptyList() : 
Collections.singletonList(databaseNames.iterator().next());
         }
         
+        private boolean isAuthorized(final String databaseName, final Grantee 
grantee) {
+            return new 
AuthorityChecker(getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class),
 grantee).isAuthorized(databaseName);
+        }
+        
         @Override
         protected void processMetaData(final String databaseName, final 
Consumer<ResultSet> callback) throws SQLException {
-            ResourceMetaData resourceMetaData = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
+            ResourceMetaData resourceMetaData = 
getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
             Optional<StorageUnit> storageUnit = 
resourceMetaData.getStorageUnits().values().stream().findFirst();
             if (!storageUnit.isPresent()) {
                 return;
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandlerTest.java
index a96dd65ff9c..459e405c94a 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/DatabaseAdminQueryProxyBackendHandlerTest.java
@@ -30,17 +30,15 @@ import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSpher
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeaderBuilder;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.test.infra.framework.mock.AutoMockExtension;
-import org.apache.shardingsphere.test.infra.framework.mock.StaticMockSettings;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.MockedStatic;
+import org.mockito.junit.jupiter.MockitoExtension;
 
 import java.sql.SQLException;
 import java.util.Collections;
@@ -55,8 +53,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
 import static org.mockito.Mockito.when;
 
-@ExtendWith(AutoMockExtension.class)
-@StaticMockSettings(ProxyContext.class)
+@ExtendWith(MockitoExtension.class)
 class DatabaseAdminQueryProxyBackendHandlerTest {
     
     private final DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
@@ -70,13 +67,18 @@ class DatabaseAdminQueryProxyBackendHandlerTest {
         DatabaseAdminQueryExecutor executor = 
mock(DatabaseAdminQueryExecutor.class, RETURNS_DEEP_STUBS);
         when(executor.getMergedResult()).thenReturn(new 
LocalDataMergedResult(Collections.singleton(new LocalDataQueryResultRow("ds_0", 
"ds_1"))));
         when(executor.getQueryResultMetaData().getColumnCount()).thenReturn(1);
-        handler = new DatabaseAdminQueryProxyBackendHandler(connectionSession, 
executor);
+        handler = new 
DatabaseAdminQueryProxyBackendHandler(mockContextManager(), connectionSession, 
executor);
+    }
+    
+    private ContextManager mockContextManager() {
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
databaseType, mock(), mock(), Collections.emptyList());
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new 
ConfigurationProperties(new Properties()));
+        ComputeNodeInstanceContext computeNodeInstanceContext = 
mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS);
+        return new ContextManager(new MetaDataContexts(metaData, 
ShardingSphereStatisticsFactory.create(metaData, new 
ShardingSphereStatistics())), computeNodeInstanceContext, mock(), mock());
     }
     
     @Test
     void assertExecute() throws SQLException {
-        ContextManager contextManager = mockContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         try (MockedStatic<DatabaseTypedSPILoader> spiLoader = 
mockStatic(DatabaseTypedSPILoader.class)) {
             spiLoader.when(() -> 
DatabaseTypedSPILoader.getService(QueryHeaderBuilder.class, 
databaseType)).thenReturn(mock(QueryHeaderBuilder.class));
             assertThat(((QueryResponseHeader) 
handler.execute()).getQueryHeaders().size(), is(1));
@@ -85,8 +87,6 @@ class DatabaseAdminQueryProxyBackendHandlerTest {
     
     @Test
     void assertNext() throws SQLException {
-        ContextManager contextManager = mockContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         try (MockedStatic<DatabaseTypedSPILoader> spiLoader = 
mockStatic(DatabaseTypedSPILoader.class)) {
             spiLoader.when(() -> 
DatabaseTypedSPILoader.getService(QueryHeaderBuilder.class, 
databaseType)).thenReturn(mock(QueryHeaderBuilder.class));
             handler.execute();
@@ -97,8 +97,6 @@ class DatabaseAdminQueryProxyBackendHandlerTest {
     
     @Test
     void assertGetRowData() throws SQLException {
-        ContextManager contextManager = mockContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         try (MockedStatic<DatabaseTypedSPILoader> spiLoader = 
mockStatic(DatabaseTypedSPILoader.class)) {
             spiLoader.when(() -> 
DatabaseTypedSPILoader.getService(QueryHeaderBuilder.class, 
databaseType)).thenReturn(mock(QueryHeaderBuilder.class));
             handler.execute();
@@ -106,13 +104,4 @@ class DatabaseAdminQueryProxyBackendHandlerTest {
             assertThat(handler.getRowData().getData().size(), is(1));
         }
     }
-    
-    private ContextManager mockContextManager() {
-        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
databaseType, mock(), mock(), Collections.emptyList());
-        
when(ProxyContext.getInstance().getContextManager().getDatabase("foo_db")).thenReturn(database);
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), new 
ConfigurationProperties(new Properties()));
-        ComputeNodeInstanceContext computeNodeInstanceContext = 
mock(ComputeNodeInstanceContext.class, RETURNS_DEEP_STUBS);
-        return new ContextManager(
-                new MetaDataContexts(metaData, 
ShardingSphereStatisticsFactory.create(metaData, new 
ShardingSphereStatistics())), computeNodeInstanceContext, mock(), mock());
-    }
 }
diff --git 
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
 
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
index d992a6c79b5..83b9e5c3e9c 100644
--- 
a/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
+++ 
b/proxy/backend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/information/SelectInformationSchemataExecutor.java
@@ -17,10 +17,12 @@
 
 package 
org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor.information;
 
+import org.apache.shardingsphere.authority.checker.AuthorityChecker;
+import org.apache.shardingsphere.authority.rule.AuthorityRule;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
+import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.AbstractDatabaseMetaDataExecutor.DefaultDatabaseMetaDataExecutor;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ColumnProjectionSegment;
@@ -87,10 +89,12 @@ public final class SelectInformationSchemataExecutor 
extends DefaultDatabaseMeta
     
     @Override
     protected Collection<String> getDatabaseNames(final ConnectionSession 
connectionSession) {
-        Collection<String> databaseNames = 
ProxyContext.getInstance().getContextManager().getAllDatabaseNames().stream()
-                .filter(each -> isAuthorized(each, 
connectionSession.getConnectionContext().getGrantee())).collect(Collectors.toList());
-        SCHEMA_WITHOUT_DATA_SOURCE.addAll(databaseNames.stream().filter(each 
-> !hasDataSource(each)).collect(Collectors.toSet()));
-        Collection<String> result = 
databaseNames.stream().filter(AbstractDatabaseMetaDataExecutor::hasDataSource).collect(Collectors.toList());
+        ContextManager contextManager = 
ProxyContext.getInstance().getContextManager();
+        AuthorityChecker authorityChecker = new AuthorityChecker(
+                
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class),
 connectionSession.getConnectionContext().getGrantee());
+        Collection<String> databaseNames = 
contextManager.getAllDatabaseNames().stream().filter(authorityChecker::isAuthorized).collect(Collectors.toList());
+        SCHEMA_WITHOUT_DATA_SOURCE.addAll(databaseNames.stream().filter(each 
-> 
!contextManager.getDatabase(each).containsDataSource()).collect(Collectors.toSet()));
+        Collection<String> result = databaseNames.stream().filter(each -> 
contextManager.getDatabase(each).containsDataSource()).collect(Collectors.toList());
         if (!SCHEMA_WITHOUT_DATA_SOURCE.isEmpty()) {
             fillSchemasWithoutDataSource();
         }

Reply via email to