You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2021/09/23 08:43:14 UTC

[shardingsphere] branch master updated: Fix IntervalShardingAlgorithm. (#12625)

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

duanzhengqiang 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 bdba15f  Fix IntervalShardingAlgorithm. (#12625)
bdba15f is described below

commit bdba15f7454820c1ffe1ca39183b020b98f91ba8
Author: tuichenchuxin <86...@users.noreply.github.com>
AuthorDate: Thu Sep 23 16:42:38 2021 +0800

    Fix IntervalShardingAlgorithm. (#12625)
    
    * Fix IntervalShardingAlgorithm.
    
    * Fix IntervalShardingAlgorithm.
    
    * Fix IntervalShardingAlgorithm.
    
    * Fix IntervalShardingAlgorithm.
---
 .../datetime/IntervalShardingAlgorithm.java        | 35 +++++++++++++---------
 .../datetime/IntervalShardingAlgorithmTest.java    | 13 ++++----
 2 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/IntervalShardingAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/IntervalShardingAlgorithm.java
index 4e799c8..85b5bdc 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/IntervalShardingAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/IntervalShardingAlgorithm.java
@@ -18,6 +18,8 @@
 package org.apache.shardingsphere.sharding.algorithm.sharding.datetime;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.BoundType;
+import com.google.common.collect.Range;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
@@ -120,30 +122,35 @@ public final class IntervalShardingAlgorithm implements StandardShardingAlgorith
     
     @Override
     public String doSharding(final Collection<String> availableTargetNames, final PreciseShardingValue<Comparable<?>> shardingValue) {
-        String tableNameSuffix = parseDateTime(shardingValue.getValue().toString()).format(tableSuffixPattern);
-        return availableTargetNames.stream()
-                .filter(each -> each.endsWith(tableNameSuffix))
-                .findFirst().orElse(null);
+        return doSharding(availableTargetNames, Range.singleton(shardingValue.getValue())).stream().findFirst().orElse(null);
     }
     
     @Override
     public Collection<String> doSharding(final Collection<String> availableTargetNames, final RangeShardingValue<Comparable<?>> shardingValue) {
-        boolean hasStartTime = shardingValue.getValueRange().hasLowerBound();
-        boolean hasEndTime = shardingValue.getValueRange().hasUpperBound();
-        if (!hasStartTime && !hasEndTime) {
-            return availableTargetNames;
-        }
-        LocalDateTime startTime = hasStartTime ? parseDateTime(shardingValue.getValueRange().lowerEndpoint().toString()) : dateTimeLower;
-        LocalDateTime endTime = hasEndTime ? parseDateTime(shardingValue.getValueRange().upperEndpoint().toString()) : dateTimeUpper;
-        LocalDateTime calculateTime = startTime;
+        return doSharding(availableTargetNames, shardingValue.getValueRange());
+    }
+    
+    private Collection<String> doSharding(final Collection<String> availableTargetNames, final Range<Comparable<?>> range) {
         Set<String> result = new HashSet<>();
-        while (!calculateTime.isAfter(endTime) || calculateTime.format(tableSuffixPattern).equals(endTime.format(tableSuffixPattern))) {
-            result.addAll(getMatchedTables(calculateTime, availableTargetNames));
+        LocalDateTime calculateTime = dateTimeLower;
+        while (!calculateTime.isAfter(dateTimeUpper)) {
+            if (hasIntersection(Range.closedOpen(calculateTime, calculateTime.plus(stepAmount, stepUnit)), range)) {
+                result.addAll(getMatchedTables(calculateTime, availableTargetNames));
+            }
             calculateTime = calculateTime.plus(stepAmount, stepUnit);
         }
         return result;
     }
     
+    private boolean hasIntersection(final Range<LocalDateTime> calculateRange, final Range<Comparable<?>> range) {
+        LocalDateTime lower = range.hasLowerBound() ? parseDateTime(range.lowerEndpoint().toString()) : dateTimeLower;
+        LocalDateTime upper = range.hasUpperBound() ? parseDateTime(range.upperEndpoint().toString()) : dateTimeUpper;
+        BoundType lowerBoundType = range.hasLowerBound() ? range.lowerBoundType() : BoundType.CLOSED;
+        BoundType upperBoundType = range.hasUpperBound() ? range.upperBoundType() : BoundType.CLOSED;
+        Range<LocalDateTime> dateTimeRange = Range.range(lower, lowerBoundType, upper, upperBoundType);
+        return calculateRange.isConnected(dateTimeRange) && !calculateRange.intersection(dateTimeRange).isEmpty();
+    }
+    
     private LocalDateTime parseDateTime(final String value) {
         return LocalDateTime.parse(value.substring(0, dateTimePatternLength), dateTimeFormatter);
     }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/IntervalShardingAlgorithmTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/IntervalShardingAlgorithmTest.java
index d61b683..79f4233 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/IntervalShardingAlgorithmTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/datetime/IntervalShardingAlgorithmTest.java
@@ -91,10 +91,11 @@ public final class IntervalShardingAlgorithmTest {
         shardingAlgorithmByDay.getProps().setProperty("datetime-lower", "2021-06-01 00:00:00");
         shardingAlgorithmByDay.getProps().setProperty("datetime-upper", "2021-07-31 00:00:00");
         shardingAlgorithmByDay.getProps().setProperty("sharding-suffix-pattern", "yyyyMMdd");
-        shardingAlgorithmByDay.getProps().setProperty("datetime-interval-amount", "1");
+        int stepAmount = 2;
+        shardingAlgorithmByDay.getProps().setProperty("datetime-interval-amount", Integer.toString(stepAmount));
         shardingAlgorithmByDay.init();
         for (int j = 6; j <= 7; j++) {
-            for (int i = 1; j == 6 ? i <= 30 : i <= 31; i++) {
+            for (int i = 1; j == 6 ? i <= 30 : i <= 31; i = i + stepAmount) {
                 availableTablesForDayDataSources.add(String.format("t_order_%04d%02d%02d", 2021, j, i));
             }
         }
@@ -103,6 +104,7 @@ public final class IntervalShardingAlgorithmTest {
     @Test
     public void assertPreciseDoShardingByQuarter() {
         assertThat(shardingAlgorithmByQuarter.doSharding(availableTablesForQuarterDataSources, new PreciseShardingValue<>("t_order", "create_time", "2020-01-01 00:00:01")), is("t_order_202001"));
+        assertThat(shardingAlgorithmByQuarter.doSharding(availableTablesForQuarterDataSources, new PreciseShardingValue<>("t_order", "create_time", "2020-02-01 00:00:01")), is("t_order_202001"));
     }
     
     @Test
@@ -143,26 +145,27 @@ public final class IntervalShardingAlgorithmTest {
     public void assertLowerHalfRangeDoShardingByDay() {
         Collection<String> actual = shardingAlgorithmByDay.doSharding(
                 availableTablesForDayDataSources, new RangeShardingValue<>("t_order", "create_time", Range.atLeast("2021-01-01 00:00:00")));
-        assertThat(actual.size(), is(61));
+        assertThat(actual.size(), is(31));
     }
     
     @Test
     public void assertUpperHalfRangeDoShardingByDay() {
         Collection<String> actual = shardingAlgorithmByDay.doSharding(
                 availableTablesForDayDataSources, new RangeShardingValue<>("t_order", "create_time", Range.atMost("2021-07-31 01:00:00")));
-        assertThat(actual.size(), is(61));
+        assertThat(actual.size(), is(31));
     }
     
     @Test
     public void assertPreciseDoShardingByDay() {
         assertThat(shardingAlgorithmByDay.doSharding(availableTablesForDayDataSources, new PreciseShardingValue<>("t_order", "create_time", "2021-07-01 00:00:01")), is("t_order_20210701"));
+        assertThat(shardingAlgorithmByDay.doSharding(availableTablesForDayDataSources, new PreciseShardingValue<>("t_order", "create_time", "2021-07-02 00:00:01")), is("t_order_20210701"));
     }
     
     @Test
     public void assertRangeDoShardingByDay() {
         Collection<String> actual = shardingAlgorithmByDay.doSharding(
                 availableTablesForDayDataSources, new RangeShardingValue<>("t_order", "create_time", Range.closed("2021-06-15 00:00:00", "2021-07-31 01:00:00")));
-        assertThat(actual.size(), is(47));
+        assertThat(actual.size(), is(24));
     }
     
     @Test