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:

Reply via email to