use of de.invesdwin.util.collections.iterable.skip.ASkippingIterable in project invesdwin-context-persistence by subes.
the class ASegmentedTimeSeriesStorageCache method getSegments.
private ICloseableIterable<TimeRange> getSegments(final FDate from, final FDate to, final FDate lastAvailableSegmentTo) {
if (from == null || to == null) {
return EmptyCloseableIterable.getInstance();
}
final TimeRange nextSegment = getSegmentFinder(key).query().getValue(to.addMilliseconds(1));
final FDate adjTo;
if (to.equalsNotNullSafe(lastAvailableSegmentTo) && nextSegment.getFrom().equalsNotNullSafe(to)) {
// adjust for overlapping segments
adjTo = to.addMilliseconds(-1);
} else {
adjTo = to;
}
final FDate adjFrom = from;
final ICloseableIterable<TimeRange> segments = new ICloseableIterable<TimeRange>() {
@Override
public ICloseableIterator<TimeRange> iterator() {
return new ICloseableIterator<TimeRange>() {
private TimeRange nextSegment = getSegmentFinder(key).query().getValue(adjFrom);
@Override
public boolean hasNext() {
return nextSegment != null && nextSegment.getFrom().isBeforeOrEqualTo(adjTo);
}
@Override
public TimeRange next() {
if (nextSegment == null) {
throw new FastNoSuchElementException("ASegmentedTimeSeriesStorageCache getSegments nextSegment is null");
}
final TimeRange curSegment = nextSegment;
// get one segment later
nextSegment = determineNextSegment(curSegment);
return curSegment;
}
private TimeRange determineNextSegment(final TimeRange curSegment) {
final FDate nextSegmentStart = nextSegment.getTo().addMilliseconds(1);
final TimeRange nextSegment = getSegmentFinder(key).query().getValue(nextSegmentStart);
if (!curSegment.getTo().equalsNotNullSafe(nextSegment.getFrom()) && !nextSegmentStart.equals(nextSegment.getFrom())) {
// allow overlapping segments
throw new IllegalStateException("Segment start expected [" + curSegment.getTo() + " or " + nextSegmentStart + "] != found [" + nextSegment.getFrom() + "]");
}
return nextSegment;
}
@Override
public void close() {
nextSegment = null;
}
};
}
};
final ASkippingIterable<TimeRange> filteredSegments = new ASkippingIterable<TimeRange>(segments) {
@Override
protected boolean skip(final TimeRange element) {
// though additionally skip ranges that exceed the available dates
final FDate segmentTo = element.getTo();
if (segmentTo.isBefore(adjFrom)) {
throw new IllegalStateException("segmentTo [" + segmentTo + "] should not be before adjFrom [" + adjFrom + "]");
}
final FDate segmentFrom = element.getFrom();
if (segmentFrom.isAfter(adjTo)) {
// no need to continue going higher
throw new FastNoSuchElementException("ASegmentedTimeSeriesStorageCache getSegments end reached");
}
return false;
}
};
return filteredSegments;
}
use of de.invesdwin.util.collections.iterable.skip.ASkippingIterable in project invesdwin-context-persistence by subes.
the class ASegmentedTimeSeriesStorageCache method getSegmentsReverse.
private ICloseableIterable<TimeRange> getSegmentsReverse(final FDate from, final FDate to, final FDate lastAvailableSegmentTo) {
if (from == null || to == null) {
return EmptyCloseableIterable.getInstance();
}
final TimeRange nextSegment = getSegmentFinder(key).query().getValue(from.addMilliseconds(1));
final FDate adjFrom;
if (from.equalsNotNullSafe(lastAvailableSegmentTo) && nextSegment.getFrom().equalsNotNullSafe(from)) {
// adjust for overlapping segments
adjFrom = from.addMilliseconds(-1);
} else {
adjFrom = from;
}
final FDate adjTo = to;
final ICloseableIterable<TimeRange> segments = new ICloseableIterable<TimeRange>() {
@Override
public ICloseableIterator<TimeRange> iterator() {
return new ICloseableIterator<TimeRange>() {
private TimeRange nextSegment = getSegmentFinder(key).query().getValue(adjFrom);
@Override
public boolean hasNext() {
return nextSegment != null && nextSegment.getTo().isAfter(adjTo);
}
@Override
public TimeRange next() {
final TimeRange curSegment = nextSegment;
if (curSegment == null) {
throw new FastNoSuchElementException("ASegmentedTimeSeriesStorageCache getSegments end reached null");
}
// get one segment earlier
nextSegment = getSegmentFinder(key).query().setFutureNullEnabled().getValue(nextSegment.getFrom().addMilliseconds(-1));
return curSegment;
}
@Override
public void close() {
nextSegment = null;
}
};
}
};
final ASkippingIterable<TimeRange> filteredSegments = new ASkippingIterable<TimeRange>(segments) {
@Override
protected boolean skip(final TimeRange element) {
// though additionally skip ranges that exceed the available dates
final FDate segmentTo = element.getTo();
if (segmentTo.isBefore(adjTo)) {
// no need to continue going lower
throw new FastNoSuchElementException("ASegmentedTimeSeriesStorageCache getSegments end reached adjTo");
}
// skip last value and continue with earlier ones
final FDate segmentFrom = element.getFrom();
return segmentFrom.isAfter(adjFrom);
}
};
return filteredSegments;
}
Aggregations