This is an automated email from the ASF dual-hosted git repository.
chengzhang 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 c13e18d05a7 Add keyGenerateStrategies rule configuration for sharding
rule (#38294)
c13e18d05a7 is described below
commit c13e18d05a75854caa427987dbe3d94c66ab69fd
Author: zhaojinchao <[email protected]>
AuthorDate: Mon Mar 2 17:18:59 2026 +0800
Add keyGenerateStrategies rule configuration for sharding rule (#38294)
---
.../api/config/ShardingRuleConfiguration.java | 3 +
...lumnKeyGenerateStrategiesRuleConfiguration.java | 40 +++++++++
.../keygen/KeyGenerateStrategiesConfiguration.java | 38 +++++++++
...enceKeyGenerateStrategiesRuleConfiguration.java | 38 +++++++++
.../config/ShardingRuleConfigurationChecker.java | 28 ++++++
.../ShardingRuleConfigurationEmptyChecker.java | 1 +
.../KeyGenerateStrategiesChangedProcessor.java | 59 +++++++++++++
.../yaml/config/YamlShardingRuleConfiguration.java | 4 +
.../YamlKeyGenerateStrategyRuleConfiguration.java | 40 +++++++++
.../YamlShardingRuleConfigurationSwapper.java | 17 ++++
...eyGenerateStrategyRuleConfigurationSwapper.java | 59 +++++++++++++
....spi.rule.RuleItemConfigurationChangedProcessor | 1 +
.../ShardingRuleConfigurationCheckerTest.java | 27 ++++++
.../ShardingRuleConfigurationEmptyCheckerTest.java | 8 ++
...eyGenerateStrategyRuleChangedProcessorTest.java | 99 ++++++++++++++++++++++
...figurationYamlRuleNodeTupleSwapperEngineIT.java | 8 +-
.../yaml/ShardingRuleConfigurationYamlIT.java | 32 +++++++
.../resources/yaml/sharding-rule-for-tuple.yaml | 10 +++
.../src/test/resources/yaml/sharding-rule.yaml | 10 +++
19 files changed, 519 insertions(+), 3 deletions(-)
diff --git
a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingRuleConfiguration.java
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingRuleConfiguration.java
index c69a58661ab..8e2852aa518 100644
---
a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingRuleConfiguration.java
+++
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/ShardingRuleConfiguration.java
@@ -28,6 +28,7 @@ import
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleC
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableReferenceRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategiesConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
@@ -60,6 +61,8 @@ public final class ShardingRuleConfiguration implements
DatabaseRuleConfiguratio
private String defaultShardingColumn;
+ private Map<String, KeyGenerateStrategiesConfiguration>
keyGenerateStrategies = new LinkedHashMap<>();
+
private Map<String, AlgorithmConfiguration> shardingAlgorithms = new
LinkedHashMap<>();
private Map<String, AlgorithmConfiguration> keyGenerators = new
LinkedHashMap<>();
diff --git
a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/ColumnKeyGenerateStrategiesRuleConfiguration.java
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/ColumnKeyGenerateStrategiesRuleConfiguration.java
new file mode 100644
index 00000000000..d1d10fb416f
--- /dev/null
+++
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/ColumnKeyGenerateStrategiesRuleConfiguration.java
@@ -0,0 +1,40 @@
+/*
+ * 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.sharding.api.config.strategy.keygen;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Column key generate strategies configuration.
+ */
+@Getter
+@Setter
+public final class ColumnKeyGenerateStrategiesRuleConfiguration implements
KeyGenerateStrategiesConfiguration {
+
+ private String keyGeneratorName;
+
+ private String logicTable;
+
+ private String keyGenerateColumn;
+
+ @Override
+ public String getKeyGenerateType() {
+ return "column";
+ }
+}
diff --git
a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/KeyGenerateStrategiesConfiguration.java
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/KeyGenerateStrategiesConfiguration.java
new file mode 100644
index 00000000000..6224c54aee3
--- /dev/null
+++
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/KeyGenerateStrategiesConfiguration.java
@@ -0,0 +1,38 @@
+/*
+ * 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.sharding.api.config.strategy.keygen;
+
+/**
+ * Key generate strategies configuration.
+ */
+public interface KeyGenerateStrategiesConfiguration {
+
+ /**
+ * Get key generate type.
+ *
+ * @return key generate type
+ */
+ String getKeyGenerateType();
+
+ /**
+ * Get key generator name.
+ *
+ * @return key generator name
+ */
+ String getKeyGeneratorName();
+}
diff --git
a/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/SequenceKeyGenerateStrategiesRuleConfiguration.java
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/SequenceKeyGenerateStrategiesRuleConfiguration.java
new file mode 100644
index 00000000000..ca1bd2d8020
--- /dev/null
+++
b/features/sharding/api/src/main/java/org/apache/shardingsphere/sharding/api/config/strategy/keygen/SequenceKeyGenerateStrategiesRuleConfiguration.java
@@ -0,0 +1,38 @@
+/*
+ * 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.sharding.api.config.strategy.keygen;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Sequence key generate strategies rule configuration.
+ */
+@Getter
+@Setter
+public final class SequenceKeyGenerateStrategiesRuleConfiguration implements
KeyGenerateStrategiesConfiguration {
+
+ private String keyGeneratorName;
+
+ private String keyGenerateSequence;
+
+ @Override
+ public String getKeyGenerateType() {
+ return "sequence";
+ }
+}
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationChecker.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationChecker.java
index 6b8db7c7dd2..e291bf805af 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationChecker.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationChecker.java
@@ -32,7 +32,10 @@ import
org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.ColumnKeyGenerateStrategiesRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategiesConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.SequenceKeyGenerateStrategiesRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ComplexShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
@@ -62,6 +65,7 @@ public final class ShardingRuleConfigurationChecker
implements DatabaseRuleConfi
Collection<String> shardingAlgorithms =
ruleConfig.getShardingAlgorithms().keySet();
checkTables(databaseName, ruleConfig.getTables(),
ruleConfig.getAutoTables(), keyGenerators, auditors, shardingAlgorithms);
checkKeyGenerateStrategy(databaseName,
ruleConfig.getDefaultKeyGenerateStrategy(), keyGenerators);
+ checkKeyGenerateStrategies(databaseName,
ruleConfig.getKeyGenerateStrategies().values(), keyGenerators);
checkAuditStrategy(databaseName, ruleConfig.getDefaultAuditStrategy(),
auditors);
checkShardingStrategy(databaseName,
ruleConfig.getDefaultDatabaseShardingStrategy(), shardingAlgorithms);
checkShardingStrategy(databaseName,
ruleConfig.getDefaultTableShardingStrategy(), shardingAlgorithms);
@@ -113,6 +117,30 @@ public final class ShardingRuleConfigurationChecker
implements DatabaseRuleConfi
() -> new UnregisteredAlgorithmException("Sharding audit",
Joiner.on(",").join(auditStrategy.getAuditorNames()), new
SQLExceptionIdentifier(databaseName)));
}
+ private void checkKeyGenerateStrategies(final String databaseName, final
Collection<KeyGenerateStrategiesConfiguration> keyGenerateStrategies, final
Collection<String> keyGenerators) {
+ for (KeyGenerateStrategiesConfiguration each : keyGenerateStrategies) {
+
ShardingSpherePreconditions.checkNotEmpty(each.getKeyGeneratorName(), () -> new
MissingRequiredShardingConfigurationException("Key generator name",
databaseName));
+ ShardingSpherePreconditions.checkContains(keyGenerators,
each.getKeyGeneratorName(),
+ () -> new UnregisteredAlgorithmException("Key generate",
each.getKeyGeneratorName(), new SQLExceptionIdentifier(databaseName)));
+ if (each instanceof ColumnKeyGenerateStrategiesRuleConfiguration) {
+ checkColumnKeyGenerateStrategy(databaseName,
(ColumnKeyGenerateStrategiesRuleConfiguration) each);
+ } else if (each instanceof
SequenceKeyGenerateStrategiesRuleConfiguration) {
+ checkSequenceKeyGenerateStrategy(databaseName,
(SequenceKeyGenerateStrategiesRuleConfiguration) each);
+ } else {
+ throw new MissingRequiredShardingConfigurationException("Key
generate type should be column or sequence", databaseName);
+ }
+ }
+ }
+
+ private void checkColumnKeyGenerateStrategy(final String databaseName,
final ColumnKeyGenerateStrategiesRuleConfiguration keyGenerateStrategy) {
+
ShardingSpherePreconditions.checkNotEmpty(keyGenerateStrategy.getLogicTable(),
() -> new MissingRequiredShardingConfigurationException("Sharding logic table",
databaseName));
+
ShardingSpherePreconditions.checkNotEmpty(keyGenerateStrategy.getKeyGenerateColumn(),
() -> new MissingRequiredShardingConfigurationException("Key generate column",
databaseName));
+ }
+
+ private void checkSequenceKeyGenerateStrategy(final String databaseName,
final SequenceKeyGenerateStrategiesRuleConfiguration keyGenerateStrategy) {
+
ShardingSpherePreconditions.checkNotEmpty(keyGenerateStrategy.getKeyGenerateSequence(),
() -> new MissingRequiredShardingConfigurationException("Key generate
sequence", databaseName));
+ }
+
private void checkShardingStrategy(final String databaseName, final
ShardingStrategyConfiguration shardingStrategy, final Collection<String>
shardingAlgorithms) {
if (null == shardingStrategy || shardingStrategy instanceof
NoneShardingStrategyConfiguration) {
return;
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationEmptyChecker.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationEmptyChecker.java
index ccadb50a539..a565a551d25 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationEmptyChecker.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationEmptyChecker.java
@@ -31,6 +31,7 @@ public final class ShardingRuleConfigurationEmptyChecker
implements DatabaseRule
&& null == ruleConfig.getDefaultDatabaseShardingStrategy() &&
null == ruleConfig.getDefaultTableShardingStrategy()
&& null == ruleConfig.getDefaultKeyGenerateStrategy() && null
== ruleConfig.getDefaultAuditStrategy()
&& (null == ruleConfig.getDefaultShardingColumn() ||
ruleConfig.getDefaultShardingColumn().isEmpty())
+ && ruleConfig.getKeyGenerateStrategies().isEmpty()
&& ruleConfig.getShardingAlgorithms().isEmpty() &&
ruleConfig.getKeyGenerators().isEmpty()
&& ruleConfig.getAuditors().isEmpty() && null ==
ruleConfig.getShardingCache();
}
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/KeyGenerateStrategiesChangedProcessor.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/KeyGenerateStrategiesChangedProcessor.java
new file mode 100644
index 00000000000..64b33ea1fce
--- /dev/null
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/changed/KeyGenerateStrategiesChangedProcessor.java
@@ -0,0 +1,59 @@
+/*
+ * 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.sharding.rule.changed;
+
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
+import org.apache.shardingsphere.mode.spi.rule.RuleChangedItemType;
+import
org.apache.shardingsphere.mode.spi.rule.RuleItemConfigurationChangedProcessor;
+import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategiesConfiguration;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import
org.apache.shardingsphere.sharding.yaml.config.strategy.keygen.YamlKeyGenerateStrategyRuleConfiguration;
+import
org.apache.shardingsphere.sharding.yaml.swapper.strategy.YamlKeyGenerateStrategyRuleConfigurationSwapper;
+
+/**
+ * Key generate strategies changed processor.
+ */
+public final class KeyGenerateStrategiesChangedProcessor implements
RuleItemConfigurationChangedProcessor<ShardingRuleConfiguration,
KeyGenerateStrategiesConfiguration> {
+
+ @Override
+ public KeyGenerateStrategiesConfiguration swapRuleItemConfiguration(final
String itemName, final String yamlContent) {
+ return new
YamlKeyGenerateStrategyRuleConfigurationSwapper().swapToObject(YamlEngine.unmarshal(yamlContent,
YamlKeyGenerateStrategyRuleConfiguration.class));
+ }
+
+ @Override
+ public ShardingRuleConfiguration findRuleConfiguration(final
ShardingSphereDatabase database) {
+ return
database.getRuleMetaData().findSingleRule(ShardingRule.class).map(ShardingRule::getConfiguration).orElseGet(ShardingRuleConfiguration::new);
+ }
+
+ @Override
+ public void changeRuleItemConfiguration(final String itemName, final
ShardingRuleConfiguration currentRuleConfig, final
KeyGenerateStrategiesConfiguration toBeChangedItemConfig) {
+ currentRuleConfig.getKeyGenerateStrategies().put(itemName,
toBeChangedItemConfig);
+ }
+
+ @Override
+ public void dropRuleItemConfiguration(final String itemName, final
ShardingRuleConfiguration currentRuleConfig) {
+ currentRuleConfig.getKeyGenerateStrategies().remove(itemName);
+ }
+
+ @Override
+ public RuleChangedItemType getType() {
+ return new RuleChangedItemType("sharding", "key_generate_strategies");
+ }
+}
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/config/YamlShardingRuleConfiguration.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/config/YamlShardingRuleConfiguration.java
index 873b67250ce..9c716d2b89f 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/config/YamlShardingRuleConfiguration.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/config/YamlShardingRuleConfiguration.java
@@ -30,6 +30,7 @@ import
org.apache.shardingsphere.sharding.yaml.config.cache.YamlShardingCacheCon
import
org.apache.shardingsphere.sharding.yaml.config.rule.YamlShardingAutoTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.yaml.config.rule.YamlTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.yaml.config.strategy.audit.YamlShardingAuditStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.yaml.config.strategy.keygen.YamlKeyGenerateStrategyRuleConfiguration;
import
org.apache.shardingsphere.sharding.yaml.config.strategy.keygen.YamlKeyGenerateStrategyConfiguration;
import
org.apache.shardingsphere.sharding.yaml.config.strategy.sharding.YamlShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.yaml.swapper.ShardingBindingTableRuleNodeTupleKeyListNameGenerator;
@@ -69,6 +70,9 @@ public final class YamlShardingRuleConfiguration implements
YamlRuleConfiguratio
@RuleNodeTupleField(type = Type.DEFAULT_STRATEGY)
private YamlShardingAuditStrategyConfiguration defaultAuditStrategy;
+ @RuleNodeTupleField(type = Type.OTHER)
+ private Map<String, YamlKeyGenerateStrategyRuleConfiguration>
keyGenerateStrategies = new LinkedHashMap<>();
+
@RuleNodeTupleField(type = Type.ALGORITHM)
private Map<String, YamlAlgorithmConfiguration> shardingAlgorithms = new
LinkedHashMap<>();
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/config/strategy/keygen/YamlKeyGenerateStrategyRuleConfiguration.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/config/strategy/keygen/YamlKeyGenerateStrategyRuleConfiguration.java
new file mode 100644
index 00000000000..7e32ded96ad
--- /dev/null
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/config/strategy/keygen/YamlKeyGenerateStrategyRuleConfiguration.java
@@ -0,0 +1,40 @@
+/*
+ * 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.sharding.yaml.config.strategy.keygen;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.shardingsphere.infra.util.yaml.YamlConfiguration;
+
+/**
+ * Key generate strategy rule configuration for YAML.
+ */
+@Getter
+@Setter
+public final class YamlKeyGenerateStrategyRuleConfiguration implements
YamlConfiguration {
+
+ private String keyGenerateType;
+
+ private String keyGeneratorName;
+
+ private String logicTable;
+
+ private String keyGenerateColumn;
+
+ private String keyGenerateSequence;
+}
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/YamlShardingRuleConfigurationSwapper.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/YamlShardingRuleConfigurationSwapper.java
index 02be859cebb..ced1f062cd5 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/YamlShardingRuleConfigurationSwapper.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/YamlShardingRuleConfigurationSwapper.java
@@ -28,6 +28,7 @@ import
org.apache.shardingsphere.sharding.yaml.swapper.cache.YamlShardingCacheCo
import
org.apache.shardingsphere.sharding.yaml.swapper.rule.YamlShardingAutoTableRuleConfigurationSwapper;
import
org.apache.shardingsphere.sharding.yaml.swapper.rule.YamlShardingTableReferenceRuleConfigurationConverter;
import
org.apache.shardingsphere.sharding.yaml.swapper.rule.YamlShardingTableRuleConfigurationSwapper;
+import
org.apache.shardingsphere.sharding.yaml.swapper.strategy.YamlKeyGenerateStrategyRuleConfigurationSwapper;
import
org.apache.shardingsphere.sharding.yaml.swapper.strategy.YamlKeyGenerateStrategyConfigurationSwapper;
import
org.apache.shardingsphere.sharding.yaml.swapper.strategy.YamlShardingAuditStrategyConfigurationSwapper;
import
org.apache.shardingsphere.sharding.yaml.swapper.strategy.YamlShardingStrategyConfigurationSwapper;
@@ -46,6 +47,8 @@ public final class YamlShardingRuleConfigurationSwapper
implements YamlRuleConfi
private final YamlKeyGenerateStrategyConfigurationSwapper
keyGenerateStrategySwapper = new YamlKeyGenerateStrategyConfigurationSwapper();
+ private final YamlKeyGenerateStrategyRuleConfigurationSwapper
keyGenerateStrategyRuleSwapper = new
YamlKeyGenerateStrategyRuleConfigurationSwapper();
+
private final YamlAlgorithmConfigurationSwapper algorithmSwapper = new
YamlAlgorithmConfigurationSwapper();
private final YamlShardingAuditStrategyConfigurationSwapper
auditStrategySwapper = new YamlShardingAuditStrategyConfigurationSwapper();
@@ -61,6 +64,7 @@ public final class YamlShardingRuleConfigurationSwapper
implements YamlRuleConfi
data.getAutoTables().forEach(each ->
result.getAutoTables().put(each.getLogicTable(),
autoTableSwapper.swapToYamlConfiguration(each)));
result.getBindingTables().addAll(data.getBindingTableGroups().stream().map(YamlShardingTableReferenceRuleConfigurationConverter::convertToYamlString).collect(Collectors.toList()));
setYamlStrategies(data, result);
+ setYamlKeyGenerateStrategies(data, result);
setYamlAlgorithms(data, result);
result.setDefaultShardingColumn(data.getDefaultShardingColumn());
if (null != data.getShardingCache()) {
@@ -84,6 +88,12 @@ public final class YamlShardingRuleConfigurationSwapper
implements YamlRuleConfi
}
}
+ private void setYamlKeyGenerateStrategies(final ShardingRuleConfiguration
data, final YamlShardingRuleConfiguration yamlConfig) {
+ if (null != data.getKeyGenerateStrategies()) {
+ data.getKeyGenerateStrategies().forEach((key, value) ->
yamlConfig.getKeyGenerateStrategies().put(key,
keyGenerateStrategyRuleSwapper.swapToYamlConfiguration(value)));
+ }
+ }
+
private void setYamlAlgorithms(final ShardingRuleConfiguration data, final
YamlShardingRuleConfiguration yamlConfig) {
if (null != data.getShardingAlgorithms()) {
data.getShardingAlgorithms().forEach((key, value) ->
yamlConfig.getShardingAlgorithms().put(key,
algorithmSwapper.swapToYamlConfiguration(value)));
@@ -111,6 +121,7 @@ public final class YamlShardingRuleConfigurationSwapper
implements YamlRuleConfi
}
result.getBindingTableGroups().addAll(yamlConfig.getBindingTables().stream().map(YamlShardingTableReferenceRuleConfigurationConverter::convertToObject).collect(Collectors.toList()));
setStrategies(yamlConfig, result);
+ setKeyGenerateStrategies(yamlConfig, result);
setAlgorithms(yamlConfig, result);
result.setDefaultShardingColumn(yamlConfig.getDefaultShardingColumn());
if (null != yamlConfig.getShardingCache()) {
@@ -134,6 +145,12 @@ public final class YamlShardingRuleConfigurationSwapper
implements YamlRuleConfi
}
}
+ private void setKeyGenerateStrategies(final YamlShardingRuleConfiguration
yamlConfig, final ShardingRuleConfiguration ruleConfig) {
+ if (null != yamlConfig.getKeyGenerateStrategies()) {
+ yamlConfig.getKeyGenerateStrategies().forEach((key, value) ->
ruleConfig.getKeyGenerateStrategies().put(key,
keyGenerateStrategyRuleSwapper.swapToObject(value)));
+ }
+ }
+
private void setAlgorithms(final YamlShardingRuleConfiguration yamlConfig,
final ShardingRuleConfiguration ruleConfig) {
if (null != yamlConfig.getShardingAlgorithms()) {
yamlConfig.getShardingAlgorithms().forEach((key, value) ->
ruleConfig.getShardingAlgorithms().put(key,
algorithmSwapper.swapToObject(value)));
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/strategy/YamlKeyGenerateStrategyRuleConfigurationSwapper.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/strategy/YamlKeyGenerateStrategyRuleConfigurationSwapper.java
new file mode 100644
index 00000000000..3cd88bf2ac4
--- /dev/null
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/yaml/swapper/strategy/YamlKeyGenerateStrategyRuleConfigurationSwapper.java
@@ -0,0 +1,59 @@
+/*
+ * 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.sharding.yaml.swapper.strategy;
+
+import
org.apache.shardingsphere.infra.util.yaml.swapper.YamlConfigurationSwapper;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.ColumnKeyGenerateStrategiesRuleConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategiesConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.SequenceKeyGenerateStrategiesRuleConfiguration;
+import
org.apache.shardingsphere.sharding.yaml.config.strategy.keygen.YamlKeyGenerateStrategyRuleConfiguration;
+
+/**
+ * YAML key generate strategy rule configuration swapper.
+ */
+public final class YamlKeyGenerateStrategyRuleConfigurationSwapper implements
YamlConfigurationSwapper<YamlKeyGenerateStrategyRuleConfiguration,
KeyGenerateStrategiesConfiguration> {
+
+ @Override
+ public YamlKeyGenerateStrategyRuleConfiguration
swapToYamlConfiguration(final KeyGenerateStrategiesConfiguration data) {
+ YamlKeyGenerateStrategyRuleConfiguration result = new
YamlKeyGenerateStrategyRuleConfiguration();
+ result.setKeyGenerateType(data.getKeyGenerateType());
+ result.setKeyGeneratorName(data.getKeyGeneratorName());
+ if (data instanceof ColumnKeyGenerateStrategiesRuleConfiguration) {
+
result.setLogicTable(((ColumnKeyGenerateStrategiesRuleConfiguration)
data).getLogicTable());
+
result.setKeyGenerateColumn(((ColumnKeyGenerateStrategiesRuleConfiguration)
data).getKeyGenerateColumn());
+ } else {
+
result.setKeyGenerateSequence(((SequenceKeyGenerateStrategiesRuleConfiguration)
data).getKeyGenerateSequence());
+ }
+ return result;
+ }
+
+ @Override
+ public KeyGenerateStrategiesConfiguration swapToObject(final
YamlKeyGenerateStrategyRuleConfiguration yamlConfig) {
+ if ("sequence".equalsIgnoreCase(yamlConfig.getKeyGenerateType())) {
+ SequenceKeyGenerateStrategiesRuleConfiguration result = new
SequenceKeyGenerateStrategiesRuleConfiguration();
+ result.setKeyGeneratorName(yamlConfig.getKeyGeneratorName());
+ result.setKeyGenerateSequence(yamlConfig.getKeyGenerateSequence());
+ return result;
+ }
+ ColumnKeyGenerateStrategiesRuleConfiguration result = new
ColumnKeyGenerateStrategiesRuleConfiguration();
+ result.setKeyGeneratorName(yamlConfig.getKeyGeneratorName());
+ result.setLogicTable(yamlConfig.getLogicTable());
+ result.setKeyGenerateColumn(yamlConfig.getKeyGenerateColumn());
+ return result;
+ }
+}
diff --git
a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.spi.rule.RuleItemConfigurationChangedProcessor
b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.spi.rule.RuleItemConfigurationChangedProcessor
index 2598bb8bbcb..b727518d499 100644
---
a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.spi.rule.RuleItemConfigurationChangedProcessor
+++
b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.spi.rule.RuleItemConfigurationChangedProcessor
@@ -20,6 +20,7 @@
org.apache.shardingsphere.sharding.rule.changed.ShardingAutoTableChangedProcesso
org.apache.shardingsphere.sharding.rule.changed.ShardingTableReferenceChangedProcessor
org.apache.shardingsphere.sharding.rule.changed.ShardingAlgorithmChangedProcessor
org.apache.shardingsphere.sharding.rule.changed.KeyGeneratorChangedProcessor
+org.apache.shardingsphere.sharding.rule.changed.KeyGenerateStrategiesChangedProcessor
org.apache.shardingsphere.sharding.rule.changed.ShardingAuditorChangedProcessor
org.apache.shardingsphere.sharding.rule.changed.DefaultDatabaseShardingStrategyChangedProcessor
org.apache.shardingsphere.sharding.rule.changed.DefaultTableShardingStrategyChangedProcessor
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationCheckerTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationCheckerTest.java
index 2f23be946b8..85a205f56c7 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationCheckerTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationCheckerTest.java
@@ -27,7 +27,10 @@ import
org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.ColumnKeyGenerateStrategiesRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategiesConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.SequenceKeyGenerateStrategiesRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ComplexShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration;
@@ -64,9 +67,18 @@ class ShardingRuleConfigurationCheckerTest {
ShardingStrategyConfiguration shardingStrategyConfig =
createShardingStrategyConfiguration();
ruleConfig.setTables(Collections.singleton(createShardingTableRuleConfiguration(shardingStrategyConfig,
shardingAuditStrategyConfig, ruleConfig.getDefaultKeyGenerateStrategy())));
ruleConfig.setAutoTables(Collections.singleton(createShardingAutoTableRuleConfiguration(shardingStrategyConfig,
shardingAuditStrategyConfig, ruleConfig.getDefaultKeyGenerateStrategy())));
+ ruleConfig.getKeyGenerateStrategies().put("foo_column_strategy",
createColumnKeyGenerateStrategyRuleConfiguration("foo_keygen"));
+ ruleConfig.getKeyGenerateStrategies().put("foo_sequence_strategy",
createSequenceKeyGenerateStrategyRuleConfiguration("foo_keygen"));
checker.check("foo_db", ruleConfig, Collections.emptyMap(),
Collections.emptyList());
}
+ @Test
+ void assertCheckKeyGenerateStrategiesFailed() {
+ ShardingRuleConfiguration ruleConfig = createRuleConfiguration();
+ ruleConfig.getKeyGenerateStrategies().put("foo_sequence_strategy",
createSequenceKeyGenerateStrategyRuleConfiguration("bar_keygen"));
+ assertThrows(UnregisteredAlgorithmException.class, () ->
checker.check("foo_db", ruleConfig, Collections.emptyMap(),
Collections.emptyList()));
+ }
+
@Test
void assertCheckTableConfigurationFailed() {
ShardingRuleConfiguration ruleConfig = createRuleConfiguration();
@@ -174,4 +186,19 @@ class ShardingRuleConfigurationCheckerTest {
when(result.getKeyGenerateStrategy()).thenReturn(keyGenerateStrategyConfig);
return result;
}
+
+ private KeyGenerateStrategiesConfiguration
createColumnKeyGenerateStrategyRuleConfiguration(final String keyGeneratorName)
{
+ ColumnKeyGenerateStrategiesRuleConfiguration result = new
ColumnKeyGenerateStrategiesRuleConfiguration();
+ result.setKeyGeneratorName(keyGeneratorName);
+ result.setLogicTable("foo_tbl");
+ result.setKeyGenerateColumn("foo_col");
+ return result;
+ }
+
+ private KeyGenerateStrategiesConfiguration
createSequenceKeyGenerateStrategyRuleConfiguration(final String
keyGeneratorName) {
+ SequenceKeyGenerateStrategiesRuleConfiguration result = new
SequenceKeyGenerateStrategiesRuleConfiguration();
+ result.setKeyGeneratorName(keyGeneratorName);
+ result.setKeyGenerateSequence("foo_sequence");
+ return result;
+ }
}
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationEmptyCheckerTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationEmptyCheckerTest.java
index c45bbcd6feb..2e8456e0281 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationEmptyCheckerTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/config/ShardingRuleConfigurationEmptyCheckerTest.java
@@ -26,6 +26,7 @@ import
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleC
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableReferenceRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.ColumnKeyGenerateStrategiesRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
import org.junit.jupiter.api.BeforeEach;
@@ -101,6 +102,13 @@ class ShardingRuleConfigurationEmptyCheckerTest {
assertFalse(checker.isEmpty(ruleConfig));
}
+ @Test
+ void assertIsNotEmptyWithKeyGenerateStrategies() {
+ ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
+ ruleConfig.getKeyGenerateStrategies().put("foo_key_generate_strategy",
new ColumnKeyGenerateStrategiesRuleConfiguration());
+ assertFalse(checker.isEmpty(ruleConfig));
+ }
+
@Test
void assertIsNotEmptyWithShardingAlgorithms() {
ShardingRuleConfiguration ruleConfig = new ShardingRuleConfiguration();
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/KeyGenerateStrategyRuleChangedProcessorTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/KeyGenerateStrategyRuleChangedProcessorTest.java
new file mode 100644
index 00000000000..b5fbfb2d4ef
--- /dev/null
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/changed/KeyGenerateStrategyRuleChangedProcessorTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.sharding.rule.changed;
+
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
+import org.apache.shardingsphere.mode.spi.rule.RuleChangedItemType;
+import
org.apache.shardingsphere.mode.spi.rule.RuleItemConfigurationChangedProcessor;
+import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.ColumnKeyGenerateStrategiesRuleConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategiesConfiguration;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
+import
org.apache.shardingsphere.sharding.yaml.config.strategy.keygen.YamlKeyGenerateStrategyRuleConfiguration;
+import org.hamcrest.CoreMatchers;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class KeyGenerateStrategyRuleChangedProcessorTest {
+
+ @SuppressWarnings("unchecked")
+ private final
RuleItemConfigurationChangedProcessor<ShardingRuleConfiguration,
KeyGenerateStrategiesConfiguration> processor = TypedSPILoader.getService(
+ RuleItemConfigurationChangedProcessor.class, new
RuleChangedItemType("sharding", "key_generate_strategies"));
+
+ @Test
+ void assertSwapRuleItemConfiguration() {
+ KeyGenerateStrategiesConfiguration actual =
processor.swapRuleItemConfiguration(null, createYAMLContent());
+ assertThat(actual,
CoreMatchers.isA(KeyGenerateStrategiesConfiguration.class));
+ assertThat(actual.getKeyGeneratorName(), is("foo_algo"));
+ assertThat(((ColumnKeyGenerateStrategiesRuleConfiguration)
actual).getLogicTable(), is("foo_tbl"));
+ assertThat(((ColumnKeyGenerateStrategiesRuleConfiguration)
actual).getKeyGenerateColumn(), is("foo_col"));
+ }
+
+ private String createYAMLContent() {
+ YamlKeyGenerateStrategyRuleConfiguration yamlConfig = new
YamlKeyGenerateStrategyRuleConfiguration();
+ yamlConfig.setKeyGenerateType("column");
+ yamlConfig.setKeyGeneratorName("foo_algo");
+ yamlConfig.setLogicTable("foo_tbl");
+ yamlConfig.setKeyGenerateColumn("foo_col");
+ return YamlEngine.marshal(yamlConfig);
+ }
+
+ @Test
+ void assertFindRuleConfiguration() {
+ ShardingRuleConfiguration ruleConfig =
mock(ShardingRuleConfiguration.class);
+ assertThat(processor.findRuleConfiguration(mockDatabase(ruleConfig)),
is(ruleConfig));
+ }
+
+ private ShardingSphereDatabase mockDatabase(final
ShardingRuleConfiguration ruleConfig) {
+ ShardingRule rule = mock(ShardingRule.class);
+ when(rule.getConfiguration()).thenReturn(ruleConfig);
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
+ when(result.getRuleMetaData()).thenReturn(new
RuleMetaData(Collections.singleton(rule)));
+ return result;
+ }
+
+ @Test
+ void assertChangeRuleItemConfiguration() {
+ ColumnKeyGenerateStrategiesRuleConfiguration toBeChangedItemConfig =
new ColumnKeyGenerateStrategiesRuleConfiguration();
+ toBeChangedItemConfig.setKeyGeneratorName("foo_algo");
+ toBeChangedItemConfig.setLogicTable("foo_tbl");
+ toBeChangedItemConfig.setKeyGenerateColumn("foo_col");
+ ShardingRuleConfiguration currentRuleConfig = new
ShardingRuleConfiguration();
+ processor.changeRuleItemConfiguration("foo_strategy",
currentRuleConfig, toBeChangedItemConfig);
+ assertThat(currentRuleConfig.getKeyGenerateStrategies().size(), is(1));
+ assertThat(((ColumnKeyGenerateStrategiesRuleConfiguration)
currentRuleConfig.getKeyGenerateStrategies().get("foo_strategy")).getLogicTable(),
is("foo_tbl"));
+ }
+
+ @Test
+ void assertDropRuleItemConfiguration() {
+ ShardingRuleConfiguration currentRuleConfig = new
ShardingRuleConfiguration();
+ currentRuleConfig.getKeyGenerateStrategies().put("foo_strategy", new
ColumnKeyGenerateStrategiesRuleConfiguration());
+ processor.dropRuleItemConfiguration("foo_strategy", currentRuleConfig);
+ assertTrue(currentRuleConfig.getKeyGenerateStrategies().isEmpty());
+ }
+}
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/yaml/ShardingConfigurationYamlRuleNodeTupleSwapperEngineIT.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/yaml/ShardingConfigurationYamlRuleNodeTupleSwapperEngineIT.java
index 4fecbc05b8b..64ef4a89872 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/yaml/ShardingConfigurationYamlRuleNodeTupleSwapperEngineIT.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/yaml/ShardingConfigurationYamlRuleNodeTupleSwapperEngineIT.java
@@ -36,7 +36,7 @@ class ShardingConfigurationYamlRuleNodeTupleSwapperEngineIT
extends YamlRuleNode
@Override
protected void assertRuleNodeTuples(final List<RuleNodeTuple>
actualTuples, final YamlRuleConfiguration expectedYamlRuleConfig) {
- assertThat(actualTuples.size(), is(19));
+ assertThat(actualTuples.size(), is(21));
assertRuleNodeTuple(actualTuples.get(0),
"sharding_algorithms/core_standard_fixture",
((YamlShardingRuleConfiguration)
expectedYamlRuleConfig).getShardingAlgorithms().get("core_standard_fixture"));
assertRuleNodeTuple(actualTuples.get(1),
@@ -58,7 +58,9 @@ class ShardingConfigurationYamlRuleNodeTupleSwapperEngineIT
extends YamlRuleNode
assertRuleNodeTuple(actualTuples.get(15), "binding_tables" +
actualTuples.get(15).getPath().substring(actualTuples.get(15).getPath().lastIndexOf("/")),
new ArrayList<>(((YamlShardingRuleConfiguration)
expectedYamlRuleConfig).getBindingTables()).get(0));
assertRuleNodeTuple(actualTuples.get(16), "binding_tables/foo", new
ArrayList<>(((YamlShardingRuleConfiguration)
expectedYamlRuleConfig).getBindingTables()).get(1));
- assertRuleNodeTuple(actualTuples.get(17), "default_sharding_column",
((YamlShardingRuleConfiguration)
expectedYamlRuleConfig).getDefaultShardingColumn());
- assertRuleNodeTuple(actualTuples.get(18), "sharding_cache",
((YamlShardingRuleConfiguration) expectedYamlRuleConfig).getShardingCache());
+ assertRuleNodeTuple(actualTuples.get(17),
"key_generate_strategies/t_order", ((YamlShardingRuleConfiguration)
expectedYamlRuleConfig).getKeyGenerateStrategies().get("t_order"));
+ assertRuleNodeTuple(actualTuples.get(18),
"key_generate_strategies/id_sequence", ((YamlShardingRuleConfiguration)
expectedYamlRuleConfig).getKeyGenerateStrategies().get("id_sequence"));
+ assertRuleNodeTuple(actualTuples.get(19), "default_sharding_column",
((YamlShardingRuleConfiguration)
expectedYamlRuleConfig).getDefaultShardingColumn());
+ assertRuleNodeTuple(actualTuples.get(20), "sharding_cache",
((YamlShardingRuleConfiguration) expectedYamlRuleConfig).getShardingCache());
}
}
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/yaml/ShardingRuleConfigurationYamlIT.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/yaml/ShardingRuleConfigurationYamlIT.java
index cfdfbe81473..3237c5f1af5 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/yaml/ShardingRuleConfigurationYamlIT.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/yaml/ShardingRuleConfigurationYamlIT.java
@@ -27,7 +27,10 @@ import
org.apache.shardingsphere.sharding.api.config.cache.ShardingCacheOptionsC
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableReferenceRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.ColumnKeyGenerateStrategiesRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategiesConfiguration;
+import
org.apache.shardingsphere.sharding.api.config.strategy.keygen.SequenceKeyGenerateStrategiesRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.ComplexShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.HintShardingStrategyConfiguration;
import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
@@ -74,6 +77,8 @@ class ShardingRuleConfigurationYamlIT extends
YamlRuleConfigurationIT {
result.setDefaultShardingColumn("order_id");
result.setDefaultKeyGenerateStrategy(new
KeyGenerateStrategyConfiguration("id", "snowflake"));
result.setDefaultAuditStrategy(new
ShardingAuditStrategyConfiguration(Collections.singletonList("sharding_key_required_auditor"),
true));
+ result.getKeyGenerateStrategies().put("t_order",
createColumnKeyGenerateStrategyRuleConfiguration());
+ result.getKeyGenerateStrategies().put("id_sequence",
createSequenceKeyGenerateStrategyRuleConfiguration());
result.getShardingAlgorithms().put("core_standard_fixture", new
AlgorithmConfiguration("CORE.STANDARD.FIXTURE", new Properties()));
result.getShardingAlgorithms().put("core_complex_fixture", new
AlgorithmConfiguration("CORE.COMPLEX.FIXTURE", new Properties()));
result.getShardingAlgorithms().put("core_hint_fixture", new
AlgorithmConfiguration("CORE.HINT.FIXTURE", new Properties()));
@@ -98,6 +103,7 @@ class ShardingRuleConfigurationYamlIT extends
YamlRuleConfigurationIT {
assertTOrder(actual);
assertTOrderItem(actual);
assertBindingTable(actual);
+ assertKeyGenerateStrategies(actual);
assertShardingCache(actual);
assertThat(actual.getDefaultShardingColumn(), is("order_id"));
}
@@ -136,6 +142,17 @@ class ShardingRuleConfigurationYamlIT extends
YamlRuleConfigurationIT {
assertThat(new ArrayList<>(actual.getBindingTables()).get(0),
is("foo:t_order, t_order_item"));
}
+ private void assertKeyGenerateStrategies(final
YamlShardingRuleConfiguration actual) {
+ assertThat(actual.getKeyGenerateStrategies().size(), is(2));
+
assertThat(actual.getKeyGenerateStrategies().get("t_order").getKeyGenerateType(),
is("column"));
+
assertThat(actual.getKeyGenerateStrategies().get("t_order").getKeyGeneratorName(),
is("snowflake"));
+
assertThat(actual.getKeyGenerateStrategies().get("t_order").getLogicTable(),
is("t_order"));
+
assertThat(actual.getKeyGenerateStrategies().get("t_order").getKeyGenerateColumn(),
is("id"));
+
assertThat(actual.getKeyGenerateStrategies().get("id_sequence").getKeyGenerateType(),
is("sequence"));
+
assertThat(actual.getKeyGenerateStrategies().get("id_sequence").getKeyGeneratorName(),
is("snowflake"));
+
assertThat(actual.getKeyGenerateStrategies().get("id_sequence").getKeyGenerateSequence(),
is("sequence_name"));
+ }
+
private void assertShardingCache(final YamlShardingRuleConfiguration
actual) {
YamlShardingCacheConfiguration actualShardingCache =
actual.getShardingCache();
assertThat(actualShardingCache.getAllowedMaxSqlLength(), is(512));
@@ -144,4 +161,19 @@ class ShardingRuleConfigurationYamlIT extends
YamlRuleConfigurationIT {
assertThat(actualRouteCacheConfig.getMaximumSize(), is(262144));
assertTrue(actualRouteCacheConfig.isSoftValues());
}
+
+ private static KeyGenerateStrategiesConfiguration
createColumnKeyGenerateStrategyRuleConfiguration() {
+ ColumnKeyGenerateStrategiesRuleConfiguration result = new
ColumnKeyGenerateStrategiesRuleConfiguration();
+ result.setKeyGeneratorName("snowflake");
+ result.setLogicTable("t_order");
+ result.setKeyGenerateColumn("id");
+ return result;
+ }
+
+ private static KeyGenerateStrategiesConfiguration
createSequenceKeyGenerateStrategyRuleConfiguration() {
+ SequenceKeyGenerateStrategiesRuleConfiguration result = new
SequenceKeyGenerateStrategiesRuleConfiguration();
+ result.setKeyGeneratorName("snowflake");
+ result.setKeyGenerateSequence("sequence_name");
+ return result;
+ }
}
diff --git
a/features/sharding/core/src/test/resources/yaml/sharding-rule-for-tuple.yaml
b/features/sharding/core/src/test/resources/yaml/sharding-rule-for-tuple.yaml
index 77e669e608e..9b37fc1e132 100644
---
a/features/sharding/core/src/test/resources/yaml/sharding-rule-for-tuple.yaml
+++
b/features/sharding/core/src/test/resources/yaml/sharding-rule-for-tuple.yaml
@@ -68,6 +68,16 @@ rules:
auditorNames:
- sharding_key_required_auditor
allowHintDisable: true
+ keyGenerateStrategies:
+ t_order:
+ keyGenerateType: column
+ keyGeneratorName: snowflake
+ logicTable: t_order
+ keyGenerateColumn: id
+ id_sequence:
+ keyGenerateType: sequence
+ keyGeneratorName: snowflake
+ keyGenerateSequence: sequence_name
shardingAlgorithms:
core_standard_fixture:
diff --git a/features/sharding/core/src/test/resources/yaml/sharding-rule.yaml
b/features/sharding/core/src/test/resources/yaml/sharding-rule.yaml
index 0f2944e4028..16ba2e83fd9 100644
--- a/features/sharding/core/src/test/resources/yaml/sharding-rule.yaml
+++ b/features/sharding/core/src/test/resources/yaml/sharding-rule.yaml
@@ -67,6 +67,16 @@ rules:
auditorNames:
- sharding_key_required_auditor
allowHintDisable: true
+ keyGenerateStrategies:
+ t_order:
+ keyGenerateType: column
+ keyGeneratorName: snowflake
+ logicTable: t_order
+ keyGenerateColumn: id
+ id_sequence:
+ keyGenerateType: sequence
+ keyGeneratorName: snowflake
+ keyGenerateSequence: sequence_name
shardingAlgorithms:
core_standard_fixture: