You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/01/03 01:24:34 UTC
[shardingsphere] branch master updated: Refactor ifNotExists of CREATE READWRITE_SPLITTING RULE. (#23268)
This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 addf8dbf2d4 Refactor ifNotExists of CREATE READWRITE_SPLITTING RULE. (#23268)
addf8dbf2d4 is described below
commit addf8dbf2d49e68e46cef745fbae2e4a2fe57217
Author: yx9o <ya...@163.com>
AuthorDate: Tue Jan 3 09:24:27 2023 +0800
Refactor ifNotExists of CREATE READWRITE_SPLITTING RULE. (#23268)
---
.../ReadwriteSplittingRuleStatementChecker.java | 28 ++++++++--------------
...eateReadwriteSplittingRuleStatementUpdater.java | 21 +++++++++-------
2 files changed, 23 insertions(+), 26 deletions(-)
diff --git a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
index 144fa45f4cc..37dee289c62 100644
--- a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
+++ b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
@@ -56,13 +56,12 @@ public final class ReadwriteSplittingRuleStatementChecker {
* @param database database
* @param segments segments
* @param currentRuleConfig current rule config
- * @param duplicatedRuleNames duplicated rule names
* @param ifNotExists rule if not exists
*/
public static void checkCreation(final ShardingSphereDatabase database, final Collection<ReadwriteSplittingRuleSegment> segments,
- final ReadwriteSplittingRuleConfiguration currentRuleConfig, final Collection<String> duplicatedRuleNames, final boolean ifNotExists) {
+ final ReadwriteSplittingRuleConfiguration currentRuleConfig, final boolean ifNotExists) {
String databaseName = database.getName();
- checkDuplicateRuleNames(databaseName, segments, currentRuleConfig, database.getResourceMetaData(), duplicatedRuleNames, ifNotExists);
+ checkDuplicateRuleNames(databaseName, segments, currentRuleConfig, database.getResourceMetaData(), ifNotExists);
checkDataSourcesExist(databaseName, segments, database);
checkDuplicatedDataSourceNames(databaseName, segments, currentRuleConfig, true);
checkLoadBalancers(segments);
@@ -103,10 +102,12 @@ public final class ReadwriteSplittingRuleStatementChecker {
}
private static void checkDuplicateRuleNames(final String databaseName, final Collection<ReadwriteSplittingRuleSegment> segments, final ReadwriteSplittingRuleConfiguration currentRuleConfig,
- final ShardingSphereResourceMetaData resourceMetaData, final Collection<String> duplicatedRuleNames, final boolean ifNotExists) {
+ final ShardingSphereResourceMetaData resourceMetaData, final boolean ifNotExists) {
checkDuplicateRuleNamesWithSelf(databaseName, segments);
- checkDuplicateRuleNamesWithResourceMetaData(resourceMetaData, ifNotExists, duplicatedRuleNames, segments);
- checkDuplicateRuleNamesWithRuleConfiguration(databaseName, currentRuleConfig, ifNotExists, duplicatedRuleNames, segments);
+ checkDuplicateRuleNamesWithResourceMetaData(resourceMetaData, segments);
+ if (!ifNotExists) {
+ checkDuplicateRuleNamesWithRuleConfiguration(databaseName, currentRuleConfig, segments);
+ }
}
private static void checkDuplicateRuleNamesWithSelf(final String databaseName, final Collection<ReadwriteSplittingRuleSegment> segments) {
@@ -119,32 +120,23 @@ public final class ReadwriteSplittingRuleStatementChecker {
.filter(each -> each.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toSet());
}
- private static void checkDuplicateRuleNamesWithResourceMetaData(final ShardingSphereResourceMetaData resourceMetaData, final boolean ifNotExists, final Collection<String> duplicatedRuleNames,
- final Collection<ReadwriteSplittingRuleSegment> segments) {
+ private static void checkDuplicateRuleNamesWithResourceMetaData(final ShardingSphereResourceMetaData resourceMetaData, final Collection<ReadwriteSplittingRuleSegment> segments) {
Collection<String> currentRuleNames = new LinkedList<>();
if (null != resourceMetaData && null != resourceMetaData.getDataSources()) {
currentRuleNames.addAll(resourceMetaData.getDataSources().keySet());
}
Collection<String> toBeCreatedRuleNames = segments.stream().map(ReadwriteSplittingRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
- if (ifNotExists) {
- duplicatedRuleNames.addAll(toBeCreatedRuleNames);
- return;
- }
ShardingSpherePreconditions.checkState(toBeCreatedRuleNames.isEmpty(), () -> new InvalidRuleConfigurationException("Readwrite splitting", toBeCreatedRuleNames,
Collections.singleton(String.format("%s already exists in storage unit", toBeCreatedRuleNames))));
}
- private static void checkDuplicateRuleNamesWithRuleConfiguration(final String databaseName, final ReadwriteSplittingRuleConfiguration currentRuleConfig, final boolean ifNotExists,
- final Collection<String> duplicatedRuleNames, final Collection<ReadwriteSplittingRuleSegment> segments) {
+ private static void checkDuplicateRuleNamesWithRuleConfiguration(final String databaseName, final ReadwriteSplittingRuleConfiguration currentRuleConfig,
+ final Collection<ReadwriteSplittingRuleSegment> segments) {
Collection<String> currentRuleNames = new LinkedList<>();
if (null != currentRuleConfig) {
currentRuleNames.addAll(currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toList()));
}
Collection<String> toBeCreatedRuleNames = segments.stream().map(ReadwriteSplittingRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
- if (ifNotExists) {
- duplicatedRuleNames.addAll(toBeCreatedRuleNames);
- return;
- }
ShardingSpherePreconditions.checkState(toBeCreatedRuleNames.isEmpty(), () -> new DuplicateRuleException("Readwrite splitting", databaseName, toBeCreatedRuleNames));
}
diff --git a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdater.java b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdater.java
index 503955ad537..fa0a9b59a4a 100644
--- a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdater.java
+++ b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleStatementUpdater.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.readwritesplitting.distsql.handler.update;
import org.apache.shardingsphere.distsql.handler.update.RuleDefinitionCreateUpdater;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
+import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import org.apache.shardingsphere.readwritesplitting.distsql.handler.checker.ReadwriteSplittingRuleStatementChecker;
import org.apache.shardingsphere.readwritesplitting.distsql.handler.converter.ReadwriteSplittingRuleStatementConverter;
import org.apache.shardingsphere.readwritesplitting.distsql.parser.segment.ReadwriteSplittingRuleSegment;
@@ -27,26 +28,24 @@ import org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.Cre
import java.util.Collection;
import java.util.LinkedList;
+import java.util.stream.Collectors;
/**
* Create readwrite-splitting rule statement updater.
*/
public final class CreateReadwriteSplittingRuleStatementUpdater implements RuleDefinitionCreateUpdater<CreateReadwriteSplittingRuleStatement, ReadwriteSplittingRuleConfiguration> {
- private Collection<String> duplicatedRuleNames = new LinkedList<>();
-
@Override
public void checkSQLStatement(final ShardingSphereDatabase database, final CreateReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
- Collection<String> duplicatedRuleNames = new LinkedList<>();
- ReadwriteSplittingRuleStatementChecker.checkCreation(database, sqlStatement.getRules(), currentRuleConfig, duplicatedRuleNames, sqlStatement.isIfNotExists());
- this.duplicatedRuleNames = duplicatedRuleNames;
+ ReadwriteSplittingRuleStatementChecker.checkCreation(database, sqlStatement.getRules(), currentRuleConfig, sqlStatement.isIfNotExists());
}
@Override
public ReadwriteSplittingRuleConfiguration buildToBeCreatedRuleConfiguration(final ReadwriteSplittingRuleConfiguration currentRuleConfig,
final CreateReadwriteSplittingRuleStatement sqlStatement) {
Collection<ReadwriteSplittingRuleSegment> segments = sqlStatement.getRules();
- if (!duplicatedRuleNames.isEmpty()) {
+ if (sqlStatement.isIfNotExists()) {
+ Collection<String> duplicatedRuleNames = getDuplicatedRuleNames(currentRuleConfig, sqlStatement.getRules());
segments.removeIf(each -> duplicatedRuleNames.contains(each.getName()));
}
return ReadwriteSplittingRuleStatementConverter.convert(segments);
@@ -54,10 +53,16 @@ public final class CreateReadwriteSplittingRuleStatementUpdater implements RuleD
@Override
public void updateCurrentRuleConfiguration(final ReadwriteSplittingRuleConfiguration currentRuleConfig, final ReadwriteSplittingRuleConfiguration toBeCreatedRuleConfig) {
+ currentRuleConfig.getDataSources().addAll(toBeCreatedRuleConfig.getDataSources());
+ currentRuleConfig.getLoadBalancers().putAll(toBeCreatedRuleConfig.getLoadBalancers());
+ }
+
+ private Collection<String> getDuplicatedRuleNames(final ReadwriteSplittingRuleConfiguration currentRuleConfig, final Collection<ReadwriteSplittingRuleSegment> segments) {
+ Collection<String> currentRuleNames = new LinkedList<>();
if (null != currentRuleConfig) {
- currentRuleConfig.getDataSources().addAll(toBeCreatedRuleConfig.getDataSources());
- currentRuleConfig.getLoadBalancers().putAll(toBeCreatedRuleConfig.getLoadBalancers());
+ currentRuleNames.addAll(currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toList()));
}
+ return segments.stream().map(ReadwriteSplittingRuleSegment::getName).filter(currentRuleNames::contains).collect(Collectors.toList());
}
@Override