Skip to content
Snippets Groups Projects
Commit 8bb0e926 authored by Luc Maisonobe's avatar Luc Maisonobe
Browse files

Added a link from Span to Transition in TimeSpanMap.

parent 249159f4
No related branches found
No related tags found
No related merge requests found
......@@ -268,18 +268,23 @@ public class TimeSpanMap<T> {
* @since 9.3
*/
public Span<T> getSpan(final AbsoluteDate date) {
if (data.size() == 1) {
final Transition<T> single = data.first();
if (single.getBefore() == single.getAfter()) {
// the single entry was a dummy one, without a real transition
return new Span<>(single.getBefore(), null, null);
}
}
final Transition<T> previous = data.floor(new Transition<>(date, null, null));
if (previous == null) {
// there are no transition before the specified date
// return the first valid entry
return new Span<>(data.first().getBefore(),
AbsoluteDate.PAST_INFINITY,
data.first().getDate());
return new Span<>(data.first().getBefore(), null, data.first());
} else {
final Transition<T> next = data.higher(previous);
return new Span<>(previous.getAfter(),
previous.getDate(),
next == null ? AbsoluteDate.FUTURE_INFINITY : next.getDate());
return new Span<>(previous.getAfter(), previous, next == null ? null : next);
}
}
......@@ -426,18 +431,18 @@ public class TimeSpanMap<T> {
/** Valid data. */
private final S data;
/** Start of validity for the data. */
private final AbsoluteDate start;
/** Start of validity for the data (null if span extends to past infinity). */
private Transition<S> start;
/** End of validity for the data. */
private final AbsoluteDate end;
/** End of validity for the data (null if span extends to future infinity). */
private Transition<S> end;
/** Simple constructor.
* @param data valid data
* @param start start of validity for the data
* @param end end of validity for the data
* @param start transition at start of validity for the data (null if span extends to past infinity)
* @param end transition at end of validity for the data (null if span extends to future infinity)
*/
private Span(final S data, final AbsoluteDate start, final AbsoluteDate end) {
private Span(final S data, final Transition<S> start, final Transition<S> end) {
this.data = data;
this.start = start;
this.end = end;
......@@ -451,16 +456,38 @@ public class TimeSpanMap<T> {
}
/** Get the start of this time span.
* @return start of this time span
* @return start of this time span (will be {@link AbsoluteDate#PAST_INFINITY}
* if {@link #getStartTransition() returns null)
* @see #getStartTransition()
*/
public AbsoluteDate getStart() {
return start == null ? AbsoluteDate.PAST_INFINITY : start.getDate();
}
/** Get the transition at start of this time span.
* @return transition at start of this time span (null if span extends to past infinity)
* @see #getStart()
* @since 11.1
*/
public Transition<S> getStartTransition() {
return start;
}
/** Get the end of this time span.
* @return end of this time span
* @return end of this time span (will be {@link AbsoluteDate#FUTURE_INFINITY}
* if {@link #getEndTransition() returns null)
* @see #getEndTransition()
*/
public AbsoluteDate getEnd() {
return end == null ? AbsoluteDate.FUTURE_INFINITY : end.getDate();
}
/** Get the transition at end of this time span.
* @return transition at end of this time span (null if span extends to future infinity)
* @see #getEnd()
* @since 11.1
*/
public Transition<S> getEndTransition() {
return end;
}
......
......@@ -173,7 +173,7 @@ public class TimeSpanMapTest {
@Test
public void testExtractRangeInfinity() {
final AbsoluteDate ref = AbsoluteDate.J2000_EPOCH;
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
map.addValidAfter(Integer.valueOf(10), ref.shiftedBy(10.0), false);
map.addValidAfter(Integer.valueOf( 3), ref.shiftedBy( 2.0), false);
map.addValidAfter(Integer.valueOf( 9), ref.shiftedBy( 5.0), false);
......@@ -186,7 +186,7 @@ public class TimeSpanMapTest {
@Test
public void testExtractRangeSingleEntry() {
final AbsoluteDate ref = AbsoluteDate.J2000_EPOCH;
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
map.addValidAfter(Integer.valueOf(10), ref.shiftedBy(10.0), false);
map.addValidAfter(Integer.valueOf( 3), ref.shiftedBy( 2.0), false);
map.addValidAfter(Integer.valueOf( 9), ref.shiftedBy( 5.0), false);
......@@ -201,7 +201,7 @@ public class TimeSpanMapTest {
@Test
public void testExtractFromPastInfinity() {
final AbsoluteDate ref = AbsoluteDate.J2000_EPOCH;
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
map.addValidAfter(Integer.valueOf(10), ref.shiftedBy(10.0), false);
map.addValidAfter(Integer.valueOf( 3), ref.shiftedBy( 2.0), false);
map.addValidAfter(Integer.valueOf( 9), ref.shiftedBy( 5.0), false);
......@@ -224,7 +224,7 @@ public class TimeSpanMapTest {
@Test
public void testExtractToFutureInfinity() {
final AbsoluteDate ref = AbsoluteDate.J2000_EPOCH;
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
map.addValidAfter(Integer.valueOf(10), ref.shiftedBy(10.0), false);
map.addValidAfter(Integer.valueOf( 3), ref.shiftedBy( 2.0), false);
map.addValidAfter(Integer.valueOf( 9), ref.shiftedBy( 5.0), false);
......@@ -245,7 +245,7 @@ public class TimeSpanMapTest {
@Test
public void testExtractIntermediate() {
final AbsoluteDate ref = AbsoluteDate.J2000_EPOCH;
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
map.addValidAfter(Integer.valueOf(10), ref.shiftedBy(10.0), false);
map.addValidAfter(Integer.valueOf( 3), ref.shiftedBy( 2.0), false);
map.addValidAfter(Integer.valueOf( 9), ref.shiftedBy( 5.0), false);
......@@ -261,6 +261,54 @@ public class TimeSpanMapTest {
Assert.assertEquals( 5, range.get(ref.shiftedBy(999.9)).intValue());
}
@Test
public void testSpanToTransitionLinkEmpty() {
TimeSpanMap.Span<Integer> span = new TimeSpanMap<>(1).getSpan(AbsoluteDate.ARBITRARY_EPOCH);
Assert.assertEquals(1, span.getData().intValue());
Assert.assertSame(AbsoluteDate.PAST_INFINITY, span.getStart());
Assert.assertNull(span.getStartTransition());
Assert.assertSame(AbsoluteDate.FUTURE_INFINITY, span.getEnd());
Assert.assertNull(span.getEndTransition());
}
@Test
public void testSpanToTransitionLink() {
final AbsoluteDate ref = AbsoluteDate.ARBITRARY_EPOCH;
TimeSpanMap<Integer> map = new TimeSpanMap<>(Integer.valueOf(0));
map.addValidAfter(Integer.valueOf(10), ref.shiftedBy(10.0), false);
map.addValidAfter(Integer.valueOf( 3), ref.shiftedBy( 2.0), false);
map.addValidAfter(Integer.valueOf( 9), ref.shiftedBy( 5.0), false);
map.addValidBefore(Integer.valueOf( 2), ref.shiftedBy( 3.0), false);
map.addValidBefore(Integer.valueOf( 5), ref.shiftedBy( 9.0), false);
TimeSpanMap.Span<Integer> first = map.getSpan(ref.shiftedBy(-99.0));
Assert.assertEquals(0, first.getData().intValue());
Assert.assertSame(AbsoluteDate.PAST_INFINITY, first.getStart());
Assert.assertNull(first.getStartTransition());
Assert.assertEquals(2.0, first.getEnd().durationFrom(ref), 1.0e-15);
Assert.assertNotNull(first.getEndTransition());
TimeSpanMap.Span<Integer> middle = map.getSpan(ref.shiftedBy(6.0));
Assert.assertEquals(5, middle.getData().intValue());
Assert.assertEquals(5.0, middle.getStart().durationFrom(ref), 1.0e-15);
Assert.assertNotNull(middle.getStartTransition());
Assert.assertEquals(9.0, middle.getEnd().durationFrom(ref), 1.0e-15);
Assert.assertNotNull(middle.getEndTransition());
Assert.assertSame(middle.getStartTransition().getAfter(), middle.getEndTransition().getBefore());
Assert.assertEquals(3, middle.getStartTransition().getBefore().intValue());
Assert.assertEquals(5, middle.getStartTransition().getAfter().intValue());
Assert.assertEquals(5, middle.getEndTransition().getBefore().intValue());
Assert.assertEquals(9, middle.getEndTransition().getAfter().intValue());
TimeSpanMap.Span<Integer> last = map.getSpan(ref.shiftedBy(+99.0));
Assert.assertEquals(10, last.getData().intValue());
Assert.assertEquals(10.0, last.getStart().durationFrom(ref), 1.0e-15);
Assert.assertNotNull(last.getStartTransition());
Assert.assertSame(AbsoluteDate.FUTURE_INFINITY, last.getEnd());
Assert.assertNull(last.getEndTransition());
}
@Before
public void setUp() {
Utils.setDataRoot("regular-data");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment