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