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 <[email protected]>
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();