Skip to content

Commit 28273b2

Browse files
authored
Utility to find first discontinuity in timeline (#99)
1 parent 393dad7 commit 28273b2

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/main/java/no/nav/fpsak/tidsserie/LocalDateTimeline.java

+13-4
Original file line numberDiff line numberDiff line change
@@ -476,23 +476,32 @@ public <T, R> LocalDateTimeline<R> union(LocalDateTimeline<T> other, final Local
476476
/**
477477
* Whether this timeline is continuous and not empty for its entire interval.
478478
*
479-
* @return true if continuous and not empty for whole matchInterval
479+
* @return true if continuous
480480
*/
481481
public boolean isContinuous() {
482+
return firstDiscontinuity() == null;
483+
}
484+
485+
/**
486+
* Return the first interval, if any, not covered by the timeline. Utility when full disjoint is not needed
487+
*
488+
* @return null if continuous, first interval
489+
*/
490+
public LocalDateInterval firstDiscontinuity() {
482491
if (segments.size() == 1) {
483-
return true;
492+
return null;
484493
}
485494

486495
LocalDateInterval lastInterval = null;
487496
for (LocalDateSegment<V> entry : segments) {
488497
if (lastInterval != null) {
489498
if (!lastInterval.abuts(entry.getLocalDateInterval())) {
490-
return false;
499+
return new LocalDateInterval(lastInterval.getTomDato().plusDays(1), entry.getLocalDateInterval().getFomDato().minusDays(1));
491500
}
492501
}
493502
lastInterval = entry.getLocalDateInterval();
494503
}
495-
return true;
504+
return null;
496505
}
497506

498507
/**

src/test/java/no/nav/fpsak/tidsserie/LocalDateTimelineTest.java

+7
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,19 @@ class LocalDateTimelineTest {
2626
void skal_opprette_kontinuerlig_tidslinje() {
2727
LocalDateTimeline<String> tidslinje = basicContinuousTimeline();
2828
assertThat(tidslinje.isContinuous()).isTrue();
29+
assertThat(tidslinje.firstDiscontinuity()).isNull();
2930
}
3031

3132
@Test
3233
void skal_opprette_ikke_kontinuerlig_tidslinje() {
3334
LocalDateTimeline<String> tidslinje = basicDiscontinuousTimeline();
3435
assertThat(tidslinje.isContinuous()).isFalse();
36+
var firstDiscontinuedInterval = tidslinje.firstDiscontinuity();
37+
assertThat(firstDiscontinuedInterval).isNotNull();
38+
// tidslinje = Timeline of two intervals A,C. Verify that full timeline A,B,C - A,C = B = discontinuity
39+
var continuousTimeline = new LocalDateTimeline<>(tidslinje.getMinLocalDate(), tidslinje.getMaxLocalDate(), "hello world");
40+
assertThat(continuousTimeline.disjoint(tidslinje).getLocalDateIntervals().stream().findFirst().orElseThrow()).isEqualTo(firstDiscontinuedInterval);
41+
3542
}
3643

3744
@Test

0 commit comments

Comments
 (0)