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 b9999f545a1 Refactor UnicastDatabaseProxyBackendHandler (#36844)
b9999f545a1 is described below

commit b9999f545a11bb2e728da8fff7a2209fc2e189af
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Oct 10 19:06:03 2025 +0800

    Refactor UnicastDatabaseProxyBackendHandler (#36844)
---
 .../data/DatabaseProxyBackendHandlerFactory.java   |  3 +-
 .../type/UnicastDatabaseProxyBackendHandler.java   | 11 +++---
 .../UnicastDatabaseProxyBackendHandlerTest.java    | 43 ++++++----------------
 3 files changed, 20 insertions(+), 37 deletions(-)

diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseProxyBackendHandlerFactory.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseProxyBackendHandlerFactory.java
index 57073cb7feb..067958504f3 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseProxyBackendHandlerFactory.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/DatabaseProxyBackendHandlerFactory.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import 
org.apache.shardingsphere.proxy.backend.connector.DatabaseProxyConnectorFactory;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.handler.data.type.UnicastDatabaseProxyBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
@@ -51,7 +52,7 @@ public final class DatabaseProxyBackendHandlerFactory {
             return () -> new UpdateResponseHeader(sqlStatement);
         }
         if (sqlStatement instanceof DoStatement || 
isNotDatabaseSelectRequiredDALStatement(sqlStatement) || 
isNotContainFromSelectStatement(sqlStatement)) {
-            return new UnicastDatabaseProxyBackendHandler(queryContext, 
connectionSession);
+            return new UnicastDatabaseProxyBackendHandler(queryContext, 
ProxyContext.getInstance().getContextManager(), connectionSession);
         }
         return DatabaseProxyConnectorFactory.newInstance(queryContext, 
connectionSession.getDatabaseConnectionManager(), preferPreparedStatement);
     }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandler.java
index edbd5870603..d8cdfc9aaf4 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandler.java
@@ -24,9 +24,9 @@ import 
org.apache.shardingsphere.database.exception.core.exception.syntax.databa
 import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
+import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.proxy.backend.connector.DatabaseProxyConnector;
 import 
org.apache.shardingsphere.proxy.backend.connector.DatabaseProxyConnectorFactory;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.handler.data.DatabaseProxyBackendHandler;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
@@ -45,6 +45,8 @@ public final class UnicastDatabaseProxyBackendHandler 
implements DatabaseProxyBa
     
     private final QueryContext queryContext;
     
+    private final ContextManager contextManager;
+    
     private final ConnectionSession connectionSession;
     
     private DatabaseProxyConnector databaseProxyConnector;
@@ -53,8 +55,7 @@ public final class UnicastDatabaseProxyBackendHandler 
implements DatabaseProxyBa
     public ResponseHeader execute() throws SQLException {
         String originalDatabaseName = 
connectionSession.getCurrentDatabaseName();
         String unicastDatabaseName = null == originalDatabaseName ? 
getFirstDatabaseName() : originalDatabaseName;
-        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getContextManager().getDatabase(unicastDatabaseName).containsDataSource(),
-                () -> new EmptyStorageUnitException(unicastDatabaseName));
+        
ShardingSpherePreconditions.checkState(contextManager.getDatabase(unicastDatabaseName).containsDataSource(),
 () -> new EmptyStorageUnitException(unicastDatabaseName));
         try {
             connectionSession.setCurrentDatabaseName(unicastDatabaseName);
             databaseProxyConnector = 
DatabaseProxyConnectorFactory.newInstance(queryContext, 
connectionSession.getDatabaseConnectionManager(), false);
@@ -65,11 +66,11 @@ public final class UnicastDatabaseProxyBackendHandler 
implements DatabaseProxyBa
     }
     
     private String getFirstDatabaseName() {
-        Collection<String> databaseNames = 
ProxyContext.getInstance().getContextManager().getAllDatabaseNames();
+        Collection<String> databaseNames = 
contextManager.getAllDatabaseNames();
         ShardingSpherePreconditions.checkNotEmpty(databaseNames, 
NoDatabaseSelectedException::new);
         AuthorityRule authorityRule = 
queryContext.getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
         Optional<ShardingSpherePrivileges> privileges = 
authorityRule.findPrivileges(connectionSession.getConnectionContext().getGrantee());
-        Stream<String> storageUnitContainedDatabaseNames = 
databaseNames.stream().filter(each -> 
ProxyContext.getInstance().getContextManager().getDatabase(each).containsDataSource());
+        Stream<String> storageUnitContainedDatabaseNames = 
databaseNames.stream().filter(each -> 
contextManager.getDatabase(each).containsDataSource());
         Optional<String> result = privileges.map(optional -> 
storageUnitContainedDatabaseNames.filter(optional::hasPrivileges).findFirst()).orElseGet(storageUnitContainedDatabaseNames::findFirst);
         ShardingSpherePreconditions.checkState(result.isPresent(), 
EmptyStorageUnitException::new);
         return result.get();
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandlerTest.java
index 25a7f2917aa..8df8f5e3fc7 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/data/type/UnicastDatabaseProxyBackendHandlerTest.java
@@ -46,11 +46,8 @@ import org.mockito.Answers;
 import org.mockito.Mock;
 
 import java.sql.SQLException;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Optional;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -67,8 +64,6 @@ class UnicastDatabaseProxyBackendHandlerTest {
     
     private static final String EXECUTE_SQL = "SELECT 1 FROM user WHERE id = 
1";
     
-    private static final String DATABASE_PATTERN = "db_%s";
-    
     private final DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
     
     private UnicastDatabaseProxyBackendHandler 
unicastDatabaseProxyBackendHandler;
@@ -76,17 +71,23 @@ class UnicastDatabaseProxyBackendHandlerTest {
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private ConnectionSession connectionSession;
     
-    @Mock
-    private DatabaseProxyConnector databaseProxyConnector;
-    
     @BeforeEach
     void setUp() throws SQLException {
-        
when(connectionSession.getCurrentDatabaseName()).thenReturn(String.format(DATABASE_PATTERN,
 0));
+        when(connectionSession.getCurrentDatabaseName()).thenReturn("foo_db");
         mockDatabaseProxyConnector(new UpdateResponseHeader(mock()));
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         
when(sqlStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
         unicastDatabaseProxyBackendHandler = new 
UnicastDatabaseProxyBackendHandler(
-                new QueryContext(sqlStatementContext, EXECUTE_SQL, 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock()), connectionSession);
+                new QueryContext(sqlStatementContext, EXECUTE_SQL, 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock()), mockContextManager(), connectionSession);
+    }
+    
+    private ContextManager mockContextManager() {
+        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+        ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db", 
databaseType, mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), mock(), 
Collections.emptyList());
+        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), mock());
+        when(result.getMetaDataContexts()).thenReturn(new 
MetaDataContexts(metaData, ShardingSphereStatisticsFactory.create(metaData, new 
ShardingSphereStatistics())));
+        
when(result.getDatabase("foo_db")).thenReturn(Collections.singleton(database).iterator().next());
+        return result;
     }
     
     private ConnectionContext mockConnectionContext() {
@@ -96,42 +97,22 @@ class UnicastDatabaseProxyBackendHandlerTest {
     }
     
     private void mockDatabaseProxyConnector(final ResponseHeader 
responseHeader) throws SQLException {
+        DatabaseProxyConnector databaseProxyConnector = 
mock(DatabaseProxyConnector.class);
         when(databaseProxyConnector.execute()).thenReturn(responseHeader);
         
when(DatabaseProxyConnectorFactory.newInstance(any(QueryContext.class), 
any(ProxyDatabaseConnectionManager.class), 
eq(false))).thenReturn(databaseProxyConnector);
     }
     
     @Test
     void assertExecuteDatabaseProxyBackendHandler() throws SQLException {
-        ContextManager contextManager = mockContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = createDatabases().iterator().next();
-        when(contextManager.getDatabase("db_0")).thenReturn(database);
         ResponseHeader actual = unicastDatabaseProxyBackendHandler.execute();
         assertThat(actual, isA(UpdateResponseHeader.class));
     }
     
     @Test
     void assertDatabaseUsingStream() throws SQLException {
-        ContextManager contextManager = mockContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        ShardingSphereDatabase database = createDatabases().iterator().next();
-        when(contextManager.getDatabase("db_0")).thenReturn(database);
         unicastDatabaseProxyBackendHandler.execute();
         while (unicastDatabaseProxyBackendHandler.next()) {
             
assertThat(unicastDatabaseProxyBackendHandler.getRowData().getData().size(), 
is(1));
         }
     }
-    
-    private ContextManager mockContextManager() {
-        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
-        ShardingSphereMetaData metaData = new 
ShardingSphereMetaData(createDatabases(), mock(), mock(), mock());
-        MetaDataContexts metaDataContexts = new MetaDataContexts(metaData, 
ShardingSphereStatisticsFactory.create(metaData, new 
ShardingSphereStatistics()));
-        when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
-        return result;
-    }
-    
-    private Collection<ShardingSphereDatabase> createDatabases() {
-        return IntStream.range(0, 10).mapToObj(each -> new 
ShardingSphereDatabase(
-                String.format(DATABASE_PATTERN, each), databaseType, 
mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), mock(), 
Collections.emptyList())).collect(Collectors.toList());
-    }
 }

Reply via email to