cache last used date prefix
The 99.9999% use case is to ingest data from the same month.
This commit is contained in:
@@ -13,6 +13,7 @@ import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
import java.util.concurrent.ConcurrentNavigableMap;
|
||||
import java.util.concurrent.ConcurrentSkipListMap;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.lucares.pdb.api.DateTimeRange;
|
||||
|
||||
@@ -26,6 +27,8 @@ public class DateIndexExtension {
|
||||
// visible for test
|
||||
static final ConcurrentNavigableMap<Long, DatePrefixAndRange> DATE_PREFIX_CACHE = new ConcurrentSkipListMap<>();
|
||||
|
||||
private static final AtomicReference<DatePrefixAndRange> LAST_ACCESSED = new AtomicReference<>(null);
|
||||
|
||||
static Set<String> toDateIndexPrefix(final DateTimeRange dateRange) {
|
||||
final Set<String> result = new TreeSet<>();
|
||||
|
||||
@@ -46,18 +49,24 @@ public class DateIndexExtension {
|
||||
}
|
||||
|
||||
public static ParititionId toPartitionId(final long epochMilli) {
|
||||
// TODO most calls will be for a similar date -> add a shortcut
|
||||
final Entry<Long, DatePrefixAndRange> value = DATE_PREFIX_CACHE.floorEntry(epochMilli);
|
||||
|
||||
String result;
|
||||
if (value == null || !value.getValue().contains(epochMilli)) {
|
||||
final DatePrefixAndRange newValue = toDatePrefixAndRange(epochMilli);
|
||||
DATE_PREFIX_CACHE.put(newValue.getMinEpochMilli(), newValue);
|
||||
result = newValue.getDatePrefix();
|
||||
final DatePrefixAndRange lastAccessed = LAST_ACCESSED.get();
|
||||
if (lastAccessed != null && lastAccessed.getMinEpochMilli() <= epochMilli
|
||||
&& lastAccessed.getMaxEpochMilli() >= epochMilli) {
|
||||
result = lastAccessed.getDatePrefix();
|
||||
} else {
|
||||
result = value.getValue().getDatePrefix();
|
||||
}
|
||||
final Entry<Long, DatePrefixAndRange> value = DATE_PREFIX_CACHE.floorEntry(epochMilli);
|
||||
|
||||
if (value == null || !value.getValue().contains(epochMilli)) {
|
||||
final DatePrefixAndRange newValue = toDatePrefixAndRange(epochMilli);
|
||||
DATE_PREFIX_CACHE.put(newValue.getMinEpochMilli(), newValue);
|
||||
result = newValue.getDatePrefix();
|
||||
LAST_ACCESSED.set(newValue);
|
||||
} else {
|
||||
result = value.getValue().getDatePrefix();
|
||||
LAST_ACCESSED.set(value.getValue());
|
||||
}
|
||||
}
|
||||
return new ParititionId(result);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user