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());
}