package mil.nga.giat.geowave.core.geotime.store.query; import java.nio.ByteBuffer; import java.util.Date; import mil.nga.giat.geowave.core.index.sfc.data.NumericData; public class TemporalRange { private Date startTime; private Date endTime; public static final Date START_TIME = new Date( 0); public static final Date END_TIME = new Date( Long.MAX_VALUE); public TemporalRange() { startTime = START_TIME; endTime = END_TIME; } public TemporalRange( final Date startTime, final Date endTime ) { super(); this.startTime = startTime; this.endTime = endTime; } public Date getStartTime() { return startTime; } public Date getEndTime() { return endTime; } public void setStartTime( Date startTime ) { this.startTime = startTime; } public void setEndTime( Date endTime ) { this.endTime = endTime; } public boolean isWithin( final Date time ) { return (startTime.before(time) || startTime.equals(time)) && (endTime.equals(time) || endTime.after(time)); } public boolean isWithin( final NumericData timeRange ) { final double st = startTime.getTime(); final double et = endTime.getTime(); final double rst = timeRange.getMin(); final double ret = timeRange.getMax(); return (((st < rst) && (et > rst)) || ((st < ret) && (et > ret)) || ((st < rst) && (et > ret))); } public TemporalRange intersect( TemporalRange range ) { Date start = startTime.after(range.getStartTime()) ? startTime : range.getStartTime(); Date end = endTime.before(range.getEndTime()) ? endTime : range.getEndTime(); if (start.after(end)) return new TemporalRange( START_TIME, START_TIME); return new TemporalRange( start, end); } public TemporalRange union( TemporalRange range ) { Date start = startTime.before(range.getStartTime()) ? startTime : range.getStartTime(); Date end = endTime.after(range.getEndTime()) ? endTime : range.getEndTime(); if (start.after(end)) return new TemporalRange( START_TIME, START_TIME); return new TemporalRange( start, end); } public byte[] toBinary() { final ByteBuffer buf = ByteBuffer.allocate(16); buf.putLong(startTime.getTime()); buf.putLong(endTime.getTime()); return buf.array(); } public void fromBinary( final byte[] data ) { final ByteBuffer buf = ByteBuffer.wrap(data); startTime = new Date( buf.getLong()); endTime = new Date( buf.getLong()); } @Override public String toString() { return "TemporalRange [startTime=" + startTime + ", endTime=" + endTime + "]"; } protected static final int getBufferSize() { return 16; } public boolean isInfinity() { return (startTime.getTime() == 0) && (endTime.getTime() == END_TIME.getTime()); } @Override public int hashCode() { final int prime = 31; int result = 1; result = (prime * result) + ((endTime == null) ? 0 : endTime.hashCode()); result = (prime * result) + ((startTime == null) ? 0 : startTime.hashCode()); return result; } @Override public boolean equals( final Object obj ) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final TemporalRange other = (TemporalRange) obj; if (endTime == null) { if (other.endTime != null) { return false; } } else if (!endTime.equals(other.endTime)) { return false; } if (startTime == null) { if (other.startTime != null) { return false; } } else if (!startTime.equals(other.startTime)) { return false; } return true; } }