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 6b127cb3a13 Refactor KeyGenerateAlgorithm interface for algorithm 
reuse (#29256)
6b127cb3a13 is described below

commit 6b127cb3a134dd9e93e29063444df624f04bcf22
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Dec 6 10:43:12 2023 +0800

    Refactor KeyGenerateAlgorithm interface for algorithm reuse (#29256)
    
    * Refactor KeyGenerateAlgorithm interface for algorithm reuse
    
    * Modify unit test and fixture
---
 .../InsertClauseShardingConditionEngine.java       | 18 ++++----
 .../shardingsphere/sharding/rule/ShardingRule.java | 14 +++---
 .../AutoIncrementKeyGenerateAlgorithmFixture.java  |  8 +++-
 .../sharding/rule/ShardingRuleTest.java            | 17 +++++--
 .../keygen/DistSQLKeyGenerateAlgorithmFixture.java | 10 +++-
 .../core/algorithm/KeyGenerateAlgorithm.java       | 11 +++--
 .../keygen/core/context/KeyGenerateContext.java    | 26 ++++++-----
 .../algorithm/SnowflakeKeyGenerateAlgorithm.java   | 13 +++++-
 .../SnowflakeKeyGenerateAlgorithmTest.java         | 54 +++++++++++-----------
 .../uuid/algorithm/UUIDKeyGenerateAlgorithm.java   | 13 +++++-
 .../algorithm/UUIDKeyGenerateAlgorithmTest.java    |  5 +-
 .../IncrementKeyGenerateAlgorithmFixture.java      |  8 +++-
 .../ResetIncrementKeyGenerateAlgorithmFixture.java |  8 +++-
 ...ITAutoIncrementKeyGenerateAlgorithmFixture.java |  8 +++-
 .../e2e/fixture/ITKeyGenerateAlgorithmFixture.java |  8 +++-
 .../general/PostgreSQLMigrationGeneralE2EIT.java   |  4 +-
 .../primarykey/IndexesMigrationE2EIT.java          | 14 +++---
 .../pipeline/cases/task/MySQLIncrementTask.java    |  5 +-
 .../cases/task/PostgreSQLIncrementTask.java        |  6 ++-
 .../framework/helper/PipelineCaseHelper.java       | 15 +++---
 .../util/AutoIncrementKeyGenerateAlgorithm.java    |  8 +++-
 .../keygen/RewriteKeyGenerateAlgorithmFixture.java |  9 +++-
 22 files changed, 188 insertions(+), 94 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
index d0ae2515d2d..cc5ee932804 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
@@ -18,16 +18,17 @@
 package org.apache.shardingsphere.sharding.route.engine.condition.engine;
 
 import lombok.RequiredArgsConstructor;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.data.InsertColumnsAndValuesMismatchedException;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.NoSuchTableException;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.GeneratedKeyContext;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.values.InsertValueContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
+import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.data.InsertColumnsAndValuesMismatchedException;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.NoSuchTableException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ExpressionConditionUtils;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.value.ListShardingConditionValue;
@@ -47,8 +48,6 @@ import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 
 /**
  * Sharding condition engine for insert clause.
@@ -173,7 +172,10 @@ public final class InsertClauseShardingConditionEngine {
         Optional<GeneratedKeyContext> generatedKey = 
sqlStatementContext.getGeneratedKeyContext();
         String tableName = 
sqlStatementContext.getSqlStatement().getTable().getTableName().getIdentifier().getValue();
         if (generatedKey.isPresent() && generatedKey.get().isGenerated() && 
shardingRule.findTableRule(tableName).isPresent()) {
-            
generatedKey.get().getGeneratedValues().addAll(generateKeys(tableName, 
sqlStatementContext.getValueListCount()));
+            String schemaName =
+                    
sqlStatementContext.getTablesContext().getSchemaName().orElseGet(() -> new 
DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(database.getName()));
+            generatedKey.get().getGeneratedValues()
+                    .addAll(shardingRule.generateKeys(new 
KeyGenerateContext(database.getName(), schemaName, tableName, 
generatedKey.get().getColumnName()), sqlStatementContext.getValueListCount()));
             
generatedKey.get().setSupportAutoIncrement(shardingRule.isSupportAutoIncrement(tableName));
             if 
(shardingRule.findShardingColumn(generatedKey.get().getColumnName(), 
tableName).isPresent()) {
                 appendGeneratedKeyCondition(generatedKey.get(), tableName, 
shardingConditions);
@@ -181,10 +183,6 @@ public final class InsertClauseShardingConditionEngine {
         }
     }
     
-    private Collection<Comparable<?>> generateKeys(final String tableName, 
final int valueListCount) {
-        return IntStream.range(0, valueListCount).mapToObj(each -> 
shardingRule.generateKey(tableName)).collect(Collectors.toList());
-    }
-    
     private void appendGeneratedKeyCondition(final GeneratedKeyContext 
generatedKey, final String tableName, final List<ShardingCondition> 
shardingConditions) {
         Iterator<Comparable<?>> generatedValuesIterator = 
generatedKey.getGeneratedValues().iterator();
         for (ShardingCondition each : shardingConditions) {
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
index e1f69d89567..67f2b46ac2e 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/ShardingRule.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.datanode.DataNode;
+import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.instance.InstanceContextAware;
@@ -34,9 +35,9 @@ import 
org.apache.shardingsphere.infra.rule.identifier.scope.DatabaseRule;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.TableNamesMapper;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.keygen.core.exception.algorithm.GenerateKeyStrategyNotFoundException;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
@@ -615,13 +616,14 @@ public final class ShardingRule implements DatabaseRule, 
DataNodeContainedRule,
     }
     
     /**
-     * Find the Generated key of logic table.
+     * Find the generated keys of logic table.
      *
-     * @param logicTableName logic table name
-     * @return generated key
+     * @param keyGenerateContext key generate context 
+     * @param keyGenerateCount key generate count
+     * @return generated keys
      */
-    public Comparable<?> generateKey(final String logicTableName) {
-        return getKeyGenerateAlgorithm(logicTableName).generateKey();
+    public Collection<? extends Comparable<?>> generateKeys(final 
KeyGenerateContext keyGenerateContext, final int keyGenerateCount) {
+        return 
getKeyGenerateAlgorithm(keyGenerateContext.getTableName()).generateKeys(keyGenerateContext,
 keyGenerateCount);
     }
     
     private KeyGenerateAlgorithm getKeyGenerateAlgorithm(final String 
logicTableName) {
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/fixture/AutoIncrementKeyGenerateAlgorithmFixture.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/fixture/AutoIncrementKeyGenerateAlgorithmFixture.java
index a2533d6c055..4358fcc60f1 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/fixture/AutoIncrementKeyGenerateAlgorithmFixture.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/fixture/AutoIncrementKeyGenerateAlgorithmFixture.java
@@ -19,8 +19,12 @@ package 
org.apache.shardingsphere.sharding.algorithm.keygen.fixture;
 
 import lombok.Getter;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 
+import java.util.Collection;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 @Getter
 public final class AutoIncrementKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm {
@@ -28,8 +32,8 @@ public final class AutoIncrementKeyGenerateAlgorithmFixture 
implements KeyGenera
     private final AtomicInteger count = new AtomicInteger();
     
     @Override
-    public Comparable<?> generateKey() {
-        return count.incrementAndGet();
+    public Collection<Comparable<?>> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        return IntStream.range(0, keyGenerateCount).mapToObj(each -> 
count.incrementAndGet()).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
index 8ec0df9b69f..3dbd2fea9a3 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.infra.instance.InstanceContext;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.keygen.core.exception.algorithm.GenerateKeyStrategyNotFoundException;
 import 
org.apache.shardingsphere.keygen.snowflake.algorithm.SnowflakeKeyGenerateAlgorithm;
 import 
org.apache.shardingsphere.keygen.uuid.algorithm.UUIDKeyGenerateAlgorithm;
@@ -316,7 +317,9 @@ class ShardingRuleTest {
     
     @Test
     void assertGenerateKeyFailure() {
-        assertThrows(GenerateKeyStrategyNotFoundException.class, () -> 
createMaximumShardingRule().generateKey("table_0"));
+        KeyGenerateContext generateContext = mock(KeyGenerateContext.class);
+        when(generateContext.getTableName()).thenReturn("table_0");
+        assertThrows(GenerateKeyStrategyNotFoundException.class, () -> 
createMaximumShardingRule().generateKeys(generateContext, 1));
     }
     
     @Test
@@ -394,12 +397,20 @@ class ShardingRuleTest {
     
     @Test
     void assertGenerateKeyWithDefaultKeyGenerator() {
-        assertThat(createMinimumShardingRule().generateKey("logic_table"), 
instanceOf(Long.class));
+        KeyGenerateContext generateContext = mock(KeyGenerateContext.class);
+        when(generateContext.getTableName()).thenReturn("logic_table");
+        Collection<? extends Comparable<?>> actual = 
createMinimumShardingRule().generateKeys(generateContext, 1);
+        assertThat(actual.size(), is(1));
+        assertThat(actual.iterator().next(), instanceOf(Long.class));
     }
     
     @Test
     void assertGenerateKeyWithKeyGenerator() {
-        assertThat(createMaximumShardingRule().generateKey("logic_table"), 
instanceOf(String.class));
+        KeyGenerateContext generateContext = mock(KeyGenerateContext.class);
+        when(generateContext.getTableName()).thenReturn("logic_table");
+        Collection<? extends Comparable<?>> actual = 
createMaximumShardingRule().generateKeys(generateContext, 1);
+        assertThat(actual.size(), is(1));
+        assertThat(actual.iterator().next(), instanceOf(String.class));
     }
     
     @Test
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/fixture/keygen/DistSQLKeyGenerateAlgorithmFixture.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/fixture/keygen/DistSQLKeyGenerateAlgorithmFixture.java
index 4bbd012d604..66884564b46 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/fixture/keygen/DistSQLKeyGenerateAlgorithmFixture.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/fixture/keygen/DistSQLKeyGenerateAlgorithmFixture.java
@@ -18,12 +18,18 @@
 package org.apache.shardingsphere.sharding.distsql.fixture.keygen;
 
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
+
+import java.util.Collection;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public final class DistSQLKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm {
     
     @Override
-    public Comparable<?> generateKey() {
-        return 0L;
+    public Collection<Comparable<?>> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        return IntStream.range(0, keyGenerateCount).mapToObj(each -> 
0L).collect(Collectors.toList());
+        
     }
     
     @Override
diff --git 
a/infra/algorithm/key-generator/core/src/main/java/org/apache/shardingsphere/keygen/core/algorithm/KeyGenerateAlgorithm.java
 
b/infra/algorithm/key-generator/core/src/main/java/org/apache/shardingsphere/keygen/core/algorithm/KeyGenerateAlgorithm.java
index 638636a960b..538b3acf43c 100644
--- 
a/infra/algorithm/key-generator/core/src/main/java/org/apache/shardingsphere/keygen/core/algorithm/KeyGenerateAlgorithm.java
+++ 
b/infra/algorithm/key-generator/core/src/main/java/org/apache/shardingsphere/keygen/core/algorithm/KeyGenerateAlgorithm.java
@@ -18,6 +18,9 @@
 package org.apache.shardingsphere.keygen.core.algorithm;
 
 import org.apache.shardingsphere.infra.algorithm.ShardingSphereAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
+
+import java.util.Collection;
 
 /**
  * Key generate algorithm.
@@ -25,11 +28,13 @@ import 
org.apache.shardingsphere.infra.algorithm.ShardingSphereAlgorithm;
 public interface KeyGenerateAlgorithm extends ShardingSphereAlgorithm {
     
     /**
-     * Generate key.
+     * Generate keys.
      * 
-     * @return generated key
+     * @param keyGenerateContext key generate context 
+     * @param keyGenerateCount key generate count
+     * @return generated keys
      */
-    Comparable<?> generateKey();
+    Collection<? extends Comparable<?>> generateKeys(KeyGenerateContext 
keyGenerateContext, int keyGenerateCount);
     
     /**
      * Judge whether support auto increment or not.
diff --git 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/fixture/keygen/RewriteKeyGenerateAlgorithmFixture.java
 
b/infra/algorithm/key-generator/core/src/main/java/org/apache/shardingsphere/keygen/core/context/KeyGenerateContext.java
similarity index 67%
copy from 
test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/fixture/keygen/RewriteKeyGenerateAlgorithmFixture.java
copy to 
infra/algorithm/key-generator/core/src/main/java/org/apache/shardingsphere/keygen/core/context/KeyGenerateContext.java
index 40820915117..b7d3577ff02 100644
--- 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/fixture/keygen/RewriteKeyGenerateAlgorithmFixture.java
+++ 
b/infra/algorithm/key-generator/core/src/main/java/org/apache/shardingsphere/keygen/core/context/KeyGenerateContext.java
@@ -15,19 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.it.rewrite.fixture.keygen;
+package org.apache.shardingsphere.keygen.core.context;
 
-import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 
-public final class RewriteKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm {
+/**
+ * Key generate context.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class KeyGenerateContext {
+    
+    private final String databaseName;
+    
+    private final String schemaName;
     
-    @Override
-    public Long generateKey() {
-        return 1L;
-    }
+    private final String tableName;
     
-    @Override
-    public String getType() {
-        return "REWRITE.FIXTURE";
-    }
+    private final String columnName;
 }
diff --git 
a/infra/algorithm/key-generator/type/snowflake/src/main/java/org/apache/shardingsphere/keygen/snowflake/algorithm/SnowflakeKeyGenerateAlgorithm.java
 
b/infra/algorithm/key-generator/type/snowflake/src/main/java/org/apache/shardingsphere/keygen/snowflake/algorithm/SnowflakeKeyGenerateAlgorithm.java
index 95fe29dcca2..23ca0c2c350 100644
--- 
a/infra/algorithm/key-generator/type/snowflake/src/main/java/org/apache/shardingsphere/keygen/snowflake/algorithm/SnowflakeKeyGenerateAlgorithm.java
+++ 
b/infra/algorithm/key-generator/type/snowflake/src/main/java/org/apache/shardingsphere/keygen/snowflake/algorithm/SnowflakeKeyGenerateAlgorithm.java
@@ -23,12 +23,15 @@ import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePrecondition
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.instance.InstanceContextAware;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.keygen.core.exception.algorithm.KeyGenerateAlgorithmInitializationException;
 import 
org.apache.shardingsphere.keygen.snowflake.exception.SnowflakeClockMoveBackException;
 
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
@@ -118,7 +121,15 @@ public final class SnowflakeKeyGenerateAlgorithm 
implements KeyGenerateAlgorithm
     }
     
     @Override
-    public synchronized Long generateKey() {
+    public Collection<Long> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        Collection<Long> result = new LinkedList<>();
+        for (int index = 0; index < keyGenerateCount; index++) {
+            result.add(generateKey());
+        }
+        return result;
+    }
+    
+    private synchronized Long generateKey() {
         long currentMillis = timeService.getCurrentMillis();
         if (waitTolerateTimeDifferenceIfNeed(currentMillis)) {
             currentMillis = timeService.getCurrentMillis();
diff --git 
a/infra/algorithm/key-generator/type/snowflake/src/test/java/org/apache/shardingsphere/keygen/snowflake/algorithm/SnowflakeKeyGenerateAlgorithmTest.java
 
b/infra/algorithm/key-generator/type/snowflake/src/test/java/org/apache/shardingsphere/keygen/snowflake/algorithm/SnowflakeKeyGenerateAlgorithmTest.java
index d5ff80bed73..a58832cce56 100644
--- 
a/infra/algorithm/key-generator/type/snowflake/src/test/java/org/apache/shardingsphere/keygen/snowflake/algorithm/SnowflakeKeyGenerateAlgorithmTest.java
+++ 
b/infra/algorithm/key-generator/type/snowflake/src/test/java/org/apache/shardingsphere/keygen/snowflake/algorithm/SnowflakeKeyGenerateAlgorithmTest.java
@@ -28,6 +28,7 @@ import org.apache.shardingsphere.infra.lock.LockContext;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.keygen.core.exception.algorithm.KeyGenerateAlgorithmInitializationException;
 import 
org.apache.shardingsphere.keygen.snowflake.exception.SnowflakeClockMoveBackException;
 import org.apache.shardingsphere.keygen.snowflake.fixture.FixedTimeService;
@@ -40,11 +41,12 @@ import org.mockito.internal.configuration.plugins.Plugins;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
 import java.util.Set;
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -82,7 +84,7 @@ class SnowflakeKeyGenerateAlgorithmTest {
         }
         Set<Comparable<?>> actual = new HashSet<>(taskNumber, 1F);
         for (int i = 0; i < taskNumber; i++) {
-            actual.add(executor.submit((Callable<Comparable<?>>) 
algorithm::generateKey).get());
+            actual.addAll(executor.submit(() -> 
algorithm.generateKeys(mock(KeyGenerateContext.class), 1)).get());
         }
         assertThat(actual.size(), is(taskNumber));
     }
@@ -96,9 +98,7 @@ class SnowflakeKeyGenerateAlgorithmTest {
         }
         List<Comparable<?>> expected = Arrays.asList(0L, 4194305L, 4194306L, 
8388608L, 8388609L, 12582913L, 12582914L, 16777216L, 16777217L, 20971521L);
         List<Comparable<?>> actual = new ArrayList<>(DEFAULT_KEY_AMOUNT);
-        for (int i = 0; i < DEFAULT_KEY_AMOUNT; i++) {
-            actual.add(algorithm.generateKey());
-        }
+        actual.addAll(algorithm.generateKeys(mock(KeyGenerateContext.class), 
DEFAULT_KEY_AMOUNT));
         assertThat(actual, is(expected));
     }
     
@@ -109,11 +109,14 @@ class SnowflakeKeyGenerateAlgorithmTest {
         if (algorithm instanceof InstanceContextAware) {
             ((InstanceContextAware) algorithm).setInstanceContext(INSTANCE);
         }
-        assertThat(algorithm.generateKey(), is(0L));
-        assertThat(algorithm.generateKey(), is(1L));
-        assertThat(algorithm.generateKey(), is(2L));
-        assertThat(algorithm.generateKey(), is(3L));
-        assertThat(algorithm.generateKey(), is(4L));
+        Collection<? extends Comparable<?>> actual = 
algorithm.generateKeys(mock(KeyGenerateContext.class), 5);
+        assertThat(actual.size(), is(5));
+        Iterator<? extends Comparable<?>> iterator = actual.iterator();
+        assertThat(iterator.next(), is(0L));
+        assertThat(iterator.next(), is(1L));
+        assertThat(iterator.next(), is(2L));
+        assertThat(iterator.next(), is(3L));
+        assertThat(iterator.next(), is(4L));
     }
     
     @Test
@@ -123,19 +126,19 @@ class SnowflakeKeyGenerateAlgorithmTest {
         if (algorithm instanceof InstanceContextAware) {
             ((InstanceContextAware) algorithm).setInstanceContext(INSTANCE);
         }
-        String actualGenerateKey0 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKey().toString()));
+        String actualGenerateKey0 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKeys(mock(KeyGenerateContext.class),
 1).iterator().next().toString()));
         
assertThat(Integer.parseInt(actualGenerateKey0.substring(actualGenerateKey0.length()
 - 3), 2), is(0));
         Awaitility.await().pollDelay(2L, TimeUnit.MILLISECONDS).until(() -> 
true);
-        String actualGenerateKey1 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKey().toString()));
+        String actualGenerateKey1 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKeys(mock(KeyGenerateContext.class),
 1).iterator().next().toString()));
         
assertThat(Integer.parseInt(actualGenerateKey1.substring(actualGenerateKey1.length()
 - 3), 2), is(1));
         Awaitility.await().pollDelay(2L, TimeUnit.MILLISECONDS).until(() -> 
true);
-        String actualGenerateKey2 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKey().toString()));
+        String actualGenerateKey2 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKeys(mock(KeyGenerateContext.class),
 1).iterator().next().toString()));
         
assertThat(Integer.parseInt(actualGenerateKey2.substring(actualGenerateKey2.length()
 - 3), 2), is(2));
         Awaitility.await().pollDelay(2L, TimeUnit.MILLISECONDS).until(() -> 
true);
-        String actualGenerateKey3 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKey().toString()));
+        String actualGenerateKey3 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKeys(mock(KeyGenerateContext.class),
 1).iterator().next().toString()));
         
assertThat(Integer.parseInt(actualGenerateKey3.substring(actualGenerateKey3.length()
 - 3), 2), is(3));
         Awaitility.await().pollDelay(2L, TimeUnit.MILLISECONDS).until(() -> 
true);
-        String actualGenerateKey4 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKey().toString()));
+        String actualGenerateKey4 = 
Long.toBinaryString(Long.parseLong(algorithm.generateKeys(mock(KeyGenerateContext.class),
 1).iterator().next().toString()));
         
assertThat(Integer.parseInt(actualGenerateKey4.substring(actualGenerateKey4.length()
 - 3), 2), is(0));
     }
     
@@ -150,9 +153,7 @@ class SnowflakeKeyGenerateAlgorithmTest {
         setLastMillis(algorithm, timeService.getCurrentMillis() + 2);
         List<Comparable<?>> expected = Arrays.asList(4194304L, 8388609L, 
8388610L, 12582912L, 12582913L, 16777217L, 16777218L, 20971520L, 20971521L, 
25165825L);
         List<Comparable<?>> actual = new ArrayList<>(DEFAULT_KEY_AMOUNT);
-        for (int i = 0; i < DEFAULT_KEY_AMOUNT; i++) {
-            actual.add(algorithm.generateKey());
-        }
+        actual.addAll(algorithm.generateKeys(mock(KeyGenerateContext.class), 
DEFAULT_KEY_AMOUNT));
         assertThat(actual, is(expected));
     }
     
@@ -169,9 +170,7 @@ class SnowflakeKeyGenerateAlgorithmTest {
     }
     
     private void batchGenerate(final KeyGenerateAlgorithm algorithm) {
-        for (int i = 0; i < DEFAULT_KEY_AMOUNT; i++) {
-            algorithm.generateKey();
-        }
+        algorithm.generateKeys(mock(KeyGenerateContext.class), 
DEFAULT_KEY_AMOUNT);
     }
     
     @Test
@@ -186,9 +185,7 @@ class SnowflakeKeyGenerateAlgorithmTest {
         setSequence(algorithm, (1 << DEFAULT_SEQUENCE_BITS) - 1L);
         List<Comparable<?>> expected = Arrays.asList(4194304L, 4194305L, 
4194306L, 8388608L, 8388609L, 8388610L, 12582913L, 12582914L, 12582915L, 
16777216L);
         List<Comparable<?>> actual = new ArrayList<>(DEFAULT_KEY_AMOUNT);
-        for (int i = 0; i < DEFAULT_KEY_AMOUNT; i++) {
-            actual.add(algorithm.generateKey());
-        }
+        actual.addAll(algorithm.generateKeys(mock(KeyGenerateContext.class), 
DEFAULT_KEY_AMOUNT));
         assertThat(actual, is(expected));
     }
     
@@ -213,7 +210,8 @@ class SnowflakeKeyGenerateAlgorithmTest {
     @Test
     void assertSetMaxVibrationOffsetFailureWhenNegative() {
         assertThrows(KeyGenerateAlgorithmInitializationException.class,
-                () -> TypedSPILoader.getService(KeyGenerateAlgorithm.class, 
"SNOWFLAKE", PropertiesBuilder.build(new Property("max-vibration-offset", 
"-1"))).generateKey());
+                () -> TypedSPILoader.getService(KeyGenerateAlgorithm.class, 
"SNOWFLAKE", PropertiesBuilder.build(new Property("max-vibration-offset", 
"-1")))
+                        .generateKeys(mock(KeyGenerateContext.class), 1));
     }
     
     @Test
@@ -227,7 +225,8 @@ class SnowflakeKeyGenerateAlgorithmTest {
     @Test
     void assertSetMaxVibrationOffsetFailureWhenOutOfRange() {
         assertThrows(KeyGenerateAlgorithmInitializationException.class,
-                () -> TypedSPILoader.getService(KeyGenerateAlgorithm.class, 
"SNOWFLAKE", PropertiesBuilder.build(new Property("max-vibration-offset", 
"4096"))).generateKey());
+                () -> TypedSPILoader.getService(KeyGenerateAlgorithm.class, 
"SNOWFLAKE", PropertiesBuilder.build(new Property("max-vibration-offset", 
"4096")))
+                        .generateKeys(mock(KeyGenerateContext.class), 1));
     }
     
     @Test
@@ -239,6 +238,7 @@ class SnowflakeKeyGenerateAlgorithmTest {
     @Test
     void assertMaxTolerateTimeDifferenceMillisecondsWhenNegative() {
         assertThrows(KeyGenerateAlgorithmInitializationException.class,
-                () -> TypedSPILoader.getService(KeyGenerateAlgorithm.class, 
"SNOWFLAKE", PropertiesBuilder.build(new 
Property("max-tolerate-time-difference-milliseconds", "-1"))).generateKey());
+                () -> TypedSPILoader.getService(KeyGenerateAlgorithm.class, 
"SNOWFLAKE", PropertiesBuilder.build(new 
Property("max-tolerate-time-difference-milliseconds", "-1")))
+                        .generateKeys(mock(KeyGenerateContext.class), 1));
     }
 }
diff --git 
a/infra/algorithm/key-generator/type/uuid/src/main/java/org/apache/shardingsphere/keygen/uuid/algorithm/UUIDKeyGenerateAlgorithm.java
 
b/infra/algorithm/key-generator/type/uuid/src/main/java/org/apache/shardingsphere/keygen/uuid/algorithm/UUIDKeyGenerateAlgorithm.java
index 01cfa43b9c4..11b3866255b 100644
--- 
a/infra/algorithm/key-generator/type/uuid/src/main/java/org/apache/shardingsphere/keygen/uuid/algorithm/UUIDKeyGenerateAlgorithm.java
+++ 
b/infra/algorithm/key-generator/type/uuid/src/main/java/org/apache/shardingsphere/keygen/uuid/algorithm/UUIDKeyGenerateAlgorithm.java
@@ -18,7 +18,10 @@
 package org.apache.shardingsphere.keygen.uuid.algorithm;
 
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.UUID;
 import java.util.concurrent.ThreadLocalRandom;
 
@@ -28,8 +31,16 @@ import java.util.concurrent.ThreadLocalRandom;
 public final class UUIDKeyGenerateAlgorithm implements KeyGenerateAlgorithm {
     
     @Override
-    public String generateKey() {
+    public Collection<String> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        Collection<String> result = new LinkedList<>();
         ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
+        for (int index = 0; index < keyGenerateCount; index++) {
+            result.add(generateKey(threadLocalRandom));
+        }
+        return result;
+    }
+    
+    private String generateKey(final ThreadLocalRandom threadLocalRandom) {
         return new UUID(threadLocalRandom.nextLong(), 
threadLocalRandom.nextLong()).toString().replace("-", "");
     }
     
diff --git 
a/infra/algorithm/key-generator/type/uuid/src/test/java/org/apache/shardingsphere/keygen/uuid/algorithm/UUIDKeyGenerateAlgorithmTest.java
 
b/infra/algorithm/key-generator/type/uuid/src/test/java/org/apache/shardingsphere/keygen/uuid/algorithm/UUIDKeyGenerateAlgorithmTest.java
index b8c65e0eff7..7984c3cbae7 100644
--- 
a/infra/algorithm/key-generator/type/uuid/src/test/java/org/apache/shardingsphere/keygen/uuid/algorithm/UUIDKeyGenerateAlgorithmTest.java
+++ 
b/infra/algorithm/key-generator/type/uuid/src/test/java/org/apache/shardingsphere/keygen/uuid/algorithm/UUIDKeyGenerateAlgorithmTest.java
@@ -17,10 +17,12 @@
 
 package org.apache.shardingsphere.keygen.uuid.algorithm;
 
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.mock;
 
 class UUIDKeyGenerateAlgorithmTest {
     
@@ -28,6 +30,7 @@ class UUIDKeyGenerateAlgorithmTest {
     
     @Test
     void assertGenerateKey() {
-        assertThat(uuidKeyGenerateAlgorithm.generateKey().length(), is(32));
+        
assertThat(uuidKeyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class),
 1).size(), is(1));
+        
assertThat(uuidKeyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class),
 1).iterator().next().toString().length(), is(32));
     }
 }
diff --git 
a/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/fixture/keygen/IncrementKeyGenerateAlgorithmFixture.java
 
b/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/fixture/keygen/IncrementKeyGenerateAlgorithmFixture.java
index fa7a62222e3..0ffef02cad2 100644
--- 
a/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/fixture/keygen/IncrementKeyGenerateAlgorithmFixture.java
+++ 
b/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/fixture/keygen/IncrementKeyGenerateAlgorithmFixture.java
@@ -18,16 +18,20 @@
 package org.apache.shardingsphere.test.e2e.driver.fixture.keygen;
 
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 
+import java.util.Collection;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public final class IncrementKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm {
     
     private final AtomicInteger count = new AtomicInteger();
     
     @Override
-    public Comparable<?> generateKey() {
-        return count.incrementAndGet();
+    public Collection<Comparable<?>> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        return IntStream.range(0, keyGenerateCount).mapToObj(each -> 
count.incrementAndGet()).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/fixture/keygen/ResetIncrementKeyGenerateAlgorithmFixture.java
 
b/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/fixture/keygen/ResetIncrementKeyGenerateAlgorithmFixture.java
index 86fbc1e85b5..dfe814a3856 100644
--- 
a/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/fixture/keygen/ResetIncrementKeyGenerateAlgorithmFixture.java
+++ 
b/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/fixture/keygen/ResetIncrementKeyGenerateAlgorithmFixture.java
@@ -19,8 +19,12 @@ package 
org.apache.shardingsphere.test.e2e.driver.fixture.keygen;
 
 import lombok.Getter;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 
+import java.util.Collection;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public final class ResetIncrementKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm {
     
@@ -28,8 +32,8 @@ public final class ResetIncrementKeyGenerateAlgorithmFixture 
implements KeyGener
     private static final AtomicInteger COUNT = new AtomicInteger();
     
     @Override
-    public Comparable<?> generateKey() {
-        return COUNT.incrementAndGet();
+    public Collection<Comparable<?>> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        return IntStream.range(0, keyGenerateCount).mapToObj(each -> 
COUNT.incrementAndGet()).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/test/e2e/fixture/src/test/java/org/apache/shardingsphere/test/e2e/fixture/ITAutoIncrementKeyGenerateAlgorithmFixture.java
 
b/test/e2e/fixture/src/test/java/org/apache/shardingsphere/test/e2e/fixture/ITAutoIncrementKeyGenerateAlgorithmFixture.java
index 2610a331769..a6bbe57d40d 100644
--- 
a/test/e2e/fixture/src/test/java/org/apache/shardingsphere/test/e2e/fixture/ITAutoIncrementKeyGenerateAlgorithmFixture.java
+++ 
b/test/e2e/fixture/src/test/java/org/apache/shardingsphere/test/e2e/fixture/ITAutoIncrementKeyGenerateAlgorithmFixture.java
@@ -18,16 +18,20 @@
 package org.apache.shardingsphere.test.e2e.fixture;
 
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 
+import java.util.Collection;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public final class ITAutoIncrementKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm {
     
     private final AtomicLong idGenerator = new AtomicLong(1L);
     
     @Override
-    public Long generateKey() {
-        return idGenerator.getAndIncrement();
+    public Collection<Comparable<?>> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        return IntStream.range(0, keyGenerateCount).mapToObj(each -> 
idGenerator.getAndIncrement()).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/test/e2e/fixture/src/test/java/org/apache/shardingsphere/test/e2e/fixture/ITKeyGenerateAlgorithmFixture.java
 
b/test/e2e/fixture/src/test/java/org/apache/shardingsphere/test/e2e/fixture/ITKeyGenerateAlgorithmFixture.java
index ecb8baedbc9..e45b91550a4 100644
--- 
a/test/e2e/fixture/src/test/java/org/apache/shardingsphere/test/e2e/fixture/ITKeyGenerateAlgorithmFixture.java
+++ 
b/test/e2e/fixture/src/test/java/org/apache/shardingsphere/test/e2e/fixture/ITKeyGenerateAlgorithmFixture.java
@@ -20,8 +20,12 @@ package org.apache.shardingsphere.test.e2e.fixture;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.instance.InstanceContextAware;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 
+import java.util.Collection;
 import java.util.Properties;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public final class ITKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm, InstanceContextAware {
     
@@ -33,8 +37,8 @@ public final class ITKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm
     }
     
     @Override
-    public Long generateKey() {
-        return 1L;
+    public Collection<Comparable<?>> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        return IntStream.range(0, keyGenerateCount).mapToObj(each -> 
1L).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/general/PostgreSQLMigrationGeneralE2EIT.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/general/PostgreSQLMigrationGeneralE2EIT.java
index fa75ea6ec13..c6630b38117 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/general/PostgreSQLMigrationGeneralE2EIT.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/general/PostgreSQLMigrationGeneralE2EIT.java
@@ -22,6 +22,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import 
org.apache.shardingsphere.data.pipeline.scenario.migration.MigrationJobType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.keygen.snowflake.algorithm.SnowflakeKeyGenerateAlgorithm;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.cases.PipelineContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.cases.migration.AbstractMigrationE2EIT;
@@ -45,6 +46,7 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
 
 @PipelineE2ESettings(database = {
         @PipelineE2EDatabaseSettings(type = "PostgreSQL", scenarioFiles = 
"env/scenario/general/postgresql.xml"),
@@ -101,7 +103,7 @@ class PostgreSQLMigrationGeneralE2EIT extends 
AbstractMigrationE2EIT {
     private void checkOrderMigration(final PipelineContainerComposer 
containerComposer, final String jobId) throws SQLException {
         containerComposer.waitIncrementTaskFinished(String.format("SHOW 
MIGRATION STATUS '%s'", jobId));
         stopMigrationByJobId(containerComposer, jobId);
-        long recordId = new SnowflakeKeyGenerateAlgorithm().generateKey();
+        long recordId = new 
SnowflakeKeyGenerateAlgorithm().generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next();
         containerComposer.sourceExecuteWithLog(String.format("INSERT INTO %s 
(order_id,user_id,status) VALUES (%s, %s, '%s')",
                 String.join(".", PipelineContainerComposer.SCHEMA_NAME, 
SOURCE_TABLE_NAME), recordId, 1, "afterStop"));
         startMigrationByJobId(containerComposer, jobId);
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/primarykey/IndexesMigrationE2EIT.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/primarykey/IndexesMigrationE2EIT.java
index 02d96b941df..a4544592799 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/primarykey/IndexesMigrationE2EIT.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/migration/primarykey/IndexesMigrationE2EIT.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.infra.database.postgresql.type.PostgreSQLDataba
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.wrapper.SQLWrapperException;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.keygen.uuid.algorithm.UUIDKeyGenerateAlgorithm;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.cases.PipelineContainerComposer;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.cases.migration.AbstractMigrationE2EIT;
@@ -50,6 +51,7 @@ import java.util.function.Consumer;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
 
 /**
  * E2E IT for different types of indexes, includes:
@@ -94,9 +96,9 @@ class IndexesMigrationE2EIT extends AbstractMigrationE2EIT {
             // TODO PostgreSQL update delete events not support if table 
without unique keys at increment task.
             final Consumer<DataSource> incrementalTaskFn = dataSource -> {
                 if (containerComposer.getDatabaseType() instanceof 
MySQLDatabaseType) {
-                    doCreateUpdateDelete(containerComposer, 
keyGenerateAlgorithm.generateKey());
+                    doCreateUpdateDelete(containerComposer, 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next());
                 }
-                Object orderId = keyGenerateAlgorithm.generateKey();
+                Object orderId = 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next();
                 insertOneOrder(containerComposer, orderId);
                 containerComposer.assertOrderRecordExist(dataSource, 
"t_order", orderId);
             };
@@ -171,10 +173,10 @@ class IndexesMigrationE2EIT extends 
AbstractMigrationE2EIT {
                 return;
             }
             KeyGenerateAlgorithm keyGenerateAlgorithm = new 
UUIDKeyGenerateAlgorithm();
-            Object uniqueKey = keyGenerateAlgorithm.generateKey();
+            Object uniqueKey = 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next();
             assertMigrationSuccess(containerComposer, sql, "user_id", 
keyGenerateAlgorithm, consistencyCheckAlgorithmType, dataSource -> {
                 insertOneOrder(containerComposer, uniqueKey);
-                doCreateUpdateDelete(containerComposer, 
keyGenerateAlgorithm.generateKey());
+                doCreateUpdateDelete(containerComposer, 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next());
                 containerComposer.assertOrderRecordExist(dataSource, 
"t_order", uniqueKey);
             });
         }
@@ -194,10 +196,10 @@ class IndexesMigrationE2EIT extends 
AbstractMigrationE2EIT {
                 return;
             }
             KeyGenerateAlgorithm keyGenerateAlgorithm = new 
AutoIncrementKeyGenerateAlgorithm();
-            Object uniqueKey = keyGenerateAlgorithm.generateKey();
+            Object uniqueKey = 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next();
             assertMigrationSuccess(containerComposer, sql, "user_id", 
keyGenerateAlgorithm, consistencyCheckAlgorithmType, dataSource -> {
                 insertOneOrder(containerComposer, uniqueKey);
-                doCreateUpdateDelete(containerComposer, 
keyGenerateAlgorithm.generateKey());
+                doCreateUpdateDelete(containerComposer, 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next());
                 containerComposer.assertOrderRecordExist(dataSource, 
"t_order", uniqueKey);
             });
         }
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/task/MySQLIncrementTask.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/task/MySQLIncrementTask.java
index 5d9377152f0..d47185155ee 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/task/MySQLIncrementTask.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/task/MySQLIncrementTask.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.test.e2e.data.pipeline.cases.task;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.cases.base.BaseIncrementTask;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.util.DataSourceExecuteUtils;
 
@@ -27,6 +28,8 @@ import javax.sql.DataSource;
 import java.time.Instant;
 import java.util.concurrent.ThreadLocalRandom;
 
+import static org.mockito.Mockito.mock;
+
 @RequiredArgsConstructor
 @Slf4j
 // TODO remove later
@@ -59,7 +62,7 @@ public final class MySQLIncrementTask extends 
BaseIncrementTask {
     
     private Object insertOrder() {
         ThreadLocalRandom random = ThreadLocalRandom.current();
-        Object[] orderInsertDate = new 
Object[]{primaryKeyGenerateAlgorithm.generateKey(), random.nextInt(0, 6),
+        Object[] orderInsertDate = new 
Object[]{primaryKeyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class),
 1).iterator().next(), random.nextInt(0, 6),
                 random.nextInt(1, 99), "中文测试"};
         DataSourceExecuteUtils.execute(dataSource, String.format("INSERT INTO 
%s (order_id,user_id,t_unsigned_int,status) VALUES (?, ?, ?, ?)", 
orderTableName), orderInsertDate);
         return orderInsertDate[0];
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/task/PostgreSQLIncrementTask.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/task/PostgreSQLIncrementTask.java
index e574eb68e83..fbbf0add4f2 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/task/PostgreSQLIncrementTask.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/task/PostgreSQLIncrementTask.java
@@ -21,6 +21,7 @@ import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.keygen.snowflake.algorithm.SnowflakeKeyGenerateAlgorithm;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.cases.base.BaseIncrementTask;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.framework.helper.PipelineCaseHelper;
@@ -32,6 +33,8 @@ import javax.sql.DataSource;
 import java.time.Instant;
 import java.util.concurrent.ThreadLocalRandom;
 
+import static org.mockito.Mockito.mock;
+
 @RequiredArgsConstructor
 @Slf4j
 // TODO remove later
@@ -68,7 +71,8 @@ public final class PostgreSQLIncrementTask extends 
BaseIncrementTask {
     
     private Object insertOrder() {
         ThreadLocalRandom random = ThreadLocalRandom.current();
-        Object[] orderInsertDate = new 
Object[]{KEY_GENERATE_ALGORITHM.generateKey(), random.nextInt(0, 6), "'中文'" + 
System.currentTimeMillis(), PipelineCaseHelper.generateJsonString(5, true),
+        Object[] orderInsertDate = new 
Object[]{KEY_GENERATE_ALGORITHM.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next(), random.nextInt(0, 6), "'中文'" + System.currentTimeMillis(),
+                PipelineCaseHelper.generateJsonString(5, true),
                 PipelineCaseHelper.generateJsonString(10, false)};
         String insertSQL = String.format("INSERT INTO %s 
(order_id,user_id,status,t_json,t_jsonb) VALUES (?, ?, ?, ?, ?)", 
getTableNameWithSchema(orderTableName));
         log.info("insert order sql:{}", insertSQL);
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/helper/PipelineCaseHelper.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/helper/PipelineCaseHelper.java
index b70464dda11..058c0a7c1ee 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/helper/PipelineCaseHelper.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/helper/PipelineCaseHelper.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import 
org.apache.shardingsphere.infra.database.opengauss.type.OpenGaussDatabaseType;
 import 
org.apache.shardingsphere.infra.database.postgresql.type.PostgreSQLDatabaseType;
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 import 
org.apache.shardingsphere.test.e2e.data.pipeline.util.AutoIncrementKeyGenerateAlgorithm;
 
 import java.math.BigDecimal;
@@ -46,6 +47,8 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.ThreadLocalRandom;
 
+import static org.mockito.Mockito.mock;
+
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 @Slf4j
 public final class PipelineCaseHelper {
@@ -83,7 +86,7 @@ public final class PipelineCaseHelper {
         if (databaseType instanceof MySQLDatabaseType) {
             for (int i = 0; i < insertRows; i++) {
                 int randomInt = generateInt(-100, 100);
-                Object orderId = keyGenerateAlgorithm.generateKey();
+                Object orderId = 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next();
                 int randomUnsignedInt = generateInt(0, 100);
                 LocalDateTime now = LocalDateTime.now();
                 Object[] addObjs = {orderId, generateInt(0, 100), 
generateString(6), randomInt, randomInt, randomInt,
@@ -96,7 +99,7 @@ public final class PipelineCaseHelper {
         }
         if (databaseType instanceof PostgreSQLDatabaseType) {
             for (int i = 0; i < insertRows; i++) {
-                Object orderId = keyGenerateAlgorithm.generateKey();
+                Object orderId = 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next();
                 result.add(new Object[]{orderId, generateInt(0, 100), 
generateString(6), generateInt(-128, 127),
                         BigDecimal.valueOf(generateDouble()), true, 
"bytea".getBytes(), generateString(2), generateString(2), generateFloat(), 
generateDouble(),
                         generateJsonString(8, false), generateJsonString(12, 
true), emojiText, LocalDate.now(),
@@ -106,7 +109,7 @@ public final class PipelineCaseHelper {
         }
         if (databaseType instanceof OpenGaussDatabaseType) {
             for (int i = 0; i < insertRows; i++) {
-                Object orderId = keyGenerateAlgorithm.generateKey();
+                Object orderId = 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next();
                 byte[] bytesValue = {Byte.MIN_VALUE, -1, 0, 1, Byte.MAX_VALUE};
                 result.add(new Object[]{orderId, generateInt(0, 1000), 
"'status'" + i, generateInt(-1000, 9999), generateInt(0, 100), generateFloat(), 
generateDouble(),
                         BigDecimal.valueOf(generateDouble()), false, 
generateString(6), "texts", bytesValue, bytesValue, LocalDate.now(), 
LocalTime.now(), "2001-10-01",
@@ -166,9 +169,9 @@ public final class PipelineCaseHelper {
     private static List<Object[]> generateOrderItemInsertData(final 
KeyGenerateAlgorithm keyGenerateAlgorithm, final int insertRows) {
         List<Object[]> result = new ArrayList<>(insertRows);
         for (int i = 0; i < insertRows; i++) {
-            Object orderId = keyGenerateAlgorithm.generateKey();
+            Object orderId = 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next();
             int userId = generateInt(0, 100);
-            result.add(new Object[]{keyGenerateAlgorithm.generateKey(), 
orderId, userId, "SUCCESS"});
+            result.add(new 
Object[]{keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next(), orderId, userId, "SUCCESS"});
         }
         return result;
     }
@@ -187,7 +190,7 @@ public final class PipelineCaseHelper {
         log.info("init data begin: {}", LocalDateTime.now());
         try (PreparedStatement preparedStatement = 
connection.prepareStatement(String.format("INSERT INTO %s 
(order_id,user_id,status) VALUES (?,?,?)", tableName))) {
             for (int i = 0; i < recordCount; i++) {
-                preparedStatement.setObject(1, 
keyGenerateAlgorithm.generateKey());
+                preparedStatement.setObject(1, 
keyGenerateAlgorithm.generateKeys(mock(KeyGenerateContext.class), 
1).iterator().next());
                 preparedStatement.setObject(2, 
ThreadLocalRandom.current().nextInt(0, 6));
                 preparedStatement.setObject(3, "OK");
                 preparedStatement.addBatch();
diff --git 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/util/AutoIncrementKeyGenerateAlgorithm.java
 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/util/AutoIncrementKeyGenerateAlgorithm.java
index ea95b2413e9..06a80e96ce4 100644
--- 
a/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/util/AutoIncrementKeyGenerateAlgorithm.java
+++ 
b/test/e2e/operation/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/util/AutoIncrementKeyGenerateAlgorithm.java
@@ -18,16 +18,20 @@
 package org.apache.shardingsphere.test.e2e.data.pipeline.util;
 
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
 
+import java.util.Collection;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public final class AutoIncrementKeyGenerateAlgorithm implements 
KeyGenerateAlgorithm {
     
     private final AtomicInteger idGen = new AtomicInteger(1);
     
     @Override
-    public Integer generateKey() {
-        return idGen.getAndIncrement();
+    public Collection<Integer> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        return IntStream.range(0, keyGenerateCount).mapToObj(each -> 
idGen.getAndIncrement()).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/fixture/keygen/RewriteKeyGenerateAlgorithmFixture.java
 
b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/fixture/keygen/RewriteKeyGenerateAlgorithmFixture.java
index 40820915117..60a8bbebfe5 100644
--- 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/fixture/keygen/RewriteKeyGenerateAlgorithmFixture.java
+++ 
b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/fixture/keygen/RewriteKeyGenerateAlgorithmFixture.java
@@ -18,12 +18,17 @@
 package org.apache.shardingsphere.test.it.rewrite.fixture.keygen;
 
 import org.apache.shardingsphere.keygen.core.algorithm.KeyGenerateAlgorithm;
+import org.apache.shardingsphere.keygen.core.context.KeyGenerateContext;
+
+import java.util.Collection;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 public final class RewriteKeyGenerateAlgorithmFixture implements 
KeyGenerateAlgorithm {
     
     @Override
-    public Long generateKey() {
-        return 1L;
+    public Collection<Long> generateKeys(final KeyGenerateContext 
keyGenerateContext, final int keyGenerateCount) {
+        return IntStream.range(0, keyGenerateCount).mapToObj(each -> 
1L).collect(Collectors.toList());
     }
     
     @Override

Reply via email to