diff --git a/data-store/src/main/java/org/lucares/pdb/datastore/internal/DateIndexExtension.java b/data-store/src/main/java/org/lucares/pdb/datastore/internal/DateIndexExtension.java index 3d227b1..f305b05 100644 --- a/data-store/src/main/java/org/lucares/pdb/datastore/internal/DateIndexExtension.java +++ b/data-store/src/main/java/org/lucares/pdb/datastore/internal/DateIndexExtension.java @@ -1,6 +1,5 @@ package org.lucares.pdb.datastore.internal; -import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashSet; @@ -8,11 +7,12 @@ import java.util.List; import java.util.Set; import org.lucares.pdb.api.DateTimeRange; +import org.lucares.utils.DateBucketUnit; import org.lucares.utils.LongToDateBucket; public class DateIndexExtension { - private static final LongToDateBucket longToDateBucket = new LongToDateBucket("yyyyMM", ChronoUnit.MONTHS); + private static final LongToDateBucket longToDateBucket = new LongToDateBucket("yyyyMM", DateBucketUnit.MONTH); static Set toDateIndexPrefix(final DateTimeRange dateRange) { return longToDateBucket.toDateIndexPrefix(dateRange.getStart(), dateRange.getEnd()); @@ -31,7 +31,7 @@ public class DateIndexExtension { */ static List toPartitionIds(final DateTimeRange dateRange) { final List partitionIds = longToDateBucket.toPartitionIds(dateRange.getStart(), dateRange.getEnd(), - ChronoUnit.MONTHS); + DateBucketUnit.MONTH); final List result = new ArrayList<>(); for (final String partitionId : partitionIds) { diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Interval.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Interval.java index f4dffa9..2059c22 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Interval.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Interval.java @@ -1,6 +1,5 @@ package org.lucares.pdb.plot.api; -import java.time.temporal.ChronoUnit; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -10,38 +9,6 @@ import org.lucares.pdb.api.DateTimeRange; import org.lucares.utils.LongToDateBucket; public class Interval { - public enum IntervalTimeUnit { - MINUTE, HOUR, DAY, WEEK, MONTH, YEAR; - - public static boolean isValid(final String value) { - for (final IntervalTimeUnit e : values()) { - if (e.name().equals(value)) { - return true; - } - } - return false; - } - - public ChronoUnit toChronoUnit() { - switch (this) { - case MINUTE: - return ChronoUnit.MINUTES; - case HOUR: - return ChronoUnit.HOURS; - case DAY: - return ChronoUnit.DAYS; - case WEEK: - return ChronoUnit.WEEKS; - case MONTH: - return ChronoUnit.MONTHS; - case YEAR: - return ChronoUnit.YEARS; - default: - throw new IllegalArgumentException("Unexpected value: " + this); - } - } - } - private final IntervalTimeUnit intervalTimeUnit; private final int value; diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/IntervalTimeUnit.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/IntervalTimeUnit.java new file mode 100644 index 0000000..a30af50 --- /dev/null +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/IntervalTimeUnit.java @@ -0,0 +1,35 @@ +package org.lucares.pdb.plot.api; + +import org.lucares.utils.DateBucketUnit; + +public enum IntervalTimeUnit { + MINUTE, HOUR, DAY, WEEK, MONTH, YEAR; + + public static boolean isValid(final String value) { + for (final IntervalTimeUnit e : values()) { + if (e.name().equals(value)) { + return true; + } + } + return false; + } + + public DateBucketUnit toChronoUnit() { + switch (this) { + case MINUTE: + return DateBucketUnit.MINUTE; + case HOUR: + return DateBucketUnit.HOUR; + case DAY: + return DateBucketUnit.DAY; + case WEEK: + return DateBucketUnit.WEEK; + case MONTH: + return DateBucketUnit.MONTH; + case YEAR: + return DateBucketUnit.YEAR; + default: + throw new IllegalArgumentException("Unexpected value: " + this); + } + } +} \ No newline at end of file diff --git a/pdb-utils/src/main/java/org/lucares/utils/BeginningOfNextInterval.java b/pdb-utils/src/main/java/org/lucares/utils/BeginningOfNextInterval.java index 7029975..f7f7ffb 100644 --- a/pdb-utils/src/main/java/org/lucares/utils/BeginningOfNextInterval.java +++ b/pdb-utils/src/main/java/org/lucares/utils/BeginningOfNextInterval.java @@ -6,9 +6,9 @@ import java.time.temporal.TemporalAdjuster; public class BeginningOfNextInterval implements TemporalAdjuster { - private final ChronoUnit unit; + private final DateBucketUnit unit; - public BeginningOfNextInterval(final ChronoUnit unit) { + public BeginningOfNextInterval(final DateBucketUnit unit) { this.unit = unit; } @@ -19,27 +19,27 @@ public class BeginningOfNextInterval implements TemporalAdjuster { result = result.with(startOfInterval); switch (unit) { - case MINUTES: { + case MINUTE: { result = result.plus(1, ChronoUnit.MINUTES); break; } - case HOURS: { + case HOUR: { result = result.plus(1, ChronoUnit.HOURS); break; } - case DAYS: { + case DAY: { result = result.plus(1, ChronoUnit.DAYS); break; } - case WEEKS: { + case WEEK: { result = result.plus(1, ChronoUnit.WEEKS); break; } - case MONTHS: { + case MONTH: { result = result.plus(1, ChronoUnit.MONTHS); break; } - case YEARS: { + case YEAR: { result = result.plus(1, ChronoUnit.YEARS); break; } diff --git a/pdb-utils/src/main/java/org/lucares/utils/DateBucketUnit.java b/pdb-utils/src/main/java/org/lucares/utils/DateBucketUnit.java new file mode 100644 index 0000000..d5017b3 --- /dev/null +++ b/pdb-utils/src/main/java/org/lucares/utils/DateBucketUnit.java @@ -0,0 +1,5 @@ +package org.lucares.utils; + +public enum DateBucketUnit { + MINUTE, HOUR, DAY, WEEK, MONTH, YEAR; +} diff --git a/pdb-utils/src/main/java/org/lucares/utils/EndOfInterval.java b/pdb-utils/src/main/java/org/lucares/utils/EndOfInterval.java index 14f7147..c610b92 100644 --- a/pdb-utils/src/main/java/org/lucares/utils/EndOfInterval.java +++ b/pdb-utils/src/main/java/org/lucares/utils/EndOfInterval.java @@ -6,9 +6,9 @@ import java.time.temporal.TemporalAdjuster; public class EndOfInterval implements TemporalAdjuster { - private final ChronoUnit unit; + private final DateBucketUnit unit; - public EndOfInterval(final ChronoUnit unit) { + public EndOfInterval(final DateBucketUnit unit) { this.unit = unit; } diff --git a/pdb-utils/src/main/java/org/lucares/utils/LongToDateBucket.java b/pdb-utils/src/main/java/org/lucares/utils/LongToDateBucket.java index f350ea1..2ef0778 100644 --- a/pdb-utils/src/main/java/org/lucares/utils/LongToDateBucket.java +++ b/pdb-utils/src/main/java/org/lucares/utils/LongToDateBucket.java @@ -4,7 +4,6 @@ import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; @@ -55,14 +54,14 @@ public class LongToDateBucket { */ private final DateTimeFormatter datePattern; - ChronoUnit chronoUnit; + DateBucketUnit chronoUnit; // visible for test final ConcurrentNavigableMap datePrefixCache = new ConcurrentSkipListMap<>(); private final AtomicReference lastAccessed = new AtomicReference<>(null); - public LongToDateBucket(final String dateFormatPattern, final ChronoUnit chronoUnit) { + public LongToDateBucket(final String dateFormatPattern, final DateBucketUnit chronoUnit) { this.chronoUnit = chronoUnit; this.datePattern = DateTimeFormatter.ofPattern(dateFormatPattern); } @@ -118,7 +117,7 @@ public class LongToDateBucket { * @return */ public List toPartitionIds(final OffsetDateTime start, final OffsetDateTime end, - final ChronoUnit chronoUnit) { + final DateBucketUnit chronoUnit) { final List result = new ArrayList<>(); OffsetDateTime current = start; diff --git a/pdb-utils/src/main/java/org/lucares/utils/StartOfInterval.java b/pdb-utils/src/main/java/org/lucares/utils/StartOfInterval.java index f88f033..9fed363 100644 --- a/pdb-utils/src/main/java/org/lucares/utils/StartOfInterval.java +++ b/pdb-utils/src/main/java/org/lucares/utils/StartOfInterval.java @@ -1,62 +1,50 @@ package org.lucares.utils; import java.time.temporal.ChronoField; -import java.time.temporal.ChronoUnit; import java.time.temporal.Temporal; import java.time.temporal.TemporalAdjuster; public class StartOfInterval implements TemporalAdjuster { - private final ChronoUnit unit; + private final DateBucketUnit unit; - public StartOfInterval(final ChronoUnit unit) { + public StartOfInterval(final DateBucketUnit unit) { this.unit = unit; } @Override public Temporal adjustInto(final Temporal temporal) { Temporal result = temporal; - for (final ChronoUnit chronoUnit : ChronoUnit.values()) { - if (chronoUnit.compareTo(unit) >= 0) { + result = result.with(ChronoField.NANO_OF_SECOND, 0); + result = result.with(ChronoField.MICRO_OF_SECOND, 0); + result = result.with(ChronoField.MILLI_OF_SECOND, 0); + result = result.with(ChronoField.SECOND_OF_MINUTE, 0); + + for (final DateBucketUnit dateBucketUnit : DateBucketUnit.values()) { + if (dateBucketUnit.compareTo(unit) >= 0) { break; } - switch (chronoUnit) { - case NANOS: { - result = result.with(ChronoField.NANO_OF_SECOND, 0); - break; - } - case MICROS: { - result = result.with(ChronoField.MICRO_OF_SECOND, 0); - break; - } - case MILLIS: { - result = result.with(ChronoField.MILLI_OF_SECOND, 0); - break; - } - case SECONDS: { - result = result.with(ChronoField.SECOND_OF_MINUTE, 0); - break; - } - case MINUTES: { + switch (dateBucketUnit) { + case MINUTE: { result = result.with(ChronoField.MINUTE_OF_HOUR, 0); break; } - case HOURS: { + case HOUR: { result = result.with(ChronoField.HOUR_OF_DAY, 0); break; } - case DAYS: { + case DAY: { switch (unit) { - case WEEKS: { + case WEEK: { result = result.with(ChronoField.DAY_OF_WEEK, 1); break; } - case MONTHS: { + case MONTH: { result = result.with(ChronoField.DAY_OF_MONTH, 1); break; } - case YEARS: { + case YEAR: { result = result.with(ChronoField.MONTH_OF_YEAR, 1); break; } @@ -65,15 +53,14 @@ public class StartOfInterval implements TemporalAdjuster { } break; } - case MONTHS: { + case MONTH: { result = result.with(ChronoField.MONTH_OF_YEAR, 1); break; } - case HALF_DAYS: - case WEEKS: + case WEEK: break; default: - throw new IllegalArgumentException("Unexpected value: " + chronoUnit); + throw new IllegalArgumentException("Unexpected value: " + dateBucketUnit); } } diff --git a/pdb-utils/src/test/java/org/lucares/utils/LongToDateBucketTest.java b/pdb-utils/src/test/java/org/lucares/utils/LongToDateBucketTest.java index 314fd6d..a3172d3 100644 --- a/pdb-utils/src/test/java/org/lucares/utils/LongToDateBucketTest.java +++ b/pdb-utils/src/test/java/org/lucares/utils/LongToDateBucketTest.java @@ -2,7 +2,6 @@ package org.lucares.utils; import java.time.OffsetDateTime; import java.time.ZoneOffset; -import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; import java.util.DoubleSummaryStatistics; @@ -49,7 +48,7 @@ public class LongToDateBucketTest { @MethodSource("provider") public void test(final OffsetDateTime start, final OffsetDateTime end, final Set expected) { - final Set actual = new LongToDateBucket("yyyyMM", ChronoUnit.MONTHS).toDateIndexPrefix(start, end); + final Set actual = new LongToDateBucket("yyyyMM", DateBucketUnit.MONTH).toDateIndexPrefix(start, end); Assertions.assertEquals(expected, actual); } @@ -60,18 +59,18 @@ public class LongToDateBucketTest { final OffsetDateTime min_201801 = OffsetDateTime.of(2018, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC); final OffsetDateTime min_201802 = OffsetDateTime.of(2018, 2, 1, 0, 0, 0, 0, ZoneOffset.UTC); - final LongToDateBucket longToDateBucket = new LongToDateBucket("yyyyMM", ChronoUnit.MONTHS); + final LongToDateBucket longToDateBucket = new LongToDateBucket("yyyyMM", DateBucketUnit.MONTH); final List dateIndexPrefixesWithEmptyCache = longToDateBucket.toPartitionIds(mid_201712, min_201802, - ChronoUnit.MONTHS); + DateBucketUnit.MONTH); Assertions.assertEquals(Arrays.asList("201712", "201801", "201802"), dateIndexPrefixesWithEmptyCache); final List dateIndexPrefixesWithFilledCache = longToDateBucket.toPartitionIds(mid_201712, min_201801, - ChronoUnit.MONTHS); + DateBucketUnit.MONTH); Assertions.assertEquals(Arrays.asList("201712", "201801"), dateIndexPrefixesWithFilledCache); final List dateIndexPrefixesOneMonth = longToDateBucket.toPartitionIds(mid_201712, mid_201712, - ChronoUnit.MONTHS); + DateBucketUnit.MONTH); Assertions.assertEquals(Arrays.asList("201712"), dateIndexPrefixesOneMonth); } @@ -84,7 +83,7 @@ public class LongToDateBucketTest { final long exp_201801 = OffsetDateTime.of(2018, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC).toInstant().toEpochMilli(); final long exp_201802 = OffsetDateTime.of(2018, 2, 1, 0, 0, 0, 0, ZoneOffset.UTC).toInstant().toEpochMilli(); - final LongToDateBucket longToDateBucket = new LongToDateBucket("yyyyMM", ChronoUnit.MONTHS); + final LongToDateBucket longToDateBucket = new LongToDateBucket("yyyyMM", DateBucketUnit.MONTH); final List dateIndexEpochMillis = longToDateBucket.toDateIndexEpochMillis(mid_201712, min_201802); Assertions.assertEquals(Arrays.asList(exp_201712, exp_201801, exp_201802), dateIndexEpochMillis); @@ -102,7 +101,7 @@ public class LongToDateBucketTest { final int warmup = 20 * factor; final int rounds = warmup + 20; - final LongToDateBucket longToDateBucket = new LongToDateBucket("yyyyMM", ChronoUnit.MONTHS); + final LongToDateBucket longToDateBucket = new LongToDateBucket("yyyyMM", DateBucketUnit.MONTH); // fill the cache for (long i = min; i < max; i += 3600 * 24 * 28) {