package net.sourceforge.squirrel_sql.client.session.mainpanel.overview.datascale; import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; import java.sql.Timestamp; import java.util.Comparator; import java.util.Date; import java.util.List; public class TimestampIndexedColumn extends IndexedColumn { private LongRange _longRange = new LongRange(); public TimestampIndexedColumn(List<Object[]> rows, int colIx, ColumnDisplayDefinition colDef) { super(rows, colIx, colDef); Comparator comparator = new Comparator<Object>() { @Override public int compare(Object ix1, Object ix2) { if( ix1 instanceof NoIx && ix2 instanceof NoIx) { return compareUtilDate(((NoIx) ix1).get(), ((NoIx) ix2).get()); } else if(ix1 instanceof NoIx) { return compareUtilDate(((NoIx) ix1).get(), getRow((Integer) ix2)); } else if(ix2 instanceof NoIx) { return compareUtilDate(getRow((Integer) ix1), ((NoIx) ix2).get()); } else { return compareUtilDate(getRow((Integer) ix1), getRow((Integer) ix2)); } } }; _longRange.beginInit(); sortIx(comparator); _longRange.endInit(); } private int compareUtilDate(Object o1, Object o2) { Long t1 = null; if (null != o1) { t1 = ((Date)o1).getTime(); } Long t2 = null; if (null != o2) { t2 = ((Date)o2).getTime(); } _longRange.init(t1); _longRange.init(t2); if(t1 == null && t2 != null) { return -1; } else if(t1 != null && t2 == null) { return 1; } else if(t1 == null && t2 == null) { return 0; } return t1.compareTo(t2); } @Override public Calculator getCalculator() { return new Calculator() { @Override public Object getMid(Object min, Object max) { return onGetMid(min, max); } }; } @Override public String calculateDist(Object beginData, Object endData) { if(null == beginData || null == endData) { return "" + 0; } Date dBeg = (Date) beginData; Date dEnd = (Date) endData; long diff = dEnd.getTime() - dBeg.getTime(); long diffInDays = diff/1000/86400; long diffInHours = (diff/1000 - 86400*diffInDays) / 3600; long diffInMins = (diff/1000 - 86400*diffInDays - 3600*diffInHours) / 60; long diffInSecs = (diff/1000 - 86400*diffInDays - 3600*diffInHours - 60*diffInMins); long diffMillis = diff % 1000; if(0 == diff) { return "" + 0; } String ret = "("; if(0 < diffInDays) { ret += (diffInDays + " days "); } if(0 < diffInHours) { ret += (diffInHours + " hours "); } if(0 < diffInMins) { ret += (diffInMins + " minutes "); } if(0 < diffInSecs) { ret += (diffInSecs + " seconds "); } if(0 < diffMillis) { ret += (diffMillis + " millis "); } return ret.trim() + ")"; } private Object onGetMid(Object min, Object max) { Long longMin; if(null == min) { longMin = _longRange.getMin() - 1; } else { longMin = ((Date)min).getTime(); } Long longMax; if(null == max) { longMax = _longRange.getMin() - 1; } else { longMax = ((Date)max).getTime(); } return new Timestamp(longMin + ((longMax - longMin) / 2)); } private static class LongRange { private long _max = System.currentTimeMillis(); private long _min = _max; private boolean _initializing; private boolean _isInit; public void init(Long l) { if(false == _initializing) { return; } if(null == l) { return; } if(false == _isInit) { _min = l; _max = l; _isInit = true; } _min = Math.min(_min, l); _max = Math.max(_max, l); } public long getMin() { return _min; } void beginInit() { _initializing = true; } void endInit() { _initializing = false; } } }