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 IntegerIndexedColumn extends IndexedColumn { private IntegerRange _intRange = new IntegerRange(); public IntegerIndexedColumn(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 compareInteger(((NoIx) ix1).get(), ((NoIx) ix2).get()); } else if(ix1 instanceof NoIx) { return compareInteger(((NoIx) ix1).get(), getRow((Integer) ix2)); } else if(ix2 instanceof NoIx) { return compareInteger(getRow((Integer) ix1), ((NoIx) ix2).get()); } else { return compareInteger(getRow((Integer) ix1), getRow((Integer) ix2)); } } }; _intRange.beginInit(); sortIx(comparator); _intRange.endInit(); } private int compareInteger(Object o1, Object o2) { Integer i1 = null; if (null != o1) { i1 = ((Number)o1).intValue(); } Integer i2 = null; if (null != o2) { i2 = ((Number)o2).intValue(); } _intRange.init(i1); _intRange.init(i2); if(i1 == null && i2 != null) { return -1; } else if(i1 != null && i2 == null) { return 1; } else if(i1 == null && i2 == null) { return 0; } return i1.compareTo(i2); } @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 "" + (((Number)endData).longValue() - ((Number)beginData).longValue()); } private Object onGetMid(Object min, Object max) { Integer intMin; if(null == min) { intMin = _intRange.getMin() - 1; } else { intMin = ((Number)min).intValue(); } Integer intMax; if(null == max) { intMax = _intRange.getMin() - 1; } else { intMax = ((Number)max).intValue(); } return intMin + ((intMax - intMin) / 2); } private static class IntegerRange { private int _max = 0; private int _min = 0; private boolean _initializing; private boolean _isInit; public void init(Integer i) { if(false == _initializing) { return; } if(null == i) { return; } if(false == _isInit) { _min = i; _max = i; _isInit = true; } _min = Math.min(_min, i); _max = Math.max(_max, i); } public int getMin() { return _min; } void beginInit() { _initializing = true; } void endInit() { _initializing = false; } } }