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();