package net.sourceforge.squirrel_sql.client.session.mainpanel.overview.datascale;
import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition;
import net.sourceforge.squirrel_sql.fw.datasetviewer.cellcomponent.CellComponentFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public abstract class IndexedColumn
{
private ArrayList<Integer> _ix;
private List<Object[]> _rows;
private int _colIx;
private ColumnDisplayDefinition _colDef;
private Comparator _comparator;
public IndexedColumn(List<Object[]> rows, int colIx, ColumnDisplayDefinition colDef)
{
_rows = rows;
_colIx = colIx;
_colDef = colDef;
_ix = new ArrayList<Integer>(rows.size());
for (int i = 0; i < rows.size(); i++)
{
_ix.add(i);
}
}
public void sortIx(Comparator comparator)
{
_comparator = comparator;
Collections.sort(_ix, _comparator);
}
public int getColumnIndex()
{
return _colIx;
}
public Object get(int ix)
{
return _rows.get(_ix.get(ix))[_colIx];
}
public Object getRow(Integer rowIx)
{
return _rows.get(rowIx)[_colIx];
}
public int getRowIx(int ix)
{
return _ix.get(ix);
}
public int binarySearch(Object border)
{
return Collections.binarySearch(_ix, new NoIx(border), _comparator);
}
public String getColumnName()
{
return _colDef.getColumnName();
}
public Object getMin()
{
return _rows.get(_ix.get(0))[_colIx];
}
public Object getMax()
{
return _rows.get(_ix.get(_ix.size() - 1))[_colIx];
}
public int size()
{
return _ix.size();
}
public int getLastIndexOfVal(int startIx)
{
int ret = startIx;
for (int i = startIx + 1; i < _ix.size(); i++)
{
if(0 != _comparator.compare(new NoIx(get(startIx)), new NoIx(get(i))) )
{
break;
}
++ret;
}
return ret;
}
public int getFirstIndexOfVal(int startIx)
{
for (int i = startIx - 1; 0 <= i ; i--)
{
if(0 != _comparator.compare(new NoIx(get(startIx)), new NoIx(get(i))) )
{
return i;
}
}
return 0;
}
public int compareObjects(Object o1, Object o2)
{
return _comparator.compare(new NoIx(o1), new NoIx(o2));
}
public String renderObject(Object o)
{
return CellComponentFactory.renderObject(o, _colDef);
}
public abstract Calculator getCalculator();
public Comparator<? super Object> getComparator()
{
return _comparator;
}
public List<Object[]> getResultRows(int firstIx, int lastIx)
{
ArrayList<Object[]> ret = new ArrayList<Object[]>(lastIx - firstIx + 1);
for(int i= firstIx; i <= lastIx; ++i)
{
ret.add(_rows.get(_ix.get(i)));
}
return ret;
}
public ColumnDisplayDefinition getColumnDisplayDefinition()
{
return _colDef;
}
public abstract String calculateDist(Object beginData, Object endData);
}