Merge "Issue #2245 Make all DataTime comparisons consistent. Change-Id: I1d4bc8c75860f948c6780761cc862f2acb25874d" into development
Former-commit-id:9f0698fe75
[formerly 971df482819466e48efcbc3a1b01eab88687436a] Former-commit-id:c5b96690ce
This commit is contained in:
commit
b18fa88aaf
5 changed files with 187 additions and 324 deletions
|
@ -38,6 +38,7 @@ import org.apache.commons.collections.map.MultiValueMap;
|
||||||
|
|
||||||
import com.raytheon.uf.common.time.DataTime;
|
import com.raytheon.uf.common.time.DataTime;
|
||||||
import com.raytheon.uf.common.time.DataTime.FLAG;
|
import com.raytheon.uf.common.time.DataTime.FLAG;
|
||||||
|
import com.raytheon.uf.common.time.DataTimeComparator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -48,7 +49,9 @@ import com.raytheon.uf.common.time.DataTime.FLAG;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Jun 19, 2007 chammack Initial Creation.
|
* Jun 19, 2007 chammack Initial Creation.
|
||||||
* May 31, 2013 DR 15908 dhuffman Removed a null from a method call to cease a null pointer exception.
|
* May 31, 2013 15908 dhuffman Removed a null from a method call to
|
||||||
|
* cease a null pointer exception.
|
||||||
|
* Aug 08, 2013 2245 bsteffen Make all DataTime comparisons consistent.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -177,14 +180,9 @@ public class TimeMatcher {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (DataTime time : times) {
|
Collections.sort(times, new DataTimeComparator(
|
||||||
if (time != null) {
|
DataTimeComparator.SortKey.VALID_TIME,
|
||||||
time.setSortKeys(DataTime.SortKey.VALID_TIME,
|
DataTimeComparator.SortKey.FORECAST_TIME, true));
|
||||||
DataTime.SortKey.FORECAST_TIME, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Collections.sort(times);
|
|
||||||
|
|
||||||
if (majorIndex == null) {
|
if (majorIndex == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -896,11 +894,9 @@ public class TimeMatcher {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (DataTime t : times) {
|
Collections.sort(times, new DataTimeComparator(
|
||||||
t.setSortKeys(DataTime.SortKey.INITIAL_TIME,
|
DataTimeComparator.SortKey.INITIAL_TIME,
|
||||||
DataTime.SortKey.FORECAST_TIME, true);
|
DataTimeComparator.SortKey.FORECAST_TIME, true));
|
||||||
}
|
|
||||||
Collections.sort(times);
|
|
||||||
|
|
||||||
if (majorIndex == null) {
|
if (majorIndex == null) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
/**
|
|
||||||
* This software was developed and / or modified by Raytheon Company,
|
|
||||||
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
|
||||||
*
|
|
||||||
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
|
||||||
* This software product contains export-restricted data whose
|
|
||||||
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
|
||||||
* to non-U.S. persons whether in the United States or abroad requires
|
|
||||||
* an export license or other authorization.
|
|
||||||
*
|
|
||||||
* Contractor Name: Raytheon Company
|
|
||||||
* Contractor Address: 6825 Pine Street, Suite 340
|
|
||||||
* Mail Stop B8
|
|
||||||
* Omaha, NE 68106
|
|
||||||
* 402.291.0100
|
|
||||||
*
|
|
||||||
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
|
||||||
* further licensing information.
|
|
||||||
**/
|
|
||||||
package com.raytheon.edex.util;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import com.raytheon.uf.common.dataplugin.PluginDataObject;
|
|
||||||
import com.raytheon.uf.common.time.DataTime;
|
|
||||||
import com.raytheon.uf.common.time.DataTime.SortKey;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Utility methods pertaining to time
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* SOFTWARE HISTORY
|
|
||||||
* Date Ticket# Engineer Description
|
|
||||||
* ------------ ---------- ----------- --------------------------
|
|
||||||
* Nov 20, 2007 njensen Initial creation
|
|
||||||
*
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @author njensen
|
|
||||||
* @version 1.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class TimeSeriesUtil {
|
|
||||||
|
|
||||||
public static PluginDataObject[] sortByTime(PluginDataObject[] unsorted,
|
|
||||||
SortKey majorKey, SortKey minorKey) {
|
|
||||||
int size = unsorted.length;
|
|
||||||
PluginDataObject[] sorted = new PluginDataObject[size];
|
|
||||||
DataTime[] dt = new DataTime[size];
|
|
||||||
HashMap<DataTime, PluginDataObject> map = new HashMap<DataTime, PluginDataObject>();
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
DataTime time = unsorted[i].getDataTime();
|
|
||||||
time.setSortKeys(majorKey, minorKey, false);
|
|
||||||
dt[i] = time;
|
|
||||||
map.put(time, unsorted[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Arrays.sort(dt);
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
sorted[i] = map.get(dt[i]);
|
|
||||||
}
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -7,7 +7,8 @@ import java.util.TimeZone;
|
||||||
import javax.persistence.Transient;
|
import javax.persistence.Transient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO Add Description
|
* A single DataTime object representing 2 DataTimes, useful for products which
|
||||||
|
* are a combination of other products with potentially different times.
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
*
|
*
|
||||||
|
@ -16,6 +17,7 @@ import javax.persistence.Transient;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Jan 10, 2011 rgeorge Initial creation
|
* Jan 10, 2011 rgeorge Initial creation
|
||||||
|
* Aug 08, 2013 2245 bsteffen Make all DataTime comparisons consistent.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -45,8 +47,6 @@ public class CombinedDataTime extends DataTime {
|
||||||
this.primaryDataTime = primaryDataTime;
|
this.primaryDataTime = primaryDataTime;
|
||||||
this.fcstTime = primaryDataTime.fcstTime;
|
this.fcstTime = primaryDataTime.fcstTime;
|
||||||
this.levelValue = primaryDataTime.levelValue;
|
this.levelValue = primaryDataTime.levelValue;
|
||||||
this.majorKey = primaryDataTime.majorKey;
|
|
||||||
this.minorKey = primaryDataTime.minorKey;
|
|
||||||
this.refTime = primaryDataTime.refTime;
|
this.refTime = primaryDataTime.refTime;
|
||||||
this.utilityFlags = primaryDataTime.utilityFlags;
|
this.utilityFlags = primaryDataTime.utilityFlags;
|
||||||
this.validPeriod = new TimeRange(this.refTime,
|
this.validPeriod = new TimeRange(this.refTime,
|
||||||
|
@ -88,8 +88,6 @@ public class CombinedDataTime extends DataTime {
|
||||||
result = prime * result + fcstTime;
|
result = prime * result + fcstTime;
|
||||||
result = prime * result
|
result = prime * result
|
||||||
+ ((levelValue == null) ? 0 : levelValue.hashCode());
|
+ ((levelValue == null) ? 0 : levelValue.hashCode());
|
||||||
result = prime * result + ((majorKey == null) ? 0 : majorKey.ordinal());
|
|
||||||
result = prime * result + ((minorKey == null) ? 0 : minorKey.ordinal());
|
|
||||||
if (utilityFlags == null) {
|
if (utilityFlags == null) {
|
||||||
result = prime * result + 0;
|
result = prime * result + 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -248,106 +246,4 @@ public class CombinedDataTime extends DataTime {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the left hand side is greater than the right hand side
|
|
||||||
*
|
|
||||||
* @param rhs
|
|
||||||
* the right hand side
|
|
||||||
* @return true if left hand side is greater than
|
|
||||||
*/
|
|
||||||
public boolean greaterThan(DataTime rhs) {
|
|
||||||
|
|
||||||
if (rhs.getRefTime() == null) {
|
|
||||||
return (fcstTime > rhs.getFcstTime());
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (matchMode) {
|
|
||||||
switch (majorKey) {
|
|
||||||
case INITIAL_TIME:
|
|
||||||
if (getMatchRef() > rhs.getMatchRef())
|
|
||||||
return true;
|
|
||||||
if (getMatchRef() < rhs.getMatchRef())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case FORECAST_TIME:
|
|
||||||
if (getRefTime().getTime() == 0)
|
|
||||||
return false;
|
|
||||||
if (getMatchFcst() > rhs.getMatchFcst())
|
|
||||||
return true;
|
|
||||||
if (getMatchFcst() < rhs.getMatchFcst())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case VALID_TIME:
|
|
||||||
if (getMatchValid() > rhs.getMatchValid())
|
|
||||||
return true;
|
|
||||||
if (getMatchValid() < rhs.getMatchValid())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
switch (minorKey) {
|
|
||||||
case INITIAL_TIME:
|
|
||||||
if (getMatchRef() > rhs.getMatchRef())
|
|
||||||
return true;
|
|
||||||
if (getMatchRef() < rhs.getMatchRef())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case FORECAST_TIME:
|
|
||||||
if (getMatchFcst() > rhs.getMatchFcst())
|
|
||||||
return true;
|
|
||||||
if (getMatchFcst() < rhs.getMatchFcst())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case VALID_TIME:
|
|
||||||
if (getMatchFcst() > rhs.getMatchFcst())
|
|
||||||
return true;
|
|
||||||
if (getMatchFcst() < rhs.getMatchFcst())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (getLevelValue() > rhs.getLevelValue()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (majorKey) {
|
|
||||||
case INITIAL_TIME:
|
|
||||||
if (refTime.getTime() > rhs.refTime.getTime())
|
|
||||||
return true;
|
|
||||||
if (refTime.getTime() < rhs.refTime.getTime())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case FORECAST_TIME:
|
|
||||||
if (fcstTime > rhs.fcstTime)
|
|
||||||
return true;
|
|
||||||
if (fcstTime < rhs.fcstTime)
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case VALID_TIME:
|
|
||||||
if (getValidTime().getTimeInMillis() > rhs.getValidTime()
|
|
||||||
.getTimeInMillis())
|
|
||||||
return true;
|
|
||||||
if (getValidTime().getTimeInMillis() < rhs.getValidTime()
|
|
||||||
.getTimeInMillis())
|
|
||||||
return false;
|
|
||||||
if (refTime.getTime() > rhs.getRefTime().getTime())
|
|
||||||
return true;
|
|
||||||
if (refTime.getTime() < rhs.getRefTime().getTime())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
switch (minorKey) {
|
|
||||||
case INITIAL_TIME:
|
|
||||||
if (refTime.getTime() > rhs.refTime.getTime())
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
case FORECAST_TIME:
|
|
||||||
if (fcstTime > rhs.fcstTime)
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
case VALID_TIME:
|
|
||||||
if (refTime.getTime() + (fcstTime * 1000) > rhs.refTime
|
|
||||||
.getTime() + (rhs.fcstTime * 1000))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import java.io.Serializable;
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
@ -46,6 +47,7 @@ import org.hibernate.annotations.Type;
|
||||||
import com.raytheon.uf.common.serialization.ISerializableObject;
|
import com.raytheon.uf.common.serialization.ISerializableObject;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||||
|
import com.raytheon.uf.common.time.DataTimeComparator.SortKey;
|
||||||
import com.raytheon.uf.common.time.util.CalendarConverter;
|
import com.raytheon.uf.common.time.util.CalendarConverter;
|
||||||
import com.raytheon.uf.common.time.util.TimeUtil;
|
import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
|
|
||||||
|
@ -60,8 +62,10 @@ import com.raytheon.uf.common.time.util.TimeUtil;
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Jim Ramer Original Code
|
* Jim Ramer Original Code
|
||||||
* Jun 18, 2007 chammack Partial port to Java
|
* Jun 18, 2007 chammack Partial port to Java
|
||||||
* Apr 12, 2013 1857 bgonzale Added Index annotations to getter methods.
|
* Apr 12, 2013 1857 bgonzale Added Index annotations to getter
|
||||||
|
* methods.
|
||||||
* Mar 02, 2013 1970 bgonzale Removed Index annotations.
|
* Mar 02, 2013 1970 bgonzale Removed Index annotations.
|
||||||
|
* Aug 08, 2013 2245 bsteffen Make all DataTime comparisons consistent.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -119,18 +123,8 @@ public class DataTime implements Comparable<DataTime>, Serializable,
|
||||||
*/
|
*/
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/** Defines possible time sort keys */
|
private static final Comparator<DataTime> DEFAULT_COMPARATOR = new DataTimeComparator(
|
||||||
public static enum SortKey {
|
SortKey.VALID_TIME, SortKey.FORECAST_TIME, false);
|
||||||
INITIAL_TIME, FORECAST_TIME, VALID_TIME
|
|
||||||
};
|
|
||||||
|
|
||||||
/** The major sort key */
|
|
||||||
@Transient
|
|
||||||
protected SortKey majorKey = SortKey.VALID_TIME;
|
|
||||||
|
|
||||||
/** The minor sort key */
|
|
||||||
@Transient
|
|
||||||
protected SortKey minorKey = SortKey.FORECAST_TIME;
|
|
||||||
|
|
||||||
/** The reference time */
|
/** The reference time */
|
||||||
@Column(name = "refTime")
|
@Column(name = "refTime")
|
||||||
|
@ -150,10 +144,6 @@ public class DataTime implements Comparable<DataTime>, Serializable,
|
||||||
@XmlElement
|
@XmlElement
|
||||||
protected TimeRange validPeriod;
|
protected TimeRange validPeriod;
|
||||||
|
|
||||||
/** Is data to be sorted using match mode */
|
|
||||||
@Transient
|
|
||||||
protected boolean matchMode;
|
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
protected boolean visible = true;
|
protected boolean visible = true;
|
||||||
|
|
||||||
|
@ -452,26 +442,6 @@ public class DataTime implements Comparable<DataTime>, Serializable,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This routine determines which characteristics of a DataTime object,
|
|
||||||
* reference time, valid time, or forecast time, affect how relational
|
|
||||||
* operators >, <, >=, and <= behave. Default is to sort primarily on the
|
|
||||||
* valid time and secondarily on the reference time.
|
|
||||||
*
|
|
||||||
* @param majorKey
|
|
||||||
* the major sort key
|
|
||||||
* @param minorKey
|
|
||||||
* the minor sort key
|
|
||||||
* @param matchMode
|
|
||||||
* the match mode flag
|
|
||||||
*/
|
|
||||||
public void setSortKeys(SortKey majorKey, SortKey minorKey,
|
|
||||||
boolean matchMode) {
|
|
||||||
this.majorKey = majorKey;
|
|
||||||
this.minorKey = minorKey;
|
|
||||||
this.matchMode = matchMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the left hand side is greater than the right hand side
|
* Returns true if the left hand side is greater than the right hand side
|
||||||
*
|
*
|
||||||
|
@ -480,99 +450,7 @@ public class DataTime implements Comparable<DataTime>, Serializable,
|
||||||
* @return true if left hand side is greater than
|
* @return true if left hand side is greater than
|
||||||
*/
|
*/
|
||||||
public boolean greaterThan(DataTime rhs) {
|
public boolean greaterThan(DataTime rhs) {
|
||||||
|
return compareTo(rhs) > 0;
|
||||||
if (rhs.getRefTime() == null) {
|
|
||||||
return (fcstTime > rhs.getFcstTime());
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if (matchMode) {
|
|
||||||
switch (majorKey) {
|
|
||||||
case INITIAL_TIME:
|
|
||||||
if (getMatchRef() > rhs.getMatchRef())
|
|
||||||
return true;
|
|
||||||
if (getMatchRef() < rhs.getMatchRef())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case FORECAST_TIME:
|
|
||||||
if (getRefTime().getTime() == 0)
|
|
||||||
return false;
|
|
||||||
if (getMatchFcst() > rhs.getMatchFcst())
|
|
||||||
return true;
|
|
||||||
if (getMatchFcst() < rhs.getMatchFcst())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case VALID_TIME:
|
|
||||||
if (getMatchValid() > rhs.getMatchValid())
|
|
||||||
return true;
|
|
||||||
if (getMatchValid() < rhs.getMatchValid())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
switch (minorKey) {
|
|
||||||
case INITIAL_TIME:
|
|
||||||
if (getMatchRef() > rhs.getMatchRef())
|
|
||||||
return true;
|
|
||||||
if (getMatchRef() < rhs.getMatchRef())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case FORECAST_TIME:
|
|
||||||
if (getMatchFcst() > rhs.getMatchFcst())
|
|
||||||
return true;
|
|
||||||
if (getMatchFcst() < rhs.getMatchFcst())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case VALID_TIME:
|
|
||||||
if (getMatchFcst() > rhs.getMatchFcst())
|
|
||||||
return true;
|
|
||||||
if (getMatchFcst() < rhs.getMatchFcst())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (getLevelValue() > rhs.getLevelValue()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (majorKey) {
|
|
||||||
case INITIAL_TIME:
|
|
||||||
if (refTime.getTime() > rhs.refTime.getTime())
|
|
||||||
return true;
|
|
||||||
if (refTime.getTime() < rhs.refTime.getTime())
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case FORECAST_TIME:
|
|
||||||
if (fcstTime > rhs.fcstTime)
|
|
||||||
return true;
|
|
||||||
if (fcstTime < rhs.fcstTime)
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
case VALID_TIME:
|
|
||||||
if (refTime.getTime() + (((long) fcstTime) * 1000) > rhs.refTime
|
|
||||||
.getTime() + (((long) rhs.fcstTime) * 1000))
|
|
||||||
return true;
|
|
||||||
if (refTime.getTime() + (((long) fcstTime) * 1000) < rhs.refTime
|
|
||||||
.getTime() + (((long) rhs.fcstTime) * 1000))
|
|
||||||
return false;
|
|
||||||
if (refTime.getTime() > rhs.getRefTime().getTime())
|
|
||||||
return true;
|
|
||||||
if (refTime.getTime() < rhs.getRefTime().getTime())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
switch (minorKey) {
|
|
||||||
case INITIAL_TIME:
|
|
||||||
if (refTime.getTime() > rhs.refTime.getTime())
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
case FORECAST_TIME:
|
|
||||||
if (fcstTime > rhs.fcstTime)
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
case VALID_TIME:
|
|
||||||
if (refTime.getTime() + (((long) fcstTime) * 1000) > rhs.refTime
|
|
||||||
.getTime() + (((long) rhs.fcstTime) * 1000))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -687,13 +565,7 @@ public class DataTime implements Comparable<DataTime>, Serializable,
|
||||||
* @see java.lang.Comparable#compareTo(java.lang.Object)
|
* @see java.lang.Comparable#compareTo(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
public int compareTo(DataTime o) {
|
public int compareTo(DataTime o) {
|
||||||
if (this.equals(o))
|
return DEFAULT_COMPARATOR.compare(this, o);
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (this.greaterThan(o))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRefTime(Date refTime) {
|
public void setRefTime(Date refTime) {
|
||||||
|
|
|
@ -0,0 +1,165 @@
|
||||||
|
/**
|
||||||
|
* This software was developed and / or modified by Raytheon Company,
|
||||||
|
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||||
|
*
|
||||||
|
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||||
|
* This software product contains export-restricted data whose
|
||||||
|
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||||
|
* to non-U.S. persons whether in the United States or abroad requires
|
||||||
|
* an export license or other authorization.
|
||||||
|
*
|
||||||
|
* Contractor Name: Raytheon Company
|
||||||
|
* Contractor Address: 6825 Pine Street, Suite 340
|
||||||
|
* Mail Stop B8
|
||||||
|
* Omaha, NE 68106
|
||||||
|
* 402.291.0100
|
||||||
|
*
|
||||||
|
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||||
|
* further licensing information.
|
||||||
|
**/
|
||||||
|
package com.raytheon.uf.common.time;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides configurable comparisons of DataTimes. This can which
|
||||||
|
* characteristics of a DataTime object, reference time, valid time, or forecast
|
||||||
|
* time, affect how relational operators >, <, >=, and <= behave.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
*
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
|
* Aug 8, 2013 2245 bsteffen Initial creation
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author bsteffen
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class DataTimeComparator implements Comparator<DataTime> {
|
||||||
|
|
||||||
|
/** Defines possible time sort keys */
|
||||||
|
public static enum SortKey {
|
||||||
|
INITIAL_TIME, FORECAST_TIME, VALID_TIME
|
||||||
|
};
|
||||||
|
|
||||||
|
/** The major sort key */
|
||||||
|
protected final SortKey majorKey;
|
||||||
|
|
||||||
|
/** The minor sort key */
|
||||||
|
protected final SortKey minorKey;
|
||||||
|
|
||||||
|
/** Is data to be sorted using match mode */
|
||||||
|
protected final boolean matchMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This routine determines which characteristics of a DataTime object,
|
||||||
|
* reference time, valid time, or forecast time, affect how relational
|
||||||
|
* operators >, <, >=, and <= behave.
|
||||||
|
*
|
||||||
|
* @param majorKey
|
||||||
|
* the major sort key
|
||||||
|
* @param minorKey
|
||||||
|
* the minor sort key
|
||||||
|
* @param matchMode
|
||||||
|
* the match mode flag
|
||||||
|
*/
|
||||||
|
public DataTimeComparator(SortKey majorKey, SortKey minorKey,
|
||||||
|
boolean matchMode) {
|
||||||
|
this.majorKey = majorKey;
|
||||||
|
this.minorKey = minorKey;
|
||||||
|
this.matchMode = matchMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(DataTime time1, DataTime time2) {
|
||||||
|
int result = compare(majorKey, time1, time2);
|
||||||
|
if (result != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = compare(minorKey, time1, time2);
|
||||||
|
if (result != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = compareLevel(time1, time2);
|
||||||
|
if (result != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return compareValidPeriod(time1, time2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int compare(SortKey sortKey, DataTime time1, DataTime time2) {
|
||||||
|
if (matchMode) {
|
||||||
|
return compareMatch(sortKey, time1, time2);
|
||||||
|
} else {
|
||||||
|
return compareNoMatch(sortKey, time1, time2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int compareNoMatch(SortKey sortKey, DataTime time1, DataTime time2) {
|
||||||
|
switch (sortKey) {
|
||||||
|
case INITIAL_TIME:
|
||||||
|
return Long.compare(time1.getRefTime().getTime(), time2
|
||||||
|
.getRefTime().getTime());
|
||||||
|
case FORECAST_TIME:
|
||||||
|
return Integer.compare(time1.getFcstTime(), time2.getFcstTime());
|
||||||
|
case VALID_TIME:
|
||||||
|
return Long.compare(time1.getValidTime().getTimeInMillis(), time2
|
||||||
|
.getValidTime().getTimeInMillis());
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException(String.valueOf(sortKey)
|
||||||
|
+ " is not a recognized SortKey.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int compareMatch(SortKey sortKey, DataTime time1, DataTime time2) {
|
||||||
|
switch (sortKey) {
|
||||||
|
case INITIAL_TIME:
|
||||||
|
return Long.compare(time1.getMatchRef(), time2.getMatchRef());
|
||||||
|
case FORECAST_TIME:
|
||||||
|
return Long.compare(time1.getMatchFcst(), time2.getMatchFcst());
|
||||||
|
case VALID_TIME:
|
||||||
|
return Long.compare(time1.getMatchValid(), time2.getMatchValid());
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException(String.valueOf(sortKey)
|
||||||
|
+ " is not a recognized SortKey.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int compareLevel(DataTime time1, DataTime time2) {
|
||||||
|
return Double.compare(time1.getLevelValue(), time2.getLevelValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For valid period the rules arbitrary but we need some rules to make the
|
||||||
|
* comparator consistent.
|
||||||
|
*
|
||||||
|
* 1. Not null periods are greater than null periods. <br />
|
||||||
|
* 2. Longer periods are greater than shorter periods <br />
|
||||||
|
* 3. Periods that start later are greater than periods that start earlier.
|
||||||
|
*/
|
||||||
|
private int compareValidPeriod(DataTime time1, DataTime time2) {
|
||||||
|
TimeRange p1 = time1.getValidPeriod();
|
||||||
|
TimeRange p2 = time2.getValidPeriod();
|
||||||
|
|
||||||
|
if (p1 == p2) {
|
||||||
|
return 0;
|
||||||
|
} else if (p1 == null) {
|
||||||
|
return -1;
|
||||||
|
} else if (p2 == null) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int result = Long.compare(p1.getDuration(), p2.getDuration());
|
||||||
|
if (result != 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return Long.compare(p1.getStart().getTime(), p2.getStart().getTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue