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 dcb4cdf789b Add DatabaseRuleDefinitionExecutorFactory (#36127)
dcb4cdf789b is described below

commit dcb4cdf789b2eb94b386ddf6abce597f840d3a3e
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jul 31 11:36:04 2025 +0800

    Add DatabaseRuleDefinitionExecutorFactory (#36127)
    
    * Add DatabaseRuleDefinitionExecutorFactory
    
    * Add DatabaseRuleDefinitionExecutorFactory
    
    * Add DatabaseRuleDefinitionExecutorFactory
---
 .../engine/update/DistSQLUpdateExecuteEngine.java  |  3 +-
 .../DatabaseRuleDefinitionExecuteEngine.java       |  6 +--
 .../DatabaseRuleDefinitionExecutorFactory.java     | 55 ++++++++++++++++++++++
 3 files changed, 59 insertions(+), 5 deletions(-)

diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/DistSQLUpdateExecuteEngine.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/DistSQLUpdateExecuteEngine.java
index c4755e126fd..e1020b77a88 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/DistSQLUpdateExecuteEngine.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/DistSQLUpdateExecuteEngine.java
@@ -21,6 +21,7 @@ import 
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorAwareSette
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.engine.database.DatabaseRuleDefinitionExecuteEngine;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.engine.global.GlobalRuleDefinitionExecuteEngine;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleDefinitionExecutor;
+import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database.DatabaseRuleDefinitionExecutorFactory;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.global.GlobalRuleDefinitionExecutor;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorRequiredChecker;
 import org.apache.shardingsphere.distsql.handler.util.DatabaseNameUtils;
@@ -67,7 +68,7 @@ public final class DistSQLUpdateExecuteEngine {
     
     @SuppressWarnings("rawtypes")
     private void executeRuleDefinitionUpdate() throws SQLException {
-        Optional<DatabaseRuleDefinitionExecutor> databaseExecutor = 
TypedSPILoader.findService(DatabaseRuleDefinitionExecutor.class, 
sqlStatement.getClass());
+        Optional<DatabaseRuleDefinitionExecutor> databaseExecutor = 
DatabaseRuleDefinitionExecutorFactory.findInstance(sqlStatement, 
contextManager.getDatabase(databaseName));
         if (databaseExecutor.isPresent()) {
             new 
DatabaseRuleDefinitionExecuteEngine((DatabaseRuleDefinitionStatement) 
sqlStatement, contextManager, databaseName, 
databaseExecutor.get()).executeUpdate();
         } else {
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/DatabaseRuleDefinitionExecuteEngine.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/DatabaseRuleDefinitionExecuteEngine.java
index bee0d128b2e..91dc8da00a4 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/DatabaseRuleDefinitionExecuteEngine.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/DatabaseRuleDefinitionExecuteEngine.java
@@ -50,12 +50,10 @@ public final class DatabaseRuleDefinitionExecuteEngine {
      */
     @SuppressWarnings("unchecked")
     public void executeUpdate() throws SQLException {
-        executor.setDatabase(contextManager.getDatabase(databaseName));
-        Optional<ShardingSphereRule> rule = 
contextManager.getDatabase(databaseName).getRuleMetaData().findSingleRule(executor.getRuleClass());
-        executor.setRule(rule.orElse(null));
         checkBeforeUpdate();
-        RuleConfiguration currentRuleConfig = 
rule.map(ShardingSphereRule::getConfiguration).orElse(null);
+        Optional<ShardingSphereRule> rule = 
contextManager.getDatabase(databaseName).getRuleMetaData().findSingleRule(executor.getRuleClass());
         if (getRefreshStatus(rule.isPresent())) {
+            RuleConfiguration currentRuleConfig = 
rule.map(ShardingSphereRule::getConfiguration).orElse(null);
             DatabaseRuleOperatorFactory.newInstance(contextManager, 
executor).operate(sqlStatement, contextManager.getDatabase(databaseName), 
currentRuleConfig);
         }
     }
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/spi/database/DatabaseRuleDefinitionExecutorFactory.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/spi/database/DatabaseRuleDefinitionExecutorFactory.java
new file mode 100644
index 00000000000..ec6b8abc1a2
--- /dev/null
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/spi/database/DatabaseRuleDefinitionExecutorFactory.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 
org.apache.shardingsphere.distsql.handler.engine.update.rdl.rule.spi.database;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.distsql.statement.DistSQLStatement;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+
+import java.util.Optional;
+
+/**
+ * Database rule definition executor factory.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class DatabaseRuleDefinitionExecutorFactory {
+    
+    /**
+     * Find instance.
+     *
+     * @param sqlStatement SQL statement
+     * @param database database
+     * @return found instance 
+     */
+    @SuppressWarnings("rawtypes")
+    public static Optional<DatabaseRuleDefinitionExecutor> findInstance(final 
DistSQLStatement sqlStatement, final ShardingSphereDatabase database) {
+        Optional<DatabaseRuleDefinitionExecutor> result = 
TypedSPILoader.findService(DatabaseRuleDefinitionExecutor.class, 
sqlStatement.getClass());
+        result.ifPresent(optional -> setAttributes(database, optional));
+        return result;
+    }
+    
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    private static void setAttributes(final ShardingSphereDatabase database, 
final DatabaseRuleDefinitionExecutor executor) {
+        executor.setDatabase(database);
+        Optional<ShardingSphereRule> rule = 
database.getRuleMetaData().findSingleRule(executor.getRuleClass());
+        executor.setRule(rule.orElse(null));
+    }
+}

Reply via email to