add interval splitting for bar charts
This commit is contained in:
@@ -4,6 +4,7 @@ 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;
|
||||
@@ -54,12 +55,15 @@ public class LongToDateBucket {
|
||||
*/
|
||||
private final DateTimeFormatter datePattern;
|
||||
|
||||
ChronoUnit chronoUnit;
|
||||
|
||||
// visible for test
|
||||
final ConcurrentNavigableMap<Long, DatePrefixAndRange> datePrefixCache = new ConcurrentSkipListMap<>();
|
||||
|
||||
private final AtomicReference<DatePrefixAndRange> lastAccessed = new AtomicReference<>(null);
|
||||
|
||||
public LongToDateBucket(final String dateFormatPattern) {
|
||||
public LongToDateBucket(final String dateFormatPattern, final ChronoUnit chronoUnit) {
|
||||
this.chronoUnit = chronoUnit;
|
||||
this.datePattern = DateTimeFormatter.ofPattern(dateFormatPattern);
|
||||
}
|
||||
|
||||
@@ -104,40 +108,43 @@ public class LongToDateBucket {
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toDateIndexPrefix(final long epochMilli) {
|
||||
|
||||
final Entry<Long, DatePrefixAndRange> value = datePrefixCache.floorEntry(epochMilli);
|
||||
|
||||
String result;
|
||||
if (value == null || !value.getValue().contains(epochMilli)) {
|
||||
final DatePrefixAndRange newValue = toDatePrefixAndRange(epochMilli);
|
||||
datePrefixCache.put(newValue.getMinEpochMilli(), newValue);
|
||||
result = newValue.getDatePrefix();
|
||||
} else {
|
||||
result = value.getValue().getDatePrefix();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
// public String toDateIndexPrefix(final long epochMilli) {
|
||||
//
|
||||
// final Entry<Long, DatePrefixAndRange> value = datePrefixCache.floorEntry(epochMilli);
|
||||
//
|
||||
// String result;
|
||||
// if (value == null || !value.getValue().contains(epochMilli)) {
|
||||
// final DatePrefixAndRange newValue = toDatePrefixAndRange(epochMilli);
|
||||
// datePrefixCache.put(newValue.getMinEpochMilli(), newValue);
|
||||
// result = newValue.getDatePrefix();
|
||||
// } else {
|
||||
// result = value.getValue().getDatePrefix();
|
||||
// }
|
||||
//
|
||||
// return result;
|
||||
// }
|
||||
|
||||
/**
|
||||
* only for tests, use toPartitionIds(final DateTimeRange dateRange,final
|
||||
* Collection<? extends PartitionId> availablePartitionIds) instead
|
||||
*
|
||||
* @param chronoUnit
|
||||
*
|
||||
* @param dateRange
|
||||
* @return
|
||||
*/
|
||||
public List<String> toPartitionIds(final OffsetDateTime start, final OffsetDateTime end) {
|
||||
public List<String> toPartitionIds(final OffsetDateTime start, final OffsetDateTime end,
|
||||
final ChronoUnit chronoUnit) {
|
||||
final List<String> result = new ArrayList<>();
|
||||
|
||||
OffsetDateTime current = start;
|
||||
current = current.withOffsetSameInstant(ZoneOffset.UTC).withDayOfMonth(1).withHour(0).withMinute(0)
|
||||
.withSecond(0).withNano(0);
|
||||
|
||||
current = current.with(new StartOfInterval(chronoUnit));
|
||||
|
||||
while (!current.isAfter(end)) {
|
||||
final String id = toDateIndexPrefix(current);
|
||||
result.add(id);
|
||||
current = current.plusMonths(1);
|
||||
current = current.with(new BeginningOfNextInterval(chronoUnit));
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -145,12 +152,12 @@ public class LongToDateBucket {
|
||||
|
||||
private DatePrefixAndRange toDatePrefixAndRange(final long epochMilli) {
|
||||
final OffsetDateTime date = Instant.ofEpochMilli(epochMilli).atOffset(ZoneOffset.UTC);
|
||||
final OffsetDateTime beginOfMonth = date.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
|
||||
final OffsetDateTime endOfMonth = beginOfMonth.plusMonths(1).minusNanos(1);
|
||||
final OffsetDateTime begin = date.with(new StartOfInterval(chronoUnit));
|
||||
final OffsetDateTime end = begin.with(new EndOfInterval(chronoUnit));
|
||||
|
||||
final String datePrefix = date.format(datePattern);
|
||||
final long minEpochMilli = beginOfMonth.toInstant().toEpochMilli();
|
||||
final long maxEpochMilli = endOfMonth.toInstant().toEpochMilli();
|
||||
final long minEpochMilli = begin.toInstant().toEpochMilli();
|
||||
final long maxEpochMilli = end.toInstant().toEpochMilli();
|
||||
|
||||
return new DatePrefixAndRange(datePrefix, minEpochMilli, maxEpochMilli);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user