You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by yx...@apache.org on 2022/05/04 14:37:20 UTC

[shardingsphere] branch master updated: Refactor ShardingAlgorithm with CosId (#17319)

This is an automated email from the ASF dual-hosted git repository.

yx9o 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 724ba9dc809 Refactor ShardingAlgorithm with CosId (#17319)
724ba9dc809 is described below

commit 724ba9dc80941459c74763638b0f7486577bf41f
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Wed May 4 22:36:56 2022 +0800

    Refactor ShardingAlgorithm with CosId (#17319)
    
    * Refactor AbstractIntervalShardingAlgorithm
    
    * Remove PropertiesUtil
    
    * Refactor CosIdIntervalShardingAlgorithm
    
    * Refactor CosIdSnowflakeIntervalShardingAlgorithm
    
    * Refactor CosIdSnowflakeIntervalShardingAlgorithmTest
    
    * Refactor CosIdIntervalShardingAlgorithmTest
    
    * Rename AbstractCosIdIntervalShardingAlgorithm
---
 .../ClassBasedShardingAlgorithmFactory.java        |  2 +-
 .../algorithm/sharding/cosid/PropertiesUtil.java   | 44 -----------
 .../AbstractCosIdIntervalShardingAlgorithm.java}   | 58 ++++++--------
 .../CosIdIntervalShardingAlgorithm.java            | 26 ++++---
 .../CosIdSnowflakeIntervalShardingAlgorithm.java   | 19 ++---
 .../cosid/{ => mod}/CosIdModShardingAlgorithm.java | 14 +++-
 ...e.shardingsphere.sharding.spi.ShardingAlgorithm |  6 +-
 .../algorithm/sharding/cosid/Arguments.java        | 18 ++++-
 .../sharding/cosid/PropertiesUtilTest.java         | 47 -----------
 .../CosIdIntervalShardingAlgorithmTest.java        | 91 +++++++++-------------
 ...osIdSnowflakeIntervalShardingAlgorithmTest.java | 63 +++++----------
 .../{ => mod}/CosIdModShardingAlgorithmTest.java   | 17 ++--
 12 files changed, 141 insertions(+), 264 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/classbased/ClassBasedShardingAlgorithmFactory.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/classbased/ClassBasedShardingAlgorithmFactory.java
index bac23052cac..fdba50e1202 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/classbased/ClassBasedShardingAlgorithmFactory.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/classbased/ClassBasedShardingAlgorithmFactory.java
@@ -41,8 +41,8 @@ public final class ClassBasedShardingAlgorithmFactory {
      * @param <T> class generic type
      * @return sharding algorithm instance
      */
-    @SneakyThrows(ReflectiveOperationException.class)
     @SuppressWarnings("unchecked")
+    @SneakyThrows(ReflectiveOperationException.class)
     public static <T extends ShardingAlgorithm> T newInstance(final String shardingAlgorithmClassName, final Class<T> superShardingAlgorithmClass, final Properties props) {
         Class<?> result = Class.forName(shardingAlgorithmClassName);
         if (!superShardingAlgorithmClass.isAssignableFrom(result)) {
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/PropertiesUtil.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/PropertiesUtil.java
deleted file mode 100644
index 5867b2c7999..00000000000
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/PropertiesUtil.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.algorithm.sharding.cosid;
-
-import com.google.common.base.Preconditions;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
-import java.util.Properties;
-
-/**
- * Properties Utility.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class PropertiesUtil {
-    
-    /**
-     * Get the value according to the key and verify whether the value exists. If it does not exist, an {@link IllegalArgumentException} will be thrown.
-     *
-     * @param props Properties
-     * @param key key of property
-     * @return value of property
-     * @throws IllegalArgumentException throw an exception when the key does not exist
-     */
-    public static String getRequiredValue(final Properties props, final String key) {
-        Preconditions.checkArgument(props.containsKey(key), "%s can not be null.", key);
-        return props.get(key).toString();
-    }
-}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/AbstractIntervalShardingAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/AbstractCosIdIntervalShardingAlgorithm.java
similarity index 80%
rename from shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/AbstractIntervalShardingAlgorithm.java
rename to shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/AbstractCosIdIntervalShardingAlgorithm.java
index e0b698e85d2..b99af29c879 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/AbstractIntervalShardingAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/AbstractCosIdIntervalShardingAlgorithm.java
@@ -15,10 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sharding.algorithm.sharding.cosid;
+package org.apache.shardingsphere.sharding.algorithm.sharding.cosid.interval;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.BoundType;
 import com.google.common.collect.Range;
+import lombok.AccessLevel;
+import lombok.Getter;
 import me.ahoo.cosid.sharding.IntervalStep;
 import me.ahoo.cosid.sharding.IntervalTimeline;
 import org.apache.shardingsphere.sharding.algorithm.constant.CosIdAlgorithmConstants;
@@ -34,9 +37,9 @@ import java.util.Collection;
 import java.util.Properties;
 
 /**
- * Interval-based time range sharding algorithm.
+ * Abstract interval range sharding algorithm with CosId.
  */
-public abstract class AbstractIntervalShardingAlgorithm<T extends Comparable<?>> implements StandardShardingAlgorithm<T> {
+public abstract class AbstractCosIdIntervalShardingAlgorithm<T extends Comparable<?>> implements StandardShardingAlgorithm<T> {
     
     public static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
     
@@ -54,35 +57,34 @@ public abstract class AbstractIntervalShardingAlgorithm<T extends Comparable<?>>
     
     public static final String ZONE_ID_KEY = "zone-id";
     
+    @Getter(AccessLevel.PROTECTED)
+    private volatile ZoneId zoneId;
+    
     private volatile IntervalTimeline intervalTimeline;
     
-    private ZoneId zoneId = ZoneId.systemDefault();
+    @Override
+    public void init(final Properties props) {
+        zoneId = getZoneId(props);
+        intervalTimeline = getIntervalTimeline(props);
+    }
     
-    /**
-     * get zone id.
-     *
-     * @return zone id
-     */
-    protected ZoneId getZoneId() {
-        return zoneId;
+    private ZoneId getZoneId(final Properties props) {
+        return props.containsKey(ZONE_ID_KEY) ? ZoneId.of(props.get(ZONE_ID_KEY).toString()) : ZoneId.systemDefault();
     }
     
-    @Override
-    public void init(final Properties props) {
-        if (props.containsKey(ZONE_ID_KEY)) {
-            zoneId = ZoneId.of(getRequiredValue(props, ZONE_ID_KEY));
-        }
+    private IntervalTimeline getIntervalTimeline(final Properties props) {
         String logicNamePrefix = getRequiredValue(props, CosIdAlgorithmConstants.LOGIC_NAME_PREFIX_KEY);
         LocalDateTime effectiveLower = LocalDateTime.parse(getRequiredValue(props, DATE_TIME_LOWER_KEY), DEFAULT_DATE_TIME_FORMATTER);
         LocalDateTime effectiveUpper = LocalDateTime.parse(getRequiredValue(props, DATE_TIME_UPPER_KEY), DEFAULT_DATE_TIME_FORMATTER);
         DateTimeFormatter suffixFormatter = DateTimeFormatter.ofPattern(getRequiredValue(props, SHARDING_SUFFIX_FORMAT_KEY));
         ChronoUnit stepUnit = ChronoUnit.valueOf(getRequiredValue(props, INTERVAL_UNIT_KEY));
         int stepAmount = Integer.parseInt(props.getOrDefault(INTERVAL_AMOUNT_KEY, 1).toString());
-        intervalTimeline = new IntervalTimeline(logicNamePrefix, Range.closed(effectiveLower, effectiveUpper), IntervalStep.of(stepUnit, stepAmount), suffixFormatter);
+        return new IntervalTimeline(logicNamePrefix, Range.closed(effectiveLower, effectiveUpper), IntervalStep.of(stepUnit, stepAmount), suffixFormatter);
     }
     
     private String getRequiredValue(final Properties props, final String key) {
-        return PropertiesUtil.getRequiredValue(props, key);
+        Preconditions.checkArgument(props.containsKey(key), "%s can not be null.", key);
+        return props.get(key).toString();
     }
     
     @Override
@@ -97,14 +99,6 @@ public abstract class AbstractIntervalShardingAlgorithm<T extends Comparable<?>>
         return intervalTimeline.sharding(shardingRangeTime);
     }
     
-    /**
-     * convert sharding value to {@link LocalDateTime}.
-     *
-     * @param shardingValue sharding value
-     * @return The {@link LocalDateTime} represented by the sharding value
-     */
-    protected abstract LocalDateTime convertShardingValue(T shardingValue);
-    
     @SuppressWarnings("unchecked")
     private Range<LocalDateTime> convertRangeShardingValue(final Range<T> shardingValue) {
         if (Range.all().equals(shardingValue)) {
@@ -121,15 +115,11 @@ public abstract class AbstractIntervalShardingAlgorithm<T extends Comparable<?>>
         }
         if (shardingValue.hasLowerBound()) {
             LocalDateTime lower = convertShardingValue(shardingValue.lowerEndpoint());
-            if (BoundType.OPEN.equals(shardingValue.lowerBoundType())) {
-                return Range.greaterThan(lower);
-            }
-            return Range.atLeast(lower);
+            return BoundType.OPEN.equals(shardingValue.lowerBoundType()) ? Range.greaterThan(lower) : Range.atLeast(lower);
         }
         LocalDateTime upper = convertShardingValue(shardingValue.upperEndpoint());
-        if (BoundType.OPEN.equals(shardingValue.upperBoundType())) {
-            return Range.lessThan(upper);
-        }
-        return Range.atMost(upper);
+        return BoundType.OPEN.equals(shardingValue.upperBoundType()) ? Range.lessThan(upper) : Range.atMost(upper);
     }
+    
+    protected abstract LocalDateTime convertShardingValue(T shardingValue);
 }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdIntervalShardingAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdIntervalShardingAlgorithm.java
similarity index 76%
rename from shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdIntervalShardingAlgorithm.java
rename to shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdIntervalShardingAlgorithm.java
index 29bfaeba21f..b7a9fd5090a 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdIntervalShardingAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdIntervalShardingAlgorithm.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sharding.algorithm.sharding.cosid;
+package org.apache.shardingsphere.sharding.algorithm.sharding.cosid.interval;
 
 import com.google.common.base.Strings;
 import lombok.Getter;
@@ -29,9 +29,9 @@ import java.util.Date;
 import java.util.Properties;
 
 /**
- * Interval-based time range sharding algorithm.
+ * Interval range sharding algorithm with CosId.
  */
-public final class CosIdIntervalShardingAlgorithm extends AbstractIntervalShardingAlgorithm<Comparable<?>> {
+public final class CosIdIntervalShardingAlgorithm extends AbstractCosIdIntervalShardingAlgorithm<Comparable<?>> {
     
     public static final String TYPE = CosIdAlgorithmConstants.TYPE_PREFIX + "INTERVAL";
     
@@ -52,11 +52,16 @@ public final class CosIdIntervalShardingAlgorithm extends AbstractIntervalShardi
     @Override
     public void init(final Properties props) {
         super.init(props);
-        if (props.containsKey(TIMESTAMP_UNIT_KEY) && TIMESTAMP_SECOND_UNIT.equalsIgnoreCase(props.getProperty(TIMESTAMP_UNIT_KEY))) {
-            isSecondTs = true;
-        }
-        String dateTimePattern = props.getProperty(DATE_TIME_PATTERN_KEY, DEFAULT_DATE_TIME_PATTERN);
-        dateTimeFormatter = DateTimeFormatter.ofPattern(dateTimePattern);
+        isSecondTs = getIsSecondTs(props);
+        dateTimeFormatter = getDateTimeFormatter(props);
+    }
+    
+    private boolean getIsSecondTs(final Properties props) {
+        return props.containsKey(TIMESTAMP_UNIT_KEY) && TIMESTAMP_SECOND_UNIT.equalsIgnoreCase(props.getProperty(TIMESTAMP_UNIT_KEY));
+    }
+    
+    private DateTimeFormatter getDateTimeFormatter(final Properties props) {
+        return DateTimeFormatter.ofPattern(props.getProperty(DATE_TIME_PATTERN_KEY, DEFAULT_DATE_TIME_PATTERN));
     }
     
     @Override
@@ -68,10 +73,7 @@ public final class CosIdIntervalShardingAlgorithm extends AbstractIntervalShardi
             return LocalDateTimeConvert.fromDate((Date) shardingValue, getZoneId());
         }
         if (shardingValue instanceof Long) {
-            if (isSecondTs) {
-                return LocalDateTimeConvert.fromTimestampSecond((Long) shardingValue, getZoneId());
-            }
-            return LocalDateTimeConvert.fromTimestamp((Long) shardingValue, getZoneId());
+            return isSecondTs ? LocalDateTimeConvert.fromTimestampSecond((Long) shardingValue, getZoneId()) : LocalDateTimeConvert.fromTimestamp((Long) shardingValue, getZoneId());
         }
         if (shardingValue instanceof String) {
             return LocalDateTimeConvert.fromString((String) shardingValue, dateTimeFormatter);
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdSnowflakeIntervalShardingAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdSnowflakeIntervalShardingAlgorithm.java
similarity index 80%
rename from shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdSnowflakeIntervalShardingAlgorithm.java
rename to shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdSnowflakeIntervalShardingAlgorithm.java
index b968040592d..b5e50bcb1b7 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdSnowflakeIntervalShardingAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdSnowflakeIntervalShardingAlgorithm.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sharding.algorithm.sharding.cosid;
+package org.apache.shardingsphere.sharding.algorithm.sharding.cosid.interval;
 
 import com.google.common.base.Strings;
 import lombok.Getter;
@@ -31,9 +31,9 @@ import java.time.LocalDateTime;
 import java.util.Properties;
 
 /**
- * The algorithm parses the timestamp from snowflake-id as the sharding value of Interval-based time range sharding algorithm.
+ * Snowflake interval sharding algorithm with CosId.
  */
-public final class CosIdSnowflakeIntervalShardingAlgorithm extends AbstractIntervalShardingAlgorithm<Comparable<?>> {
+public final class CosIdSnowflakeIntervalShardingAlgorithm extends AbstractCosIdIntervalShardingAlgorithm<Comparable<?>> {
     
     public static final String TYPE = CosIdAlgorithmConstants.TYPE_PREFIX + "INTERVAL_SNOWFLAKE";
     
@@ -48,12 +48,13 @@ public final class CosIdSnowflakeIntervalShardingAlgorithm extends AbstractInter
     @Override
     public void init(final Properties props) {
         super.init(props);
-        long epoch = CosIdSnowflakeKeyGenerateAlgorithm.DEFAULT_EPOCH;
-        if (props.containsKey(EPOCH_KEY)) {
-            epoch = Long.parseLong(props.getProperty(EPOCH_KEY));
-        }
-        snowflakeIdStateParser = new MillisecondSnowflakeIdStateParser(epoch,
-                MillisecondSnowflakeId.DEFAULT_TIMESTAMP_BIT, MillisecondSnowflakeId.DEFAULT_MACHINE_BIT, MillisecondSnowflakeId.DEFAULT_SEQUENCE_BIT, getZoneId());
+        snowflakeIdStateParser = getSnowflakeIdStateParser(props);
+    }
+    
+    private SnowflakeIdStateParser getSnowflakeIdStateParser(final Properties props) {
+        long epoch = props.containsKey(EPOCH_KEY) ? Long.parseLong(props.getProperty(EPOCH_KEY)) : CosIdSnowflakeKeyGenerateAlgorithm.DEFAULT_EPOCH;
+        return new MillisecondSnowflakeIdStateParser(
+                epoch, MillisecondSnowflakeId.DEFAULT_TIMESTAMP_BIT, MillisecondSnowflakeId.DEFAULT_MACHINE_BIT, MillisecondSnowflakeId.DEFAULT_SEQUENCE_BIT, getZoneId());
     }
     
     @Override
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdModShardingAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/mod/CosIdModShardingAlgorithm.java
similarity index 83%
rename from shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdModShardingAlgorithm.java
rename to shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/mod/CosIdModShardingAlgorithm.java
index 504cf435a78..9fa686eb4ea 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdModShardingAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/mod/CosIdModShardingAlgorithm.java
@@ -15,8 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sharding.algorithm.sharding.cosid;
+package org.apache.shardingsphere.sharding.algorithm.sharding.cosid.mod;
 
+import com.google.common.base.Preconditions;
 import lombok.Getter;
 import lombok.Setter;
 import me.ahoo.cosid.sharding.ModCycle;
@@ -29,7 +30,7 @@ import java.util.Collection;
 import java.util.Properties;
 
 /**
- * Modular sharding algorithm.
+ * Modular sharding algorithm with CosId.
  */
 public final class CosIdModShardingAlgorithm<T extends Number & Comparable<T>> implements StandardShardingAlgorithm<T> {
     
@@ -45,12 +46,17 @@ public final class CosIdModShardingAlgorithm<T extends Number & Comparable<T>> i
     
     @Override
     public void init(final Properties props) {
-        String divisorStr = PropertiesUtil.getRequiredValue(props, MODULO_KEY);
+        String divisorStr = getRequiredValue(props, MODULO_KEY);
         int divisor = Integer.parseInt(divisorStr);
-        String logicNamePrefix = PropertiesUtil.getRequiredValue(props, CosIdAlgorithmConstants.LOGIC_NAME_PREFIX_KEY);
+        String logicNamePrefix = getRequiredValue(props, CosIdAlgorithmConstants.LOGIC_NAME_PREFIX_KEY);
         modCycle = new ModCycle<>(divisor, logicNamePrefix);
     }
     
+    private String getRequiredValue(final Properties props, final String key) {
+        Preconditions.checkArgument(props.containsKey(key), "%s can not be null.", key);
+        return props.get(key).toString();
+    }
+    
     @Override
     public String doSharding(final Collection<String> availableTargetNames, final PreciseShardingValue<T> shardingValue) {
         return modCycle.sharding(shardingValue.getValue());
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
index b67772106da..4a096518df9 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/resources/META-INF/services/org.apache.shardingsphere.sharding.spi.ShardingAlgorithm
@@ -25,6 +25,6 @@ org.apache.shardingsphere.sharding.algorithm.sharding.datetime.IntervalShardingA
 org.apache.shardingsphere.sharding.algorithm.sharding.classbased.ClassBasedShardingAlgorithm
 org.apache.shardingsphere.sharding.algorithm.sharding.complex.ComplexInlineShardingAlgorithm
 org.apache.shardingsphere.sharding.algorithm.sharding.hint.HintInlineShardingAlgorithm
-org.apache.shardingsphere.sharding.algorithm.sharding.cosid.CosIdModShardingAlgorithm
-org.apache.shardingsphere.sharding.algorithm.sharding.cosid.CosIdIntervalShardingAlgorithm
-org.apache.shardingsphere.sharding.algorithm.sharding.cosid.CosIdSnowflakeIntervalShardingAlgorithm
+org.apache.shardingsphere.sharding.algorithm.sharding.cosid.mod.CosIdModShardingAlgorithm
+org.apache.shardingsphere.sharding.algorithm.sharding.cosid.interval.CosIdIntervalShardingAlgorithm
+org.apache.shardingsphere.sharding.algorithm.sharding.cosid.interval.CosIdSnowflakeIntervalShardingAlgorithm
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/Arguments.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/Arguments.java
index e1702dd20eb..2520367f80d 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/Arguments.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/Arguments.java
@@ -25,13 +25,27 @@ import java.util.Arrays;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class Arguments {
     
+    /**
+     * Of arguments.
+     * 
+     * @param arguments arguments
+     * @param <T> type of arguments
+     * @return arguments
+     */
     @SafeVarargs
-    static <T> T[] of(final T... arguments) {
+    public static <T> T[] of(final T... arguments) {
         return arguments;
     }
     
+    /**
+     * Of array element.
+     * 
+     * @param arguments arguments
+     * @param <T> type of arguments
+     * @return iterable
+     */
     @SafeVarargs
-    static <T> Iterable<T[]> ofArrayElement(final T[]... arguments) {
+    public static <T> Iterable<T[]> ofArrayElement(final T[]... arguments) {
         return Arrays.asList(arguments);
     }
 }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/PropertiesUtilTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/PropertiesUtilTest.java
deleted file mode 100644
index 9b01819e3bd..00000000000
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/PropertiesUtilTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.algorithm.sharding.cosid;
-
-import org.junit.Test;
-
-import java.util.Properties;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public final class PropertiesUtilTest {
-    
-    @Test
-    public void assertGetRequiredValue() {
-        Properties props = new Properties();
-        props.setProperty("sql-show", Boolean.TRUE.toString());
-        assertThat(PropertiesUtil.getRequiredValue(props, "sql-show"), is(Boolean.TRUE.toString()));
-    }
-    
-    @Test(expected = IllegalArgumentException.class)
-    public void assertGetInvalidRequiredValue() {
-        PropertiesUtil.getRequiredValue(new Properties(), "sql-show");
-    }
-    
-    @Test
-    public void assertGetRequiredValueWhenValueIsInt() {
-        Properties props = new Properties();
-        props.put("key", 1);
-        assertThat(PropertiesUtil.getRequiredValue(props, "key"), is("1"));
-    }
-}
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdIntervalShardingAlgorithmTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdIntervalShardingAlgorithmTest.java
similarity index 84%
rename from shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdIntervalShardingAlgorithmTest.java
rename to shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdIntervalShardingAlgorithmTest.java
index f2d5f472143..97f4a51455c 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdIntervalShardingAlgorithmTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdIntervalShardingAlgorithmTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sharding.algorithm.sharding.cosid;
+package org.apache.shardingsphere.sharding.algorithm.sharding.cosid.interval;
 
 import com.google.common.collect.Range;
 import lombok.RequiredArgsConstructor;
@@ -23,6 +23,7 @@ import me.ahoo.cosid.sharding.ExactCollection;
 import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.datanode.DataNodeInfo;
 import org.apache.shardingsphere.sharding.algorithm.constant.CosIdAlgorithmConstants;
+import org.apache.shardingsphere.sharding.algorithm.sharding.cosid.Arguments;
 import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
 import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
 import org.apache.shardingsphere.sharding.factory.ShardingAlgorithmFactory;
@@ -165,22 +166,18 @@ public final class CosIdIntervalShardingAlgorithmTest {
     }
     
     @RunWith(Parameterized.class)
+    @RequiredArgsConstructor
     public static class LocalDateTimePreciseValueDoShardingTest {
         
-        private CosIdIntervalShardingAlgorithm shardingAlgorithm;
-        
         private final LocalDateTime dateTime;
         
         private final String expected;
-        
-        public LocalDateTimePreciseValueDoShardingTest(final LocalDateTime dateTime, final String expected) {
-            this.dateTime = dateTime;
-            this.expected = expected;
-        }
+    
+        private CosIdIntervalShardingAlgorithm algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -191,28 +188,24 @@ public final class CosIdIntervalShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             PreciseShardingValue<Comparable<?>> shardingValue = new PreciseShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 6, '0'), dateTime);
-            String actual = shardingAlgorithm.doSharding(ALL_NODES, shardingValue);
+            String actual = algorithm.doSharding(ALL_NODES, shardingValue);
             assertThat(actual, is(expected));
         }
     }
     
     @RunWith(Parameterized.class)
+    @RequiredArgsConstructor
     public static class LocalDateTimeRangeValueDoShardingTest {
         
-        private CosIdIntervalShardingAlgorithm shardingAlgorithm;
-        
         private final Range<LocalDateTime> rangeValue;
         
         private final Collection<String> expected;
-        
-        public LocalDateTimeRangeValueDoShardingTest(final Range<LocalDateTime> rangeValue, final Collection<String> expected) {
-            this.rangeValue = rangeValue;
-            this.expected = expected;
-        }
+    
+        private CosIdIntervalShardingAlgorithm algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -223,28 +216,24 @@ public final class CosIdIntervalShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             RangeShardingValue shardingValue = new RangeShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 6, '0'), rangeValue);
-            Collection<String> actual = shardingAlgorithm.doSharding(ALL_NODES, shardingValue);
+            Collection<String> actual = algorithm.doSharding(ALL_NODES, shardingValue);
             assertThat(actual, is(expected));
         }
     }
     
     @RunWith(Parameterized.class)
+    @RequiredArgsConstructor
     public static class StringPreciseValueDoShardingTest {
         
-        private CosIdIntervalShardingAlgorithm shardingAlgorithm;
-        
         private final String value;
         
         private final String expected;
-        
-        public StringPreciseValueDoShardingTest(final String value, final String expected) {
-            this.value = value;
-            this.expected = expected;
-        }
+    
+        private CosIdIntervalShardingAlgorithm algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -255,28 +244,24 @@ public final class CosIdIntervalShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             PreciseShardingValue shardingValue = new PreciseShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 6, '0'), value);
-            String actual = shardingAlgorithm.doSharding(ALL_NODES, shardingValue);
+            String actual = algorithm.doSharding(ALL_NODES, shardingValue);
             assertThat(actual, is(expected));
         }
     }
     
     @RunWith(Parameterized.class)
+    @RequiredArgsConstructor
     public static class StringRangeValueDoShardingTest {
         
-        private CosIdIntervalShardingAlgorithm shardingAlgorithm;
-        
         private final Range<String> rangeValue;
         
         private final Collection<String> expected;
-        
-        public StringRangeValueDoShardingTest(final Range<String> rangeValue, final Collection<String> expected) {
-            this.rangeValue = rangeValue;
-            this.expected = expected;
-        }
+    
+        private CosIdIntervalShardingAlgorithm algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -287,28 +272,24 @@ public final class CosIdIntervalShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             RangeShardingValue shardingValue = new RangeShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 6, '0'), rangeValue);
-            Collection<String> actual = shardingAlgorithm.doSharding(ALL_NODES, shardingValue);
+            Collection<String> actual = algorithm.doSharding(ALL_NODES, shardingValue);
             assertThat(actual, is(expected));
         }
     }
     
     @RunWith(Parameterized.class)
+    @RequiredArgsConstructor
     public static class DatePreciseValueDoShardingTest {
         
-        private CosIdIntervalShardingAlgorithm shardingAlgorithm;
-        
         private final Date value;
         
         private final String expected;
-        
-        public DatePreciseValueDoShardingTest(final Date value, final String expected) {
-            this.value = value;
-            this.expected = expected;
-        }
+    
+        private CosIdIntervalShardingAlgorithm algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -319,7 +300,7 @@ public final class CosIdIntervalShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             PreciseShardingValue shardingValue = new PreciseShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 6, '0'), value);
-            String actual = shardingAlgorithm.doSharding(ALL_NODES, shardingValue);
+            String actual = algorithm.doSharding(ALL_NODES, shardingValue);
             assertThat(actual, is(expected));
         }
     }
