Skip to content

Commit

Permalink
Refactor RuleItemChangedBuilder
Browse files Browse the repository at this point in the history
  • Loading branch information
terrymanu committed Feb 8, 2025
1 parent fd26976 commit 5c2b45d
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.apache.shardingsphere.mode.metadata.changed;

import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.mode.metadata.changed.executor.RuleItemChangedBuildExecutor;
import org.apache.shardingsphere.mode.node.spi.RuleNodePathProvider;
Expand All @@ -34,17 +33,18 @@ public final class RuleItemChangedBuilder {
* Build rule item changed.
*
* @param databaseName database name
* @param metaDataVersion meta data version
* @param path path
* @param currentActiveVersion current active version
* @param executor rule item changed build executor
* @param <T> type of rule changed item
* @return built rule item
*/
public <T extends RuleChangedItem> Optional<T> build(final String databaseName, final MetaDataVersion metaDataVersion, final RuleItemChangedBuildExecutor<T> executor) {
public <T extends RuleChangedItem> Optional<T> build(final String databaseName, final String path, final Integer currentActiveVersion, final RuleItemChangedBuildExecutor<T> executor) {
for (RuleNodePathProvider each : ShardingSphereServiceLoader.getServiceInstances(RuleNodePathProvider.class)) {
if (!each.getRuleNodePath().getRoot().isValidatedPath(metaDataVersion.getPath())) {
if (!each.getRuleNodePath().getRoot().isValidatedPath(path)) {
continue;
}
Optional<T> result = executor.build(each.getRuleNodePath(), databaseName, metaDataVersion);
Optional<T> result = executor.build(each.getRuleNodePath(), databaseName, path, currentActiveVersion);
if (result.isPresent()) {
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.apache.shardingsphere.mode.metadata.changed.executor;

import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import org.apache.shardingsphere.mode.node.path.config.rule.RuleNodePath;
import org.apache.shardingsphere.mode.spi.rule.item.RuleChangedItem;

Expand All @@ -35,8 +34,9 @@ public interface RuleItemChangedBuildExecutor<T extends RuleChangedItem> {
*
* @param ruleNodePath rule node path
* @param databaseName database name
* @param metaDataVersion meta data version
* @param path path
* @param currentActiveVersion current active version
* @return built rule item
*/
Optional<T> build(RuleNodePath ruleNodePath, String databaseName, MetaDataVersion metaDataVersion);
Optional<T> build(RuleNodePath ruleNodePath, String databaseName, String path, Integer currentActiveVersion);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.apache.shardingsphere.mode.metadata.changed.executor.type;

import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import org.apache.shardingsphere.mode.metadata.changed.executor.RuleItemChangedBuildExecutor;
import org.apache.shardingsphere.mode.node.path.config.rule.RuleNodePath;
import org.apache.shardingsphere.mode.node.path.config.rule.item.NamedRuleItemNodePath;
Expand All @@ -35,18 +34,16 @@
public final class RuleItemAlteredBuildExecutor implements RuleItemChangedBuildExecutor<AlterRuleItem> {

@Override
public Optional<AlterRuleItem> build(final RuleNodePath ruleNodePath, final String databaseName, final MetaDataVersion metaDataVersion) {
public Optional<AlterRuleItem> build(final RuleNodePath ruleNodePath, final String databaseName, final String path, final Integer currentActiveVersion) {
for (Entry<String, NamedRuleItemNodePath> entry : ruleNodePath.getNamedItems().entrySet()) {
Optional<String> itemName = entry.getValue().getVersionNodePathParser().findIdentifierByActiveVersionPath(metaDataVersion.getPath(), 1);
Optional<String> itemName = entry.getValue().getVersionNodePathParser().findIdentifierByActiveVersionPath(path, 1);
if (itemName.isPresent()) {
return Optional.of(new AlterNamedRuleItem(databaseName, itemName.get(), metaDataVersion.getPath(),
metaDataVersion.getNextActiveVersion(), ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
return Optional.of(new AlterNamedRuleItem(databaseName, itemName.get(), path, currentActiveVersion, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
}
}
for (Entry<String, UniqueRuleItemNodePath> entry : ruleNodePath.getUniqueItems().entrySet()) {
if (entry.getValue().getVersionNodePathParser().isActiveVersionPath(metaDataVersion.getPath())) {
return Optional.of(new AlterUniqueRuleItem(databaseName, metaDataVersion.getPath(),
metaDataVersion.getNextActiveVersion(), ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
if (entry.getValue().getVersionNodePathParser().isActiveVersionPath(path)) {
return Optional.of(new AlterUniqueRuleItem(databaseName, path, currentActiveVersion, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
}
}
return Optional.empty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.apache.shardingsphere.mode.metadata.changed.executor.type;

import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import org.apache.shardingsphere.mode.metadata.changed.executor.RuleItemChangedBuildExecutor;
import org.apache.shardingsphere.mode.node.path.config.rule.RuleNodePath;
import org.apache.shardingsphere.mode.node.path.config.rule.item.NamedRuleItemNodePath;
Expand All @@ -35,15 +34,15 @@
public final class RuleItemDroppedBuildExecutor implements RuleItemChangedBuildExecutor<DropRuleItem> {

@Override
public Optional<DropRuleItem> build(final RuleNodePath ruleNodePath, final String databaseName, final MetaDataVersion metaDataVersion) {
public Optional<DropRuleItem> build(final RuleNodePath ruleNodePath, final String databaseName, final String path, final Integer currentActiveVersion) {
for (Entry<String, NamedRuleItemNodePath> entry : ruleNodePath.getNamedItems().entrySet()) {
Optional<String> itemName = entry.getValue().findNameByItemPath(metaDataVersion.getPath());
Optional<String> itemName = entry.getValue().findNameByItemPath(path);
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().getVersionNodePathParser().isActiveVersionPath(metaDataVersion.getPath())) {
if (entry.getValue().getVersionNodePathParser().isActiveVersionPath(path)) {
return Optional.of(new DropUniqueRuleItem(databaseName, ruleNodePath.getRoot().getRuleType() + "." + entry.getKey()));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
package org.apache.shardingsphere.mode.manager.cluster.dispatch.handler.database.rule;

import com.google.common.base.Strings;
import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
import org.apache.shardingsphere.mode.event.DataChangedEvent;
import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
import org.apache.shardingsphere.mode.manager.ContextManager;
Expand Down Expand Up @@ -62,12 +61,12 @@ public void handle(final String databaseName, final DataChangedEvent event) thro
return;
}
int version = Integer.parseInt(event.getValue());
Optional<AlterRuleItem> alterRuleItem = ruleItemChangedBuilder.build(databaseName, new MetaDataVersion(event.getKey(), version, version), new RuleItemAlteredBuildExecutor());
Optional<AlterRuleItem> alterRuleItem = ruleItemChangedBuilder.build(databaseName, event.getKey(), version, new RuleItemAlteredBuildExecutor());
if (alterRuleItem.isPresent()) {
contextManager.getMetaDataContextManager().getDatabaseRuleItemManager().alter(alterRuleItem.get());
}
} else if (Type.DELETED == event.getType()) {
Optional<DropRuleItem> dropRuleItem = ruleItemChangedBuilder.build(databaseName, new MetaDataVersion(event.getKey()), new RuleItemDroppedBuildExecutor());
Optional<DropRuleItem> dropRuleItem = ruleItemChangedBuilder.build(databaseName, event.getKey(), null, new RuleItemDroppedBuildExecutor());
if (dropRuleItem.isPresent()) {
contextManager.getMetaDataContextManager().getDatabaseRuleItemManager().drop(dropRuleItem.get());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ public void alterRuleConfiguration(final ShardingSphereDatabase database, final
Collection<MetaDataVersion> metaDataVersions = metaDataPersistFacade.getDatabaseRuleService().persist(database.getName(), Collections.singleton(toBeAlteredRuleConfig));
metaDataPersistFacade.getMetaDataVersionService().switchActiveVersion(metaDataVersions);
for (MetaDataVersion each : metaDataVersions) {
Optional<AlterRuleItem> alterRuleItem = ruleItemChangedBuilder.build(database.getName(), each, new RuleItemAlteredBuildExecutor());
Optional<AlterRuleItem> alterRuleItem = ruleItemChangedBuilder.build(database.getName(), each.getPath(), each.getCurrentActiveVersion(), new RuleItemAlteredBuildExecutor());
if (alterRuleItem.isPresent()) {
metaDataContextManager.getDatabaseRuleItemManager().alter(alterRuleItem.get());
}
Expand All @@ -226,7 +226,7 @@ public void removeRuleConfigurationItem(final ShardingSphereDatabase database, f
}
Collection<MetaDataVersion> metaDataVersions = metaDataPersistFacade.getDatabaseRuleService().delete(database.getName(), Collections.singleton(toBeRemovedRuleConfig));
for (MetaDataVersion each : metaDataVersions) {
Optional<DropRuleItem> dropRuleItem = ruleItemChangedBuilder.build(database.getName(), each, new RuleItemDroppedBuildExecutor());
Optional<DropRuleItem> dropRuleItem = ruleItemChangedBuilder.build(database.getName(), each.getPath(), each.getCurrentActiveVersion(), new RuleItemDroppedBuildExecutor());
if (dropRuleItem.isPresent()) {
metaDataContextManager.getDatabaseRuleItemManager().drop(dropRuleItem.get());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ void assertAlterRuleConfiguration() throws SQLException {
when(metaDataPersistFacade.getDatabaseRuleService().persist("foo_db", Collections.singleton(ruleConfig))).thenReturn(metaDataVersion);
AlterRuleItem alterRuleItem = mock(AlterRuleItem.class);
RuleItemChangedBuilder ruleItemChangedBuilder = mock(RuleItemChangedBuilder.class);
when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any())).thenReturn(Optional.of(alterRuleItem));
when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any(), any())).thenReturn(Optional.of(alterRuleItem));
setRuleConfigurationEventBuilder(ruleItemChangedBuilder);
metaDataManagerPersistService.alterRuleConfiguration(database, ruleConfig);
verify(metaDataPersistFacade.getMetaDataVersionService()).switchActiveVersion(metaDataVersion);
Expand All @@ -196,7 +196,7 @@ void assertRemoveRuleConfigurationItem() throws SQLException {
when(metaDataPersistFacade.getDatabaseRuleService().delete("foo_db", Collections.singleton(ruleConfig))).thenReturn(metaDataVersion);
RuleItemChangedBuilder ruleItemChangedBuilder = mock(RuleItemChangedBuilder.class);
DropRuleItem dropRuleItem = mock(DropRuleItem.class);
when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any())).thenReturn(Optional.of(dropRuleItem));
when(ruleItemChangedBuilder.build(eq("foo_db"), any(), any(), any())).thenReturn(Optional.of(dropRuleItem));
setRuleConfigurationEventBuilder(ruleItemChangedBuilder);
metaDataManagerPersistService.removeRuleConfigurationItem(new ShardingSphereDatabase("foo_db", mock(), mock(), mock(), Collections.emptyList()), ruleConfig);
verify(metaDataContextManager.getDatabaseRuleItemManager()).drop(any(DropRuleItem.class));
Expand Down

0 comments on commit 5c2b45d

Please sign in to comment.