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 01027da9728 Add RuleItemChangedBuildExecutor (#34569)
01027da9728 is described below

commit 01027da9728621483b557a6ddb6f4def21c96ac9
Author: Liang Zhang <zhangli...@apache.org>
AuthorDate: Thu Feb 6 16:08:29 2025 +0800

    Add RuleItemChangedBuildExecutor (#34569)
    
    * Add RuleItemChangedBuildExecutor
    
    * Add RuleItemChangedBuildExecutor
    
    * Add RuleItemChangedBuildExecutor
    
    * Add RuleItemChangedBuildExecutor
---
 .../standalone/changed/RuleItemChangedBuilder.java | 57 ++--------------------
 .../executor/RuleItemChangedBuildExecutor.java     | 42 ++++++++++++++++
 .../type/RuleItemAlteredBuildExecutor.java         | 51 +++++++++++++++++++
 .../type/RuleItemDroppedBuildExecutor.java         | 51 +++++++++++++++++++
 .../StandaloneMetaDataManagerPersistService.java   | 20 ++++----
 5 files changed, 158 insertions(+), 63 deletions(-)

diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/RuleItemChangedBuilder.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/RuleItemChangedBuilder.java
index 1ab454f16ea..f8c0c0737ad 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/RuleItemChangedBuilder.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/RuleItemChangedBuilder.java
@@ -18,18 +18,10 @@
 package org.apache.shardingsphere.mode.manager.standalone.changed;
 
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
-import org.apache.shardingsphere.mode.node.path.rule.RuleNodePath;
-import 
org.apache.shardingsphere.mode.node.path.rule.item.NamedRuleItemNodePath;
-import 
org.apache.shardingsphere.mode.node.path.rule.item.UniqueRuleItemNodePath;
+import 
org.apache.shardingsphere.mode.manager.standalone.changed.executor.RuleItemChangedBuildExecutor;
 import org.apache.shardingsphere.mode.node.spi.RuleNodePathProvider;
 import org.apache.shardingsphere.mode.spi.rule.item.RuleChangedItem;
-import org.apache.shardingsphere.mode.spi.rule.item.alter.AlterNamedRuleItem;
-import org.apache.shardingsphere.mode.spi.rule.item.alter.AlterUniqueRuleItem;
-import org.apache.shardingsphere.mode.spi.rule.item.drop.DropNamedRuleItem;
-import org.apache.shardingsphere.mode.spi.rule.item.drop.DropUniqueRuleItem;
 
-import java.util.Map.Entry;
 import java.util.Optional;
 
 /**
@@ -43,59 +35,20 @@ public final class RuleItemChangedBuilder {
      * @param databaseName database name
      * @param activeVersionKey active version key
      * @param activeVersion active version
-     * @param changedType data changed type
+     * @param executor rule item changed build executor
+     * @param <T> type of rule changed item
      * @return built rule item
      */
-    public Optional<RuleChangedItem> build(final String databaseName, final 
String activeVersionKey, final int activeVersion, final Type changedType) {
+    public <T extends RuleChangedItem> Optional<T> build(final String 
databaseName, final String activeVersionKey, final int activeVersion, final 
RuleItemChangedBuildExecutor<T> executor) {
         for (RuleNodePathProvider each : 
ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)) {
             if 
(!each.getRuleNodePath().getRoot().isValidatedPath(activeVersionKey)) {
                 continue;
             }
-            Optional<RuleChangedItem> result = build(databaseName, 
activeVersionKey, activeVersion, changedType, each);
+            Optional<T> result = executor.build(each.getRuleNodePath(), 
databaseName, activeVersionKey, activeVersion);
             if (result.isPresent()) {
                 return result;
             }
         }
         return Optional.empty();
     }
-    
-    private Optional<RuleChangedItem> build(final String databaseName, final 
String activeVersionKey, final int activeVersion, final Type changedType, final 
RuleNodePathProvider pathProvider) {
-        if (Type.UPDATED == changedType) {
-            return buildAlterItem(pathProvider.getRuleNodePath(), 
databaseName, activeVersionKey, activeVersion);
-        }
-        if (Type.DELETED == changedType) {
-            return buildDropItem(pathProvider.getRuleNodePath(), databaseName, 
activeVersionKey);
-        }
-        return Optional.empty();
-    }
-    
-    private Optional<RuleChangedItem> buildAlterItem(final RuleNodePath 
ruleNodePath, final String databaseName, final String activeVersionKey, final 
int activeVersion) {
-        for (Entry<String, NamedRuleItemNodePath> entry : 
ruleNodePath.getNamedItems().entrySet()) {
-            Optional<String> itemName = 
entry.getValue().getNameByActiveVersion(activeVersionKey);
-            if (itemName.isPresent()) {
-                return Optional.of(new AlterNamedRuleItem(databaseName, 
itemName.get(), activeVersionKey, activeVersion, 
ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
-            }
-        }
-        for (Entry<String, UniqueRuleItemNodePath> entry : 
ruleNodePath.getUniqueItems().entrySet()) {
-            if (entry.getValue().isActiveVersionPath(activeVersionKey)) {
-                return Optional.of(new AlterUniqueRuleItem(databaseName, 
activeVersionKey, activeVersion, ruleNodePath.getRoot().getRuleType() + "." + 
entry.getKey()));
-            }
-        }
-        return Optional.empty();
-    }
-    
-    private Optional<RuleChangedItem> buildDropItem(final RuleNodePath 
ruleNodePath, final String databaseName, final String activeVersionKey) {
-        for (Entry<String, NamedRuleItemNodePath> entry : 
ruleNodePath.getNamedItems().entrySet()) {
-            Optional<String> itemName = 
entry.getValue().getNameByItemPath(activeVersionKey);
-            if (itemName.isPresent()) {
-                return Optional.of(new DropNamedRuleItem(databaseName, 
itemName.get(), ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
-            }
-        }
-        for (Entry<String, UniqueRuleItemNodePath> entry : 
ruleNodePath.getUniqueItems().entrySet()) {
-            if (entry.getValue().isActiveVersionPath(activeVersionKey)) {
-                return Optional.of(new DropUniqueRuleItem(databaseName, 
ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
-            }
-        }
-        return Optional.empty();
-    }
 }
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/RuleItemChangedBuildExecutor.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/RuleItemChangedBuildExecutor.java
new file mode 100644
index 00000000000..4de7db07c07
--- /dev/null
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/RuleItemChangedBuildExecutor.java
@@ -0,0 +1,42 @@
+/*
+ * 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.mode.manager.standalone.changed.executor;
+
+import org.apache.shardingsphere.mode.node.path.rule.RuleNodePath;
+import org.apache.shardingsphere.mode.spi.rule.item.RuleChangedItem;
+
+import java.util.Optional;
+
+/**
+ * Rule item changed build executor.
+ * 
+ * @param <T> type of rule changed item
+ */
+public interface RuleItemChangedBuildExecutor<T extends RuleChangedItem> {
+    
+    /**
+     * Build rule item.
+     *
+     * @param ruleNodePath rule node path
+     * @param databaseName database name
+     * @param activeVersionKey active version key
+     * @param activeVersion active version
+     * @return built rule item
+     */
+    Optional<T> build(RuleNodePath ruleNodePath, String databaseName, String 
activeVersionKey, int activeVersion);
+}
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/type/RuleItemAlteredBuildExecutor.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/type/RuleItemAlteredBuildExecutor.java
new file mode 100644
index 00000000000..6ddec44be84
--- /dev/null
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/type/RuleItemAlteredBuildExecutor.java
@@ -0,0 +1,51 @@
+/*
+ * 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.mode.manager.standalone.changed.executor.type;
+
+import 
org.apache.shardingsphere.mode.manager.standalone.changed.executor.RuleItemChangedBuildExecutor;
+import org.apache.shardingsphere.mode.node.path.rule.RuleNodePath;
+import 
org.apache.shardingsphere.mode.node.path.rule.item.NamedRuleItemNodePath;
+import 
org.apache.shardingsphere.mode.node.path.rule.item.UniqueRuleItemNodePath;
+import org.apache.shardingsphere.mode.spi.rule.item.alter.AlterNamedRuleItem;
+import org.apache.shardingsphere.mode.spi.rule.item.alter.AlterRuleItem;
+import org.apache.shardingsphere.mode.spi.rule.item.alter.AlterUniqueRuleItem;
+
+import java.util.Map.Entry;
+import java.util.Optional;
+
+/**
+ * Rule item altered build executor.
+ */
+public final class RuleItemAlteredBuildExecutor implements 
RuleItemChangedBuildExecutor<AlterRuleItem> {
+    
+    @Override
+    public Optional<AlterRuleItem> build(final RuleNodePath ruleNodePath, 
final String databaseName, final String activeVersionKey, final int 
activeVersion) {
+        for (Entry<String, NamedRuleItemNodePath> entry : 
ruleNodePath.getNamedItems().entrySet()) {
+            Optional<String> itemName = 
entry.getValue().getNameByActiveVersion(activeVersionKey);
+            if (itemName.isPresent()) {
+                return Optional.of(new AlterNamedRuleItem(databaseName, 
itemName.get(), activeVersionKey, activeVersion, 
ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
+            }
+        }
+        for (Entry<String, UniqueRuleItemNodePath> entry : 
ruleNodePath.getUniqueItems().entrySet()) {
+            if (entry.getValue().isActiveVersionPath(activeVersionKey)) {
+                return Optional.of(new AlterUniqueRuleItem(databaseName, 
activeVersionKey, activeVersion, ruleNodePath.getRoot().getRuleType() + "." + 
entry.getKey()));
+            }
+        }
+        return Optional.empty();
+    }
+}
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/type/RuleItemDroppedBuildExecutor.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/type/RuleItemDroppedBuildExecutor.java
new file mode 100644
index 00000000000..8b75752e74d
--- /dev/null
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/changed/executor/type/RuleItemDroppedBuildExecutor.java
@@ -0,0 +1,51 @@
+/*
+ * 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.mode.manager.standalone.changed.executor.type;
+
+import 
org.apache.shardingsphere.mode.manager.standalone.changed.executor.RuleItemChangedBuildExecutor;
+import org.apache.shardingsphere.mode.node.path.rule.RuleNodePath;
+import 
org.apache.shardingsphere.mode.node.path.rule.item.NamedRuleItemNodePath;
+import 
org.apache.shardingsphere.mode.node.path.rule.item.UniqueRuleItemNodePath;
+import org.apache.shardingsphere.mode.spi.rule.item.drop.DropNamedRuleItem;
+import org.apache.shardingsphere.mode.spi.rule.item.drop.DropRuleItem;
+import org.apache.shardingsphere.mode.spi.rule.item.drop.DropUniqueRuleItem;
+
+import java.util.Map.Entry;
+import java.util.Optional;
+
+/**
+ * Rule item dropped build executor.
+ */
+public final class RuleItemDroppedBuildExecutor implements 
RuleItemChangedBuildExecutor<DropRuleItem> {
+    
+    @Override
+    public Optional<DropRuleItem> build(final RuleNodePath ruleNodePath, final 
String databaseName, final String activeVersionKey, final int activeVersion) {
+        for (Entry<String, NamedRuleItemNodePath> entry : 
ruleNodePath.getNamedItems().entrySet()) {
+            Optional<String> itemName = 
entry.getValue().getNameByItemPath(activeVersionKey);
+            if (itemName.isPresent()) {
+                return Optional.of(new DropNamedRuleItem(databaseName, 
itemName.get(), ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
+            }
+        }
+        for (Entry<String, UniqueRuleItemNodePath> entry : 
ruleNodePath.getUniqueItems().entrySet()) {
+            if (entry.getValue().isActiveVersionPath(activeVersionKey)) {
+                return Optional.of(new DropUniqueRuleItem(databaseName, 
ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
+            }
+        }
+        return Optional.empty();
+    }
+}
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
index 9e4230e840f..a984bc3b8cd 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/persist/service/StandaloneMetaDataManagerPersistService.java
@@ -30,17 +30,17 @@ import 
org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
 import 
org.apache.shardingsphere.infra.rule.scope.GlobalRule.GlobalRuleChangedType;
 import 
org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache;
-import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
 import 
org.apache.shardingsphere.mode.manager.standalone.changed.RuleItemChangedBuilder;
-import org.apache.shardingsphere.mode.metadata.manager.MetaDataContextManager;
+import 
org.apache.shardingsphere.mode.manager.standalone.changed.executor.type.RuleItemAlteredBuildExecutor;
+import 
org.apache.shardingsphere.mode.manager.standalone.changed.executor.type.RuleItemDroppedBuildExecutor;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.manager.MetaDataContextManager;
 import 
org.apache.shardingsphere.mode.metadata.manager.resource.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistFacade;
 import 
org.apache.shardingsphere.mode.metadata.persist.config.database.DataSourceUnitPersistService;
 import 
org.apache.shardingsphere.mode.metadata.persist.metadata.DatabaseMetaDataPersistFacade;
 import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
-import org.apache.shardingsphere.mode.spi.rule.item.RuleChangedItem;
 import org.apache.shardingsphere.mode.spi.rule.item.alter.AlterRuleItem;
 import org.apache.shardingsphere.mode.spi.rule.item.drop.DropRuleItem;
 import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
@@ -212,10 +212,9 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
                 
.persist(metaDataContextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 Collections.singleton(toBeAlteredRuleConfig));
         
metaDataPersistFacade.getMetaDataVersionService().switchActiveVersion(metaDataVersions);
         for (MetaDataVersion each : metaDataVersions) {
-            // TODO double check here, when ruleItemEvent not existed or not 
AlterRuleItemEvent @haoran
-            Optional<RuleChangedItem> ruleItemChanged = 
ruleItemChangedBuilder.build(databaseName, each.getActiveVersionNodePath(), 
each.getNextActiveVersion(), Type.UPDATED);
-            if (ruleItemChanged.isPresent() && ruleItemChanged.get() 
instanceof AlterRuleItem) {
-                
metaDataContextManager.getDatabaseRuleItemManager().alter((AlterRuleItem) 
ruleItemChanged.get());
+            Optional<AlterRuleItem> alterRuleItem = 
ruleItemChangedBuilder.build(databaseName, each.getActiveVersionNodePath(), 
each.getNextActiveVersion(), new RuleItemAlteredBuildExecutor());
+            if (alterRuleItem.isPresent()) {
+                
metaDataContextManager.getDatabaseRuleItemManager().alter(alterRuleItem.get());
             }
         }
         clearServiceCache();
@@ -228,10 +227,9 @@ public final class StandaloneMetaDataManagerPersistService 
implements MetaDataMa
         }
         Collection<MetaDataVersion> metaDataVersions = 
metaDataPersistFacade.getDatabaseRuleService().delete(databaseName, 
Collections.singleton(toBeRemovedRuleConfig));
         for (MetaDataVersion each : metaDataVersions) {
-            Optional<RuleChangedItem> ruleItemChanged = 
ruleItemChangedBuilder.build(databaseName, each.getActiveVersionNodePath(), 
each.getNextActiveVersion(), Type.DELETED);
-            // TODO double check here, when ruleItemEvent not existed or not 
AlterRuleItemEvent @haoran
-            if (ruleItemChanged.isPresent() && ruleItemChanged.get() 
instanceof DropRuleItem) {
-                
metaDataContextManager.getDatabaseRuleItemManager().drop((DropRuleItem) 
ruleItemChanged.get());
+            Optional<DropRuleItem> dropRuleItem = 
ruleItemChangedBuilder.build(databaseName, each.getActiveVersionNodePath(), 
each.getNextActiveVersion(), new RuleItemDroppedBuildExecutor());
+            if (dropRuleItem.isPresent()) {
+                
metaDataContextManager.getDatabaseRuleItemManager().drop(dropRuleItem.get());
             }
         }
         clearServiceCache();

Reply via email to