package net.sourceforge.squirrel_sql.client.session.mainpanel.overview.datascale; import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition; import java.util.Comparator; import java.util.List; public class DoubleIndexedColumn extends IndexedColumn { private DoubleRange _doubleRange = new DoubleRange(); public DoubleIndexedColumn(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 compareDouble(((NoIx) ix1).get(), ((NoIx) ix2).get()); } else if(ix1 instanceof NoIx) { return compareDouble(((NoIx) ix1).get(), getRow((Integer) ix2)); } else if(ix2 instanceof NoIx) { return compareDouble(getRow((Integer) ix1), ((NoIx) ix2).get()); } else { return compareDouble(getRow((Integer) ix1), getRow((Integer) ix2)); } } }; _doubleRange.beginInit(); sortIx(comparator); _doubleRange.endInit(); } private int compareDouble(Object o1, Object o2) { Double d1 = null; if (null != o1) { d1 = ((Number)o1).doubleValue(); } Double d2 = null; if (null != o2) { d2 = ((Number)o2).doubleValue(); } _doubleRange.init(d1); _doubleRange.init(d2); if(d1 == null && d2 != null) { return -1; } else if(d1 != null && d2 == null) { return 1; } else if(d1 == null && d2 == null) { return 0; } return d1.compareTo(d2); } @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; } return String.format("%.3f",(((Number)endData).doubleValue() - ((Number)beginData).doubleValue())); } private Object onGetMid(Object min, Object max) { Double doubleMin; if(null == min) { doubleMin = _doubleRange.getMin() - 1; } else { doubleMin = ((Number)min).doubleValue(); } Double doubleMax; if(null == max) { doubleMax = _doubleRange.getMin() - 1; } else { doubleMax = ((Number)max).doubleValue(); } return doubleMin + ((doubleMax - doubleMin) / 2); } private static class DoubleRange { private double _max = 0; private double _min = 0; private boolean _initializing; private boolean _isInit; public void init(Double d) { if(false == _initializing) { return; } if(null == d) { return; } if(false == _isInit) { _min = d; _max = d; _isInit = true; } _min = Math.min(_min, d); _max = Math.max(_max, d); } public double getMin() { return _min; } void beginInit() { _initializing = true; } void endInit() { _initializing = false; } } }