This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang 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 890e288656c Optimize ShowTableMetaDataExecutor, avoid databaseName 
being null (#27617)
890e288656c is described below

commit 890e288656c9b2a09320cf127e5007f757cb9391
Author: Raigor <[email protected]>
AuthorDate: Wed Aug 2 10:14:15 2023 +0800

    Optimize ShowTableMetaDataExecutor, avoid databaseName being null (#27617)
    
    * Fixes #27616, optimize ShowTableMetaDataExecutor
    
    * Fix QueryableRALBackendHandlerTest
---
 .../ral/queryable/ShowTableMetaDataExecutor.java   | 33 ++++----------
 .../ral/QueryableRALBackendHandlerTest.java        | 25 +++++------
 .../queryable/ShowTableMetaDataExecutorTest.java   | 50 ++++++++--------------
 3 files changed, 37 insertions(+), 71 deletions(-)

diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutor.java
index f019c80dcd2..03aa8a1dc04 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutor.java
@@ -17,18 +17,13 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 
-import com.google.common.base.Strings;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
+import 
org.apache.shardingsphere.distsql.handler.ral.query.DatabaseRequiredQueryableRALExecutor;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowTableMetaDataStatement;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.executor.ConnectionSessionRequiredQueryableRALExecutor;
-import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -38,31 +33,19 @@ import java.util.stream.Collectors;
 /**
  * Show table meta data handler.
  */
-public final class ShowTableMetaDataExecutor implements 
ConnectionSessionRequiredQueryableRALExecutor<ShowTableMetaDataStatement> {
+public final class ShowTableMetaDataExecutor implements 
DatabaseRequiredQueryableRALExecutor<ShowTableMetaDataStatement> {
     
     @Override
     public Collection<String> getColumnNames() {
-        return Arrays.asList("schema_name", "table_name", "type", "name");
+        return Arrays.asList("database_name", "table_name", "type", "name");
     }
     
     @Override
-    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereMetaData metaData, final ConnectionSession connectionSession, 
final ShowTableMetaDataStatement sqlStatement) {
-        String databaseName = getDatabaseName(connectionSession, sqlStatement);
-        String defaultSchema = new 
DatabaseTypeRegistry(connectionSession.getProtocolType()).getDefaultSchemaName(connectionSession.getDatabaseName());
-        ShardingSphereSchema schema = 
ProxyContext.getInstance().getDatabase(databaseName).getSchema(defaultSchema);
+    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ShowTableMetaDataStatement sqlStatement) 
{
+        String defaultSchema = new 
DatabaseTypeRegistry(database.getProtocolType()).getDefaultSchemaName(database.getName());
+        ShardingSphereSchema schema = database.getSchema(defaultSchema);
         return schema.getAllTableNames().stream().filter(each -> 
sqlStatement.getTableNames().contains(each))
-                .map(each -> buildTableRows(databaseName, schema, 
each)).flatMap(Collection::stream).collect(Collectors.toList());
-    }
-    
-    private String getDatabaseName(final ConnectionSession connectionSession, 
final ShowTableMetaDataStatement sqlStatement) {
-        String result = sqlStatement.getDatabase().isPresent() ? 
sqlStatement.getDatabase().get().getIdentifier().getValue() : 
connectionSession.getDatabaseName();
-        if (Strings.isNullOrEmpty(result)) {
-            throw new NoDatabaseSelectedException();
-        }
-        if (!ProxyContext.getInstance().databaseExists(result)) {
-            throw new UnknownDatabaseException(result);
-        }
-        return result;
+                .map(each -> buildTableRows(database.getName(), schema, 
each)).flatMap(Collection::stream).collect(Collectors.toList());
     }
     
     private Collection<LocalDataQueryResultRow> buildTableRows(final String 
databaseName, final ShardingSphereSchema schema, final String tableName) {
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/QueryableRALBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/QueryableRALBackendHandlerTest.java
index 846ea96a2f9..7a812d29de3 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/QueryableRALBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/QueryableRALBackendHandlerTest.java
@@ -17,12 +17,12 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral;
 
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.QueryableRALStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportDatabaseConfigurationStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowTableMetaDataStatement;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -32,9 +32,9 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
@@ -84,18 +84,13 @@ class QueryableRALBackendHandlerTest {
     
     @Test
     void assertExecute() {
-        ContextManager contextManager = mock(ContextManager.class, 
RETURNS_DEEP_STUBS);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        when(database.getSchema("db_name")).thenReturn(new 
ShardingSphereSchema(createTableMap(), Collections.emptyMap()));
-        
when(contextManager.getMetaDataContexts().getMetaData().getDatabases()).thenReturn(Collections.singletonMap("db_name",
 database));
-        
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("db_name")).thenReturn(database);
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().databaseExists("db_name")).thenReturn(true);
-        
when(ProxyContext.getInstance().getDatabase("db_name")).thenReturn(database);
-        ConnectionSession connectionSession = mock(ConnectionSession.class, 
RETURNS_DEEP_STUBS);
-        when(connectionSession.getDatabaseName()).thenReturn("db_name");
-        
when(connectionSession.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
-        assertDoesNotThrow(() -> new 
QueryableRALBackendHandler<>(createSqlStatement(), 
connectionSession).execute());
+        when(database.getName()).thenReturn("foo_db");
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
+        when(database.getSchema("foo_db")).thenReturn(new 
ShardingSphereSchema(createTableMap(), Collections.emptyMap()));
+        
when(ProxyContext.getInstance().databaseExists("foo_db")).thenReturn(true);
+        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
+        assertDoesNotThrow(() -> new 
QueryableRALBackendHandler<>(createSqlStatement(), 
mock(ConnectionSession.class)).execute());
     }
     
     private Map<String, ShardingSphereTable> createTableMap() {
@@ -107,6 +102,6 @@ class QueryableRALBackendHandlerTest {
     }
     
     private ShowTableMetaDataStatement createSqlStatement() {
-        return new 
ShowTableMetaDataStatement(Collections.singleton("t_order"), new 
DatabaseSegment(0, 0, new IdentifierValue("db_name")));
+        return new 
ShowTableMetaDataStatement(Collections.singleton("t_order"), new 
DatabaseSegment(0, 0, new IdentifierValue("foo_db")));
     }
 }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutorTest.java
index c3659e455b0..d6ec7cc8289 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowTableMetaDataExecutorTest.java
@@ -20,16 +20,13 @@ package 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowTableMetaDataStatement;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
@@ -54,17 +51,21 @@ import static org.mockito.Mockito.when;
 class ShowTableMetaDataExecutorTest {
     
     @Test
-    void assertExecute() {
-        ConnectionSession connectionSession = mock(ConnectionSession.class, 
RETURNS_DEEP_STUBS);
-        when(connectionSession.getDatabaseName()).thenReturn("foo_db");
-        
when(connectionSession.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
+    void assertGetColumnNames() {
         ShowTableMetaDataExecutor executor = new ShowTableMetaDataExecutor();
-        ContextManager contextManager = mockContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().databaseExists("foo_db")).thenReturn(true);
-        ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db");
-        
when(ProxyContext.getInstance().getDatabase("foo_db")).thenReturn(database);
-        Collection<LocalDataQueryResultRow> actual = 
executor.getRows(mock(ShardingSphereMetaData.class), connectionSession, 
createSqlStatement());
+        Collection<String> columns = executor.getColumnNames();
+        assertThat(columns.size(), is(4));
+        Iterator<String> iterator = columns.iterator();
+        assertThat(iterator.next(), is("database_name"));
+        assertThat(iterator.next(), is("table_name"));
+        assertThat(iterator.next(), is("type"));
+        assertThat(iterator.next(), is("name"));
+    }
+    
+    @Test
+    void assertExecute() {
+        ShardingSphereDatabase database = mockDatabase();
+        Collection<LocalDataQueryResultRow> actual = new 
ShowTableMetaDataExecutor().getRows(database, createSqlStatement());
         assertThat(actual.size(), is(2));
         Iterator<LocalDataQueryResultRow> iterator = actual.iterator();
         LocalDataQueryResultRow row = iterator.next();
@@ -79,27 +80,14 @@ class ShowTableMetaDataExecutorTest {
         assertThat(row.getCell(4), is("primary"));
     }
     
-    private ContextManager mockContextManager() {
-        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
-        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        when(database.getSchema("foo_db")).thenReturn(new 
ShardingSphereSchema(createTableMap(), Collections.emptyMap()));
-        
when(result.getMetaDataContexts().getMetaData().getDatabases()).thenReturn(Collections.singletonMap("foo_db",
 database));
-        
when(result.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
+    private ShardingSphereDatabase mockDatabase() {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
+        when(result.getName()).thenReturn("foo_db");
+        when(result.getSchema("foo_db")).thenReturn(new 
ShardingSphereSchema(createTableMap(), Collections.emptyMap()));
         return result;
     }
     
-    @Test
-    void assertGetColumnNames() {
-        ShowTableMetaDataExecutor executor = new ShowTableMetaDataExecutor();
-        Collection<String> columns = executor.getColumnNames();
-        assertThat(columns.size(), is(4));
-        Iterator<String> iterator = columns.iterator();
-        assertThat(iterator.next(), is("schema_name"));
-        assertThat(iterator.next(), is("table_name"));
-        assertThat(iterator.next(), is("type"));
-        assertThat(iterator.next(), is("name"));
-    }
-    
     private Map<String, ShardingSphereTable> createTableMap() {
         Map<String, ShardingSphereTable> result = new HashMap<>();
         Collection<ShardingSphereColumn> columns = 
Collections.singletonList(new ShardingSphereColumn("order_id", 0, false, false, 
false, true, false));

Reply via email to