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 109569a14b6 Optimize RuleNotExistedException and 
StorageUnitNotExistedException. (#22603)
109569a14b6 is described below

commit 109569a14b68de4add2eb85eccb4011ebe48a9ea
Author: Raigor <[email protected]>
AuthorDate: Fri Dec 2 22:34:07 2022 +0800

    Optimize RuleNotExistedException and StorageUnitNotExistedException. 
(#22603)
---
 .../communication/DatabaseCommunicationEngine.java |  6 ++---
 .../backend/exception/RuleNotExistedException.java |  4 ++--
 ...on.java => StorageUnitNotExistedException.java} | 12 ++++++----
 .../executor/AbstractDatabaseMetadataExecutor.java |  4 ++--
 .../executor/UnicastResourceShowExecutor.java      | 11 ++++-----
 .../data/impl/UnicastDatabaseBackendHandler.java   | 27 ++++++++--------------
 .../executor/ShowShardingHintStatusExecutor.java   |  9 ++++----
 .../handler/distsql/rul/sql/PreviewHandler.java    |  5 ++--
 8 files changed, 35 insertions(+), 43 deletions(-)

diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
index 6b431d98794..d99e1b97844 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
@@ -30,7 +30,6 @@ import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementConte
 import org.apache.shardingsphere.infra.binder.type.CursorAvailable;
 import org.apache.shardingsphere.infra.context.kernel.KernelProcessor;
 import org.apache.shardingsphere.infra.context.refresher.MetaDataRefreshEngine;
-import 
org.apache.shardingsphere.infra.distsql.exception.resource.EmptyResourceException;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.update.UpdateResult;
@@ -44,6 +43,7 @@ import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRul
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.exception.RuleNotExistedException;
+import 
org.apache.shardingsphere.proxy.backend.exception.StorageUnitNotExistedException;
 import 
org.apache.shardingsphere.proxy.backend.handler.data.DatabaseBackendHandler;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
@@ -98,9 +98,9 @@ public abstract class DatabaseCommunicationEngine implements 
DatabaseBackendHand
     private void failedIfBackendNotReady(final ConnectionSession 
connectionSession, final SQLStatementContext<?> sqlStatementContext) {
         ShardingSphereDatabase database = 
ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName());
         boolean isSystemSchema = 
SystemSchemaUtil.containsSystemSchema(sqlStatementContext.getDatabaseType(), 
sqlStatementContext.getTablesContext().getSchemaNames(), database);
-        ShardingSpherePreconditions.checkState(isSystemSchema || 
database.containsDataSource(), () -> new 
EmptyResourceException(connectionSession.getDatabaseName()));
+        ShardingSpherePreconditions.checkState(isSystemSchema || 
database.containsDataSource(), () -> new 
StorageUnitNotExistedException(connectionSession.getDatabaseName()));
         if (!isSystemSchema && !database.isComplete()) {
-            throw new RuleNotExistedException();
+            throw new 
RuleNotExistedException(connectionSession.getDatabaseName());
         }
     }
     
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/RuleNotExistedException.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/RuleNotExistedException.java
index 866a38337c0..d414dd83612 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/RuleNotExistedException.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/RuleNotExistedException.java
@@ -27,7 +27,7 @@ public final class RuleNotExistedException extends 
MetaDataSQLException {
     
     private static final long serialVersionUID = -4150905802300104824L;
     
-    public RuleNotExistedException() {
-        super(XOpenSQLState.SYNTAX_ERROR, 10, "Rule does not exist.");
+    public RuleNotExistedException(final String databaseName) {
+        super(XOpenSQLState.SYNTAX_ERROR, 10, "There is no rule in database 
`%s`.", databaseName);
     }
 }
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/ResourceNotExistedException.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/StorageUnitNotExistedException.java
similarity index 71%
rename from 
proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/ResourceNotExistedException.java
rename to 
proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/StorageUnitNotExistedException.java
index 501b1a91f24..c4a238edab6 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/ResourceNotExistedException.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/exception/StorageUnitNotExistedException.java
@@ -21,13 +21,17 @@ import 
org.apache.shardingsphere.infra.exception.MetaDataSQLException;
 import 
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
 
 /**
- * Resource does not exist exception.
+ * Storage unit not existed exception.
  */
-public final class ResourceNotExistedException extends MetaDataSQLException {
+public final class StorageUnitNotExistedException extends MetaDataSQLException 
{
     
     private static final long serialVersionUID = 4146100333670404924L;
+
+    public StorageUnitNotExistedException() {
+        super(XOpenSQLState.SYNTAX_ERROR, 0, "There is no storage unit in any 
database.");
+    }
     
-    public ResourceNotExistedException() {
-        super(XOpenSQLState.SYNTAX_ERROR, 0, "Resource does not exist.");
+    public StorageUnitNotExistedException(final String databaseName) {
+        super(XOpenSQLState.SYNTAX_ERROR, 0, "There is no storage unit in 
database `%s`.", databaseName);
     }
 }
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetadataExecutor.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetadataExecutor.java
index 1e237b33ca9..61b8dd53df8 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetadataExecutor.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/AbstractDatabaseMetadataExecutor.java
@@ -32,7 +32,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphere
 import org.apache.shardingsphere.infra.metadata.user.Grantee;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import 
org.apache.shardingsphere.proxy.backend.exception.ResourceNotExistedException;
+import 
org.apache.shardingsphere.proxy.backend.exception.StorageUnitNotExistedException;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.FunctionWithException;
 
@@ -209,7 +209,7 @@ public abstract class AbstractDatabaseMetadataExecutor 
implements DatabaseAdminQ
         protected void getSourceData(final String databaseName, final 
FunctionWithException<ResultSet, SQLException> callback) throws SQLException {
             ShardingSphereResourceMetaData resourceMetaData = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData();
             Optional<Entry<String, DataSource>> dataSourceEntry = 
resourceMetaData.getDataSources().entrySet().stream().findFirst();
-            log.info("Actual SQL: {} ::: {}", 
dataSourceEntry.orElseThrow(ResourceNotExistedException::new).getKey(), sql);
+            log.info("Actual SQL: {} ::: {}", dataSourceEntry.orElseThrow(() 
-> new StorageUnitNotExistedException(databaseName)).getKey(), sql);
             try (
                     Connection connection = 
dataSourceEntry.get().getValue().getConnection();
                     PreparedStatement preparedStatement = 
connection.prepareStatement(sql);
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/mysql/executor/UnicastResourceShowExecutor.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/mysql/executor/UnicastResourceShowExecutor.java
index f5ce7611c65..9d73e5ed214 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/mysql/executor/UnicastResourceShowExecutor.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/admin/mysql/executor/UnicastResourceShowExecutor.java
@@ -31,10 +31,11 @@ import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.ra
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
+import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.JDBCDatabaseCommunicationEngine;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import 
org.apache.shardingsphere.proxy.backend.exception.RuleNotExistedException;
+import 
org.apache.shardingsphere.proxy.backend.exception.StorageUnitNotExistedException;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
@@ -74,9 +75,7 @@ public final class UnicastResourceShowExecutor implements 
DatabaseAdminQueryExec
     public void execute(final ConnectionSession connectionSession) throws 
SQLException {
         String originDatabase = connectionSession.getDatabaseName();
         String databaseName = null == originDatabase ? getFirstDatabaseName() 
: originDatabase;
-        if 
(!ProxyContext.getInstance().getDatabase(databaseName).containsDataSource()) {
-            throw new RuleNotExistedException();
-        }
+        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getDatabase(databaseName).containsDataSource(),
 () -> new StorageUnitNotExistedException(databaseName));
         try {
             connectionSession.setCurrentDatabase(databaseName);
             SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
@@ -97,9 +96,7 @@ public final class UnicastResourceShowExecutor implements 
DatabaseAdminQueryExec
             throw new NoDatabaseSelectedException();
         }
         Optional<String> result = databaseNames.stream().filter(each -> 
ProxyContext.getInstance().getDatabase(each).containsDataSource()).findFirst();
-        if (!result.isPresent()) {
-            throw new RuleNotExistedException();
-        }
+        ShardingSpherePreconditions.checkState(result.isPresent(), 
StorageUnitNotExistedException::new);
         return result.get();
     }
     
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
index 170d9acc1f7..a20583b79e1 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/data/impl/UnicastDatabaseBackendHandler.java
@@ -18,24 +18,25 @@
 package org.apache.shardingsphere.proxy.backend.handler.data.impl;
 
 import io.vertx.core.Future;
-import java.util.stream.Stream;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.authority.model.ShardingSpherePrivileges;
 import org.apache.shardingsphere.authority.rule.AuthorityRule;
+import 
org.apache.shardingsphere.dialect.exception.syntax.database.NoDatabaseSelectedException;
 import org.apache.shardingsphere.infra.binder.QueryContext;
+import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngine;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import 
org.apache.shardingsphere.dialect.exception.syntax.database.NoDatabaseSelectedException;
-import 
org.apache.shardingsphere.proxy.backend.exception.RuleNotExistedException;
+import 
org.apache.shardingsphere.proxy.backend.exception.StorageUnitNotExistedException;
+import 
org.apache.shardingsphere.proxy.backend.handler.data.DatabaseBackendHandler;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import 
org.apache.shardingsphere.proxy.backend.handler.data.DatabaseBackendHandler;
 
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Optional;
+import java.util.stream.Stream;
 
 /**
  * Database backend handler with unicast schema.
@@ -55,9 +56,7 @@ public final class UnicastDatabaseBackendHandler implements 
DatabaseBackendHandl
     public Future<ResponseHeader> executeFuture() {
         String originDatabase = connectionSession.getDatabaseName();
         String databaseName = null == originDatabase ? getFirstDatabaseName() 
: originDatabase;
-        if 
(!ProxyContext.getInstance().getDatabase(databaseName).containsDataSource()) {
-            throw new RuleNotExistedException();
-        }
+        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getDatabase(databaseName).containsDataSource(),
 () -> new StorageUnitNotExistedException(databaseName));
         connectionSession.setCurrentDatabase(databaseName);
         databaseCommunicationEngine = 
databaseCommunicationEngineFactory.newDatabaseCommunicationEngine(queryContext, 
connectionSession.getBackendConnection(), false);
         return databaseCommunicationEngine.executeFuture().eventually(unused 
-> {
@@ -70,9 +69,7 @@ public final class UnicastDatabaseBackendHandler implements 
DatabaseBackendHandl
     public ResponseHeader execute() throws SQLException {
         String originDatabase = connectionSession.getDefaultDatabaseName();
         String databaseName = null == originDatabase ? getFirstDatabaseName() 
: originDatabase;
-        if 
(!ProxyContext.getInstance().getDatabase(databaseName).containsDataSource()) {
-            throw new RuleNotExistedException();
-        }
+        
ShardingSpherePreconditions.checkState(ProxyContext.getInstance().getDatabase(databaseName).containsDataSource(),
 () -> new StorageUnitNotExistedException(databaseName));
         try {
             connectionSession.setCurrentDatabase(databaseName);
             databaseCommunicationEngine = 
databaseCommunicationEngineFactory.newDatabaseCommunicationEngine(queryContext, 
connectionSession.getBackendConnection(), false);
@@ -87,15 +84,11 @@ public final class UnicastDatabaseBackendHandler implements 
DatabaseBackendHandl
         if (databaseNames.isEmpty()) {
             throw new NoDatabaseSelectedException();
         }
-        AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(
-                AuthorityRule.class);
+        AuthorityRule authorityRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
         Optional<ShardingSpherePrivileges> privileges = 
authorityRule.findPrivileges(connectionSession.getGrantee());
         Stream<String> databaseStream = databaseNames.stream().filter(each -> 
ProxyContext.getInstance().getDatabase(each).containsDataSource());
-        Optional<String> result = privileges.isPresent() ? 
databaseStream.filter(each -> privileges.get().hasPrivileges(each)).findFirst()
-                : databaseStream.findFirst();
-        if (!result.isPresent()) {
-            throw new RuleNotExistedException();
-        }
+        Optional<String> result = privileges.map(optional -> 
databaseStream.filter(optional::hasPrivileges).findFirst()).orElseGet(databaseStream::findFirst);
+        ShardingSpherePreconditions.checkState(result.isPresent(), 
StorageUnitNotExistedException::new);
         return result.get();
     }
     
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/hint/executor/ShowShardingHintStatusExecutor.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/hint/executor/ShowShardingHintStatusExecutor.java
index 93ca3fa5a0f..cfe8c42e140 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/hint/executor/ShowShardingHintStatusExecutor.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/hint/executor/ShowShardingHintStatusExecutor.java
@@ -24,12 +24,13 @@ import 
org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataMergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.exception.RuleNotExistedException;
-import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
-import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.hint.enums.HintShardingType;
 import 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.hint.result.ShowShardingHintStatusResult;
+import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.sharding.distsql.parser.statement.hint.ShowShardingHintStatusStatement;
 
 import java.sql.Types;
@@ -63,9 +64,7 @@ public final class ShowShardingHintStatusExecutor extends 
AbstractHintQueryExecu
     protected MergedResult createMergedResult() {
         Map<String, ShowShardingHintStatusResult> results = new HashMap<>();
         ShardingSphereDatabase database = 
ProxyContext.getInstance().getDatabase(connectionSession.getDatabaseName());
-        if (!database.isComplete()) {
-            throw new RuleNotExistedException();
-        }
+        ShardingSpherePreconditions.checkState(database.isComplete(), () -> 
new RuleNotExistedException(connectionSession.getDatabaseName()));
         String schemaName = 
DatabaseTypeEngine.getDefaultSchemaName(connectionSession.getProtocolType(), 
connectionSession.getDatabaseName());
         Collection<String> tableNames = 
database.getSchema(schemaName).getAllTableNames();
         for (String each : tableNames) {
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
index adac401fcc1..010cd3b3602 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewHandler.java
@@ -50,6 +50,7 @@ import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryRes
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
+import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -106,9 +107,7 @@ public final class PreviewHandler extends 
SQLRULBackendHandler<PreviewStatement>
             setUpCursorDefinition(sqlStatementContext);
         }
         ShardingSphereDatabase database = 
ProxyContext.getInstance().getDatabase(getConnectionSession().getDatabaseName());
-        if (!database.isComplete()) {
-            throw new RuleNotExistedException();
-        }
+        ShardingSpherePreconditions.checkState(database.isComplete(), () -> 
new RuleNotExistedException(getConnectionSession().getDatabaseName()));
         ConfigurationProperties props = 
metaDataContexts.getMetaData().getProps();
         SQLFederationDeciderContext deciderContext = decide(queryContext, 
props, 
metaDataContexts.getMetaData().getDatabase(getConnectionSession().getDatabaseName()));
         Collection<ExecutionUnit> executionUnits = 
deciderContext.isUseSQLFederation() ? getFederationExecutionUnits(queryContext, 
databaseName, metaDataContexts)

Reply via email to