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);