@@ -332,11 +313,11 @@ public final class CosIdIntervalShardingAlgorithmTest {
         
         private final Collection<String> expected;
         
-        private CosIdIntervalShardingAlgorithm shardingAlgorithm;
+        private CosIdIntervalShardingAlgorithm algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -347,7 +328,7 @@ public final class CosIdIntervalShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             RangeShardingValue shardingValue = new RangeShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 6, '0'), rangeValue);
-            assertThat(shardingAlgorithm.doSharding(ALL_NODES, shardingValue), is(expected));
+            assertThat(algorithm.doSharding(ALL_NODES, shardingValue), is(expected));
         }
     }
     
@@ -359,11 +340,11 @@ public final class CosIdIntervalShardingAlgorithmTest {
         
         private final String expected;
         
-        private CosIdIntervalShardingAlgorithm shardingAlgorithm;
+        private CosIdIntervalShardingAlgorithm algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -374,7 +355,7 @@ public final class CosIdIntervalShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             PreciseShardingValue shardingValue = new PreciseShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 6, '0'), value);
-            assertThat(shardingAlgorithm.doSharding(ALL_NODES, shardingValue), is(expected));
+            assertThat(algorithm.doSharding(ALL_NODES, shardingValue), is(expected));
         }
     }
     
@@ -386,11 +367,11 @@ public final class CosIdIntervalShardingAlgorithmTest {
         
         private final Collection<String> expected;
         
-        private CosIdIntervalShardingAlgorithm shardingAlgorithm;
+        private CosIdIntervalShardingAlgorithm algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -401,7 +382,7 @@ public final class CosIdIntervalShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             RangeShardingValue shardingValue = new RangeShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 6, '0'), rangeValue);
-            Collection<String> actual = shardingAlgorithm.doSharding(ALL_NODES, shardingValue);
+            Collection<String> actual = algorithm.doSharding(ALL_NODES, shardingValue);
             assertThat(actual, is(expected));
         }
     }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdSnowflakeIntervalShardingAlgorithmTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdSnowflakeIntervalShardingAlgorithmTest.java
similarity index 68%
rename from shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdSnowflakeIntervalShardingAlgorithmTest.java
rename to shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdSnowflakeIntervalShardingAlgorithmTest.java
index 348da72e303..a3fe6ae2469 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdSnowflakeIntervalShardingAlgorithmTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/interval/CosIdSnowflakeIntervalShardingAlgorithmTest.java
@@ -15,17 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sharding.algorithm.sharding.cosid;
+package org.apache.shardingsphere.sharding.algorithm.sharding.cosid.interval;
 
 import com.google.common.collect.Range;
 import lombok.RequiredArgsConstructor;
 import me.ahoo.cosid.snowflake.MillisecondSnowflakeId;
+import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.datanode.DataNodeInfo;
 import org.apache.shardingsphere.sharding.algorithm.constant.CosIdAlgorithmConstants;
 import org.apache.shardingsphere.sharding.algorithm.keygen.CosIdSnowflakeKeyGenerateAlgorithm;
 import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
 import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
-import org.junit.Before;
+import org.apache.shardingsphere.sharding.factory.ShardingAlgorithmFactory;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -40,42 +41,24 @@ import static org.junit.Assert.assertThat;
 
 public final class CosIdSnowflakeIntervalShardingAlgorithmTest {
     
-    static CosIdSnowflakeIntervalShardingAlgorithm createShardingAlgorithm() {
-        CosIdSnowflakeIntervalShardingAlgorithm result = new CosIdSnowflakeIntervalShardingAlgorithm();
-        Properties props = createAlgorithmProperties();
-        result.setProps(props);
-        result.init(props);
-        return result;
+    private static long convertToSnowflakeId(final LocalDateTime dateTime) {
+        long epochMilliseconds = dateTime.toInstant(CosIdIntervalShardingAlgorithmTest.ZONE_OFFSET_SHANGHAI).toEpochMilli();
+        long timeDiff = epochMilliseconds - CosIdSnowflakeKeyGenerateAlgorithm.DEFAULT_EPOCH;
+        return timeDiff << (MillisecondSnowflakeId.DEFAULT_SEQUENCE_BIT + MillisecondSnowflakeId.DEFAULT_MACHINE_BIT);
     }
     
-    private static Properties createAlgorithmProperties() {
+    private static Properties createProperties() {
         Properties result = new Properties();
         result.setProperty(CosIdIntervalShardingAlgorithm.ZONE_ID_KEY, "Asia/Shanghai");
         result.setProperty(CosIdAlgorithmConstants.LOGIC_NAME_PREFIX_KEY, CosIdIntervalShardingAlgorithmTest.LOGIC_NAME_PREFIX);
-        result.setProperty(CosIdIntervalShardingAlgorithm.DATE_TIME_LOWER_KEY,
-                CosIdIntervalShardingAlgorithmTest.LOWER_DATE_TIME.format(CosIdIntervalShardingAlgorithm.DEFAULT_DATE_TIME_FORMATTER));
-        result.setProperty(CosIdIntervalShardingAlgorithm.DATE_TIME_UPPER_KEY,
-                CosIdIntervalShardingAlgorithmTest.UPPER_DATE_TIME.format(CosIdIntervalShardingAlgorithm.DEFAULT_DATE_TIME_FORMATTER));
+        result.setProperty(CosIdIntervalShardingAlgorithm.DATE_TIME_LOWER_KEY, CosIdIntervalShardingAlgorithmTest.LOWER_DATE_TIME.format(CosIdIntervalShardingAlgorithm.DEFAULT_DATE_TIME_FORMATTER));
+        result.setProperty(CosIdIntervalShardingAlgorithm.DATE_TIME_UPPER_KEY, CosIdIntervalShardingAlgorithmTest.UPPER_DATE_TIME.format(CosIdIntervalShardingAlgorithm.DEFAULT_DATE_TIME_FORMATTER));
         result.setProperty(CosIdIntervalShardingAlgorithm.SHARDING_SUFFIX_FORMAT_KEY, CosIdIntervalShardingAlgorithmTest.SUFFIX_FORMATTER_STRING);
         result.setProperty(CosIdIntervalShardingAlgorithm.INTERVAL_UNIT_KEY, "MONTHS");
         result.put(CosIdIntervalShardingAlgorithm.INTERVAL_AMOUNT_KEY, 1);
         return result;
     }
     
-    static long convertToSnowflakeId(final LocalDateTime dateTime) {
-        long epochMilliseconds = dateTime.toInstant(CosIdIntervalShardingAlgorithmTest.ZONE_OFFSET_SHANGHAI).toEpochMilli();
-        long timeDiff = epochMilliseconds - CosIdSnowflakeKeyGenerateAlgorithm.DEFAULT_EPOCH;
-        return timeDiff << (MillisecondSnowflakeId.DEFAULT_SEQUENCE_BIT + MillisecondSnowflakeId.DEFAULT_MACHINE_BIT);
-    }
-    
-    static Iterable<Object[]> preciseArgsProviderAsSnowflakeId() {
-        return CosIdIntervalShardingAlgorithmTest.preciseArgsProvider(CosIdSnowflakeIntervalShardingAlgorithmTest::convertToSnowflakeId);
-    }
-    
-    static Iterable<Object[]> rangeArgsProviderAsSnowflakeId() {
-        return CosIdIntervalShardingAlgorithmTest.rangeArgsProvider(CosIdSnowflakeIntervalShardingAlgorithmTest::convertToSnowflakeId);
-    }
-    
     @RunWith(Parameterized.class)
     @RequiredArgsConstructor
     public static class SnowflakeIdPreciseValueDoShardingTest {
@@ -84,23 +67,18 @@ public final class CosIdSnowflakeIntervalShardingAlgorithmTest {
         
         private final String expected;
         
-        private CosIdSnowflakeIntervalShardingAlgorithm shardingAlgorithm;
-        
-        @Before
-        public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
-        }
-        
         @Parameters
         public static Iterable<Object[]> argsProvider() {
-            return preciseArgsProviderAsSnowflakeId();
+            return CosIdIntervalShardingAlgorithmTest.preciseArgsProvider(CosIdSnowflakeIntervalShardingAlgorithmTest::convertToSnowflakeId);
         }
         
         @Test
         public void assertDoSharding() {
+            CosIdSnowflakeIntervalShardingAlgorithm algorithm = (CosIdSnowflakeIntervalShardingAlgorithm) ShardingAlgorithmFactory.newInstance(
+                    new ShardingSphereAlgorithmConfiguration("COSID_INTERVAL_SNOWFLAKE", createProperties()));
             PreciseShardingValue shardingValue = new PreciseShardingValue<>(CosIdIntervalShardingAlgorithmTest.LOGIC_NAME,
                     CosIdIntervalShardingAlgorithmTest.COLUMN_NAME, new DataNodeInfo(CosIdIntervalShardingAlgorithmTest.LOGIC_NAME_PREFIX, 6, '0'), snowflakeId);
-            String actual = shardingAlgorithm.doSharding(CosIdIntervalShardingAlgorithmTest.ALL_NODES, shardingValue);
+            String actual = algorithm.doSharding(CosIdIntervalShardingAlgorithmTest.ALL_NODES, shardingValue);
             assertThat(actual, is(expected));
         }
     }
@@ -113,23 +91,18 @@ public final class CosIdSnowflakeIntervalShardingAlgorithmTest {
         
         private final Collection<String> expected;
         
-        private CosIdSnowflakeIntervalShardingAlgorithm shardingAlgorithm;
-        
-        @Before
-        public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
-        }
-        
         @Parameters
         public static Iterable<Object[]> argsProvider() {
-            return rangeArgsProviderAsSnowflakeId();
+            return CosIdIntervalShardingAlgorithmTest.rangeArgsProvider(CosIdSnowflakeIntervalShardingAlgorithmTest::convertToSnowflakeId);
         }
         
         @Test
         public void assertDoSharding() {
+            CosIdSnowflakeIntervalShardingAlgorithm algorithm = (CosIdSnowflakeIntervalShardingAlgorithm) ShardingAlgorithmFactory.newInstance(
+                    new ShardingSphereAlgorithmConfiguration("COSID_INTERVAL_SNOWFLAKE", createProperties()));
             RangeShardingValue shardingValue = new RangeShardingValue<>(CosIdIntervalShardingAlgorithmTest.LOGIC_NAME,
                     CosIdIntervalShardingAlgorithmTest.COLUMN_NAME, new DataNodeInfo(CosIdIntervalShardingAlgorithmTest.LOGIC_NAME_PREFIX, 6, '0'), rangeValue);
-            assertThat(shardingAlgorithm.doSharding(CosIdIntervalShardingAlgorithmTest.ALL_NODES, shardingValue), is(expected));
+            assertThat(algorithm.doSharding(CosIdIntervalShardingAlgorithmTest.ALL_NODES, shardingValue), is(expected));
         }
     }
 }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdModShardingAlgorithmTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/mod/CosIdModShardingAlgorithmTest.java
similarity index 94%
rename from shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdModShardingAlgorithmTest.java
rename to shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/mod/CosIdModShardingAlgorithmTest.java
index a11febd9e09..993f51cf1a1 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/CosIdModShardingAlgorithmTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/cosid/mod/CosIdModShardingAlgorithmTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sharding.algorithm.sharding.cosid;
+package org.apache.shardingsphere.sharding.algorithm.sharding.cosid.mod;
 
 import com.google.common.collect.Range;
 import lombok.RequiredArgsConstructor;
@@ -23,6 +23,7 @@ import me.ahoo.cosid.sharding.ExactCollection;
 import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.datanode.DataNodeInfo;
 import org.apache.shardingsphere.sharding.algorithm.constant.CosIdAlgorithmConstants;
+import org.apache.shardingsphere.sharding.algorithm.sharding.cosid.Arguments;
 import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
 import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
 import org.apache.shardingsphere.sharding.factory.ShardingAlgorithmFactory;
@@ -62,17 +63,17 @@ public final class CosIdModShardingAlgorithmTest {
         return result;
     }
     
-    @RequiredArgsConstructor
     @RunWith(Parameterized.class)
+    @RequiredArgsConstructor
     public static class PreciseValueDoShardingTest {
         
         private final long id;
         
-        private CosIdModShardingAlgorithm<Long> shardingAlgorithm;
+        private CosIdModShardingAlgorithm<Long> algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -83,7 +84,7 @@ public final class CosIdModShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             PreciseShardingValue<Long> shardingValue = new PreciseShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 1, '0'), id);
-            String actual = shardingAlgorithm.doSharding(ALL_NODES, shardingValue);
+            String actual = algorithm.doSharding(ALL_NODES, shardingValue);
             String expected = LOGIC_NAME_PREFIX + (id % DIVISOR);
             assertThat(actual, is(expected));
         }
@@ -97,11 +98,11 @@ public final class CosIdModShardingAlgorithmTest {
         
         private final Collection<String> expected;
         
-        private CosIdModShardingAlgorithm<Long> shardingAlgorithm;
+        private CosIdModShardingAlgorithm<Long> algorithm;
         
         @Before
         public void init() {
-            shardingAlgorithm = createShardingAlgorithm();
+            algorithm = createShardingAlgorithm();
         }
         
         @Parameters
@@ -153,7 +154,7 @@ public final class CosIdModShardingAlgorithmTest {
         @Test
         public void assertDoSharding() {
             RangeShardingValue<Long> shardingValue = new RangeShardingValue<>(LOGIC_NAME, COLUMN_NAME, new DataNodeInfo(LOGIC_NAME_PREFIX, 1, '0'), rangeValue);
-            Collection<String> actual = shardingAlgorithm.doSharding(ALL_NODES, shardingValue);
+            Collection<String> actual = algorithm.doSharding(ALL_NODES, shardingValue);
             assertThat(actual, is(expected));
         }
     }