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 00688217afc Refactor DatabaseConnector (#32445)
00688217afc is described below

commit 00688217afc2aa547c8514edb77e3b0d138d5d58
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Aug 9 21:33:49 2024 +0800

    Refactor DatabaseConnector (#32445)
    
    * Refactor DatabaseConnector
    
    * Refactor DatabaseConnector
    
    * Refactor DatabaseConnector
---
 .../proxy/backend/connector/DatabaseConnector.java | 10 +++----
 .../connector/DatabaseConnectorFactoryTest.java    | 18 ++++++------
 .../backend/connector/DatabaseConnectorTest.java   | 32 +++++++++++-----------
 3 files changed, 29 insertions(+), 31 deletions(-)

diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
index 91e888c0c42..8d33905a57f 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
@@ -123,7 +123,7 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
         this.queryContext = queryContext;
         this.databaseConnectionManager = databaseConnectionManager;
         contextManager = ProxyContext.getInstance().getContextManager();
-        database = 
contextManager.getDatabase(databaseConnectionManager.getConnectionSession().getUsedDatabaseName());
+        database = queryContext.getUsedDatabase();
         SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
         checkBackendReady(sqlStatementContext);
         containsDerivedProjections = sqlStatementContext instanceof 
SelectStatementContext && ((SelectStatementContext) 
sqlStatementContext).containsDerivedProjections();
@@ -280,8 +280,7 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
     }
     
     private MetaDataRefreshEngine getMetaDataRefreshEngine() {
-        return new MetaDataRefreshEngine(
-                
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService(), 
queryContext.getUsedDatabase(), 
contextManager.getMetaDataContexts().getMetaData().getProps());
+        return new 
MetaDataRefreshEngine(contextManager.getPersistServiceFacade().getMetaDataManagerPersistService(),
 database, contextManager.getMetaDataContexts().getMetaData().getProps());
     }
     
     private QueryResponseHeader processExecuteQuery(final SQLStatementContext 
sqlStatementContext, final List<QueryResult> queryResults, final QueryResult 
queryResultSample) throws SQLException {
@@ -293,7 +292,6 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
     private List<QueryHeader> createQueryHeaders(final SQLStatementContext 
sqlStatementContext, final QueryResult queryResultSample) throws SQLException {
         int columnCount = getColumnCount(sqlStatementContext, 
queryResultSample);
         List<QueryHeader> result = new ArrayList<>(columnCount);
-        ShardingSphereDatabase database = queryContext.getUsedDatabase();
         QueryHeaderBuilderEngine queryHeaderBuilderEngine = new 
QueryHeaderBuilderEngine(database.getProtocolType());
         for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
             result.add(createQueryHeader(queryHeaderBuilderEngine, 
sqlStatementContext, queryResultSample, database, columnIndex));
@@ -316,7 +314,7 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
     
     private MergedResult mergeQuery(final SQLStatementContext 
sqlStatementContext, final List<QueryResult> queryResults) throws SQLException {
         MergeEngine mergeEngine = new 
MergeEngine(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData(),
-                queryContext.getUsedDatabase(), 
contextManager.getMetaDataContexts().getMetaData().getProps(), 
databaseConnectionManager.getConnectionSession().getConnectionContext());
+                database, 
contextManager.getMetaDataContexts().getMetaData().getProps(), 
databaseConnectionManager.getConnectionSession().getConnectionContext());
         return mergeEngine.merge(queryResults, sqlStatementContext);
     }
     
@@ -334,7 +332,7 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
     }
     
     private boolean isNeedAccumulate() {
-        Collection<DataNodeRuleAttribute> ruleAttributes = 
queryContext.getUsedDatabase().getRuleMetaData().getAttributes(DataNodeRuleAttribute.class);
+        Collection<DataNodeRuleAttribute> ruleAttributes = 
database.getRuleMetaData().getAttributes(DataNodeRuleAttribute.class);
         Collection<String> tableNames = queryContext.getSqlStatementContext() 
instanceof TableAvailable
                 ? ((TableAvailable) 
queryContext.getSqlStatementContext()).getTablesContext().getTableNames()
                 : Collections.emptyList();
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
index 1ae06a0f7bc..1d0d8bea79a 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
@@ -58,13 +58,14 @@ class DatabaseConnectorFactoryTest {
     @Test
     void assertNewDatabaseConnectorWithoutParameter() {
         ProxyDatabaseConnectionManager databaseConnectionManager = 
mock(ProxyDatabaseConnectionManager.class, RETURNS_DEEP_STUBS);
-        
when(databaseConnectionManager.getConnectionSession().getUsedDatabaseName()).thenReturn("foo_db");
         
when(databaseConnectionManager.getConnectionSession().getCurrentDatabaseName()).thenReturn("foo_db");
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType);
-        QueryContext queryContext =
-                new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class));
         ShardingSphereDatabase database = mockDatabase();
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        
when(metaData.containsDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(true);
+        
when(metaData.getDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(database);
+        QueryContext queryContext = new QueryContext(sqlStatementContext, 
"schemaName", Collections.emptyList(), new HintValueContext(), 
mockConnectionContext(), metaData);
         ContextManager contextManager = mockContextManager(database);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
         DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(queryContext, 
databaseConnectionManager, false);
@@ -80,18 +81,17 @@ class DatabaseConnectorFactoryTest {
     @Test
     void assertNewDatabaseConnectorWithParameters() {
         ProxyDatabaseConnectionManager databaseConnectionManager = 
mock(ProxyDatabaseConnectionManager.class, RETURNS_DEEP_STUBS);
-        
when(databaseConnectionManager.getConnectionSession().getUsedDatabaseName()).thenReturn("foo_db");
         
when(databaseConnectionManager.getConnectionSession().getCurrentDatabaseName()).thenReturn("foo_db");
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType);
         ShardingSphereDatabase database = mockDatabase();
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        
when(metaData.containsDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(true);
+        
when(metaData.getDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(database);
         ContextManager contextManager = mockContextManager(database);
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        assertThat(
-                DatabaseConnectorFactory.getInstance().newInstance(
-                        new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class)),
-                        databaseConnectionManager,
-                        false),
+        assertThat(DatabaseConnectorFactory.getInstance().newInstance(
+                new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
metaData), databaseConnectionManager, false),
                 instanceOf(DatabaseConnector.class));
     }
     
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
index 10e9bbc4f12..7d438a1c384 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
@@ -64,7 +64,9 @@ import org.mockito.Answers;
 import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.internal.configuration.plugins.Plugins;
+import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.plugins.MemberAccessor;
+import org.mockito.quality.Strictness;
 
 import java.lang.reflect.Field;
 import java.sql.ResultSet;
@@ -94,6 +96,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 @ExtendWith(AutoMockExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
 @StaticMockSettings({ProxyContext.class, SystemSchemaUtils.class})
 class DatabaseConnectorTest {
     
@@ -111,7 +114,6 @@ class DatabaseConnectorTest {
     
     @BeforeEach
     void setUp() {
-        
when(databaseConnectionManager.getConnectionSession().getUsedDatabaseName()).thenReturn("foo_db");
         
when(databaseConnectionManager.getConnectionSession().getCurrentDatabaseName()).thenReturn("foo_db");
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
@@ -145,9 +147,7 @@ class DatabaseConnectorTest {
     void assertBinaryProtocolQueryHeader() throws SQLException, 
NoSuchFieldException, IllegalAccessException {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         
when(sqlStatementContext.getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(
-                new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class)),
-                databaseConnectionManager, true);
+        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(createQueryContext(sqlStatementContext),
 databaseConnectionManager, true);
         assertNotNull(engine);
         assertThat(engine, instanceOf(DatabaseConnector.class));
         Field queryHeadersField = 
DatabaseConnector.class.getDeclaredField("queryHeaders");
@@ -177,10 +177,14 @@ class DatabaseConnectorTest {
         }
     }
     
-    private ConnectionContext mockConnectionContext() {
-        ConnectionContext result = mock(ConnectionContext.class);
-        
when(result.getCurrentDatabaseName()).thenReturn(Optional.of(DefaultDatabase.LOGIC_NAME));
-        return result;
+    private QueryContext createQueryContext(final SQLStatementContext 
sqlStatementContext) {
+        ConnectionContext connectionContext = mock(ConnectionContext.class);
+        
when(connectionContext.getCurrentDatabaseName()).thenReturn(Optional.of(DefaultDatabase.LOGIC_NAME));
+        ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+        
when(metaData.containsDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(true);
+        ShardingSphereDatabase database = mockDatabases().get("foo_db");
+        
when(metaData.getDatabase(DefaultDatabase.LOGIC_NAME)).thenReturn(database);
+        return new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), connectionContext, metaData);
     }
     
     private ShardingSphereDatabase createDatabaseMetaData() {
@@ -203,8 +207,7 @@ class DatabaseConnectorTest {
     void assertAddStatementCorrectly() {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         
when(sqlStatementContext.getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(
-                new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class)),
+        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(createQueryContext(sqlStatementContext),
                 databaseConnectionManager, false);
         engine.add(statement);
         Collection<?> actual = getField(engine, "cachedStatements");
@@ -216,8 +219,7 @@ class DatabaseConnectorTest {
     void assertAddResultSetCorrectly() {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         
when(sqlStatementContext.getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(
-                new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class)),
+        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(createQueryContext(sqlStatementContext),
                 databaseConnectionManager, false);
         engine.add(resultSet);
         Collection<?> actual = getField(engine, "cachedResultSets");
@@ -229,8 +231,7 @@ class DatabaseConnectorTest {
     void assertCloseCorrectly() throws SQLException {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         
when(sqlStatementContext.getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(
-                new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class)),
+        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(createQueryContext(sqlStatementContext),
                 databaseConnectionManager, false);
         Collection<ResultSet> cachedResultSets = getField(engine, 
"cachedResultSets");
         cachedResultSets.add(resultSet);
@@ -248,8 +249,7 @@ class DatabaseConnectorTest {
     void assertCloseResultSetsWithExceptionThrown() throws SQLException {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         
when(sqlStatementContext.getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(
-                new QueryContext(sqlStatementContext, "schemaName", 
Collections.emptyList(), new HintValueContext(), mockConnectionContext(), 
mock(ShardingSphereMetaData.class)),
+        DatabaseConnector engine = 
DatabaseConnectorFactory.getInstance().newInstance(createQueryContext(sqlStatementContext),
                 databaseConnectionManager, false);
         Collection<ResultSet> cachedResultSets = getField(engine, 
"cachedResultSets");
         SQLException sqlExceptionByResultSet = new SQLException("ResultSet");

Reply via email to