You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/05/26 09:36:17 UTC

[shardingsphere] branch master updated: Improve of IntervalShardingAlgorithm (#17966)

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

zhangliang 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 b89cc8004a3 Improve of IntervalShardingAlgorithm (#17966)
b89cc8004a3 is described below

commit b89cc8004a37acc6bf56f9d1e5a52288b5e9765e
Author: ICannerxy <40...@users.noreply.github.com>
AuthorDate: Thu May 26 17:36:09 2022 +0800

    Improve of IntervalShardingAlgorithm (#17966)
    
    * Improve of IntervalShardingAlgorithm
    
    * remove unused package
    
    * Fix checkstyle
---
 .../datetime/IntervalShardingAlgorithm.java        | 86 ++++++++++++----------
 1 file changed, 46 insertions(+), 40 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 167b23ec20c..892af21ce0c 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
@@ -26,26 +26,21 @@ import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingV
 import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
 import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
 
+import java.time.ZoneId;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.time.OffsetDateTime;
-import java.time.OffsetTime;
-import java.time.ZoneId;
-import java.time.chrono.ChronoLocalDate;
-import java.time.chrono.ChronoLocalDateTime;
-import java.time.chrono.ChronoZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAccessor;
 import java.time.temporal.TemporalQueries;
 import java.util.Collection;
-import java.util.Date;
 import java.util.HashSet;
 import java.util.Properties;
 import java.util.Set;
+import java.util.Date;
 import java.util.stream.Collectors;
 
 /**
@@ -141,36 +136,21 @@ public final class IntervalShardingAlgorithm implements StandardShardingAlgorith
         return doSharding(availableTargetNames, shardingValue.getValueRange());
     }
     
-    @SuppressWarnings("DuplicatedCode")
     private Collection<String> doSharding(final Collection<String> availableTargetNames, final Range<Comparable<?>> range) {
-        Set<String> result = new HashSet<>();
         TemporalAccessor calculateTime = dateTimeLower;
         LocalDate queryToLocalDate = calculateTime.query(TemporalQueries.localDate());
         LocalTime queryToLocalTime = calculateTime.query(TemporalQueries.localTime());
-        LocalDate dateTimeUpperAsLocalDate = dateTimeUpper.query(TemporalQueries.localDate());
-        LocalDate dateTimeLowerAsLocalDate = dateTimeLower.query(TemporalQueries.localDate());
         if (null == queryToLocalTime) {
-            LocalDate calculateTimeAsView = calculateTime.query(TemporalQueries.localDate());
-            while (!calculateTimeAsView.isAfter(dateTimeUpperAsLocalDate)) {
-                if (hasIntersection(Range.closedOpen(calculateTimeAsView, calculateTimeAsView.plus(stepAmount, stepUnit)), range, dateTimeLowerAsLocalDate, dateTimeUpperAsLocalDate)) {
-                    result.addAll(getMatchedTables(calculateTimeAsView, availableTargetNames));
-                }
-                calculateTimeAsView = calculateTimeAsView.plus(stepAmount, stepUnit);
-            }
-            return result;
+            return doShardingInLocalDate(availableTargetNames, range, calculateTime);
         }
-        LocalTime dateTimeUpperAsLocalTime = dateTimeUpper.query(TemporalQueries.localTime());
-        LocalTime dateTimeLowerAsLocalTime = dateTimeLower.query(TemporalQueries.localTime());
         if (null == queryToLocalDate) {
-            LocalTime calculateTimeAsView = calculateTime.query(TemporalQueries.localTime());
-            while (!calculateTimeAsView.isAfter(dateTimeUpperAsLocalTime)) {
-                if (hasIntersection(Range.closedOpen(calculateTimeAsView, calculateTimeAsView.plus(stepAmount, stepUnit)), range, dateTimeLowerAsLocalTime, dateTimeUpperAsLocalTime)) {
-                    result.addAll(getMatchedTables(calculateTimeAsView, availableTargetNames));
-                }
-                calculateTimeAsView = calculateTimeAsView.plus(stepAmount, stepUnit);
-            }
-            return result;
+            return doShardingInLocalTime(availableTargetNames, range, calculateTime);
         }
+        return doShardingInLocalDateTime(availableTargetNames, range, calculateTime);
+    }
+    
+    private Collection<String> doShardingInLocalDateTime(final Collection<String> availableTargetNames, final Range<Comparable<?>> range, final TemporalAccessor calculateTime) {
+        Set<String> result = new HashSet<>();
         LocalDateTime calculateTimeAsView = LocalDateTime.from(calculateTime);
         LocalDateTime dateTimeUpperAsLocalDateTime = LocalDateTime.from(dateTimeUpper);
         LocalDateTime dateTimeLowerAsLocalDateTime = LocalDateTime.from(dateTimeLower);
@@ -183,6 +163,34 @@ public final class IntervalShardingAlgorithm implements StandardShardingAlgorith
         return result;
     }
     
+    private Collection<String> doShardingInLocalTime(final Collection<String> availableTargetNames, final Range<Comparable<?>> range, final TemporalAccessor calculateTime) {
+        Set<String> result = new HashSet<>();
+        LocalTime dateTimeUpperAsLocalTime = dateTimeUpper.query(TemporalQueries.localTime());
+        LocalTime dateTimeLowerAsLocalTime = dateTimeLower.query(TemporalQueries.localTime());
+        LocalTime calculateTimeAsView = calculateTime.query(TemporalQueries.localTime());
+        while (!calculateTimeAsView.isAfter(dateTimeUpperAsLocalTime)) {
+            if (hasIntersection(Range.closedOpen(calculateTimeAsView, calculateTimeAsView.plus(stepAmount, stepUnit)), range, dateTimeLowerAsLocalTime, dateTimeUpperAsLocalTime)) {
+                result.addAll(getMatchedTables(calculateTimeAsView, availableTargetNames));
+            }
+            calculateTimeAsView = calculateTimeAsView.plus(stepAmount, stepUnit);
+        }
+        return result;
+    }
+    
+    private Collection<String> doShardingInLocalDate(final Collection<String> availableTargetNames, final Range<Comparable<?>> range, final TemporalAccessor calculateTime) {
+        Set<String> result = new HashSet<>();
+        LocalDate dateTimeUpperAsLocalDate = dateTimeUpper.query(TemporalQueries.localDate());
+        LocalDate dateTimeLowerAsLocalDate = dateTimeLower.query(TemporalQueries.localDate());
+        LocalDate calculateTimeAsView = calculateTime.query(TemporalQueries.localDate());
+        while (!calculateTimeAsView.isAfter(dateTimeUpperAsLocalDate)) {
+            if (hasIntersection(Range.closedOpen(calculateTimeAsView, calculateTimeAsView.plus(stepAmount, stepUnit)), range, dateTimeLowerAsLocalDate, dateTimeUpperAsLocalDate)) {
+                result.addAll(getMatchedTables(calculateTimeAsView, availableTargetNames));
+            }
+            calculateTimeAsView = calculateTimeAsView.plus(stepAmount, stepUnit);
+        }
+        return result;
+    }
+    
     private boolean hasIntersection(final Range<LocalDateTime> calculateRange, final Range<Comparable<?>> range, final LocalDateTime dateTimeLower, final LocalDateTime dateTimeUpper) {
         LocalDateTime lower = range.hasLowerBound() ? parseLocalDateTime(range.lowerEndpoint()) : dateTimeLower;
         LocalDateTime upper = range.hasUpperBound() ? parseLocalDateTime(range.upperEndpoint()) : dateTimeUpper;
@@ -223,14 +231,12 @@ public final class IntervalShardingAlgorithm implements StandardShardingAlgorith
     }
     
     private String getDateTimeText(final Comparable<?> endpoint) {
-        if (endpoint instanceof ChronoLocalDateTime || endpoint instanceof ChronoZonedDateTime
-                || endpoint instanceof OffsetDateTime || endpoint instanceof ChronoLocalDate
-                || endpoint instanceof LocalTime || endpoint instanceof OffsetTime) {
-            return dateTimeFormatter.format((TemporalAccessor) endpoint);
-        }
         if (endpoint instanceof Instant) {
             return dateTimeFormatter.withZone(ZoneId.systemDefault()).format((Instant) endpoint);
         }
+        if (endpoint instanceof TemporalAccessor) {
+            return dateTimeFormatter.format((TemporalAccessor) endpoint);
+        }
         if (endpoint instanceof Date) {
             return dateTimeFormatter.format(((Date) endpoint).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
         }
@@ -238,15 +244,15 @@ public final class IntervalShardingAlgorithm implements StandardShardingAlgorith
     }
     
     private Collection<String> getMatchedTables(final TemporalAccessor dateTime, final Collection<String> availableTargetNames) {
-        LocalDate viewAsLocalDate = dateTime.query(TemporalQueries.localDate());
-        LocalTime viewAsLocalTime = dateTime.query(TemporalQueries.localTime());
+        LocalDate localDate = dateTime.query(TemporalQueries.localDate());
+        LocalTime localTime = dateTime.query(TemporalQueries.localTime());
         String tableSuffix;
-        if (null == viewAsLocalTime) {
-            tableSuffix = viewAsLocalDate.format(tableSuffixPattern);
+        if (null == localTime) {
+            tableSuffix = localDate.format(tableSuffixPattern);
             return availableTargetNames.parallelStream().filter(each -> each.endsWith(tableSuffix)).collect(Collectors.toSet());
         }
-        if (null == viewAsLocalDate) {
-            tableSuffix = viewAsLocalTime.format(tableSuffixPattern);
+        if (null == localDate) {
+            tableSuffix = localTime.format(tableSuffixPattern);
             return availableTargetNames.parallelStream().filter(each -> each.endsWith(tableSuffix)).collect(Collectors.toSet());
         }
         tableSuffix = LocalDateTime.from(dateTime).format(tableSuffixPattern);