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