package hep.aida.ref.tuple;
import hep.aida.IManagedObject;
import hep.aida.ITuple;
import java.util.Date;
import org.freehep.util.Value;
/**
*
* @author The FreeHEP team @ SLAC
*
*/
public class FTupleAdapter implements FTuple {
private ITuple tuple;
private FTupleColumn[] columns;
private FTuple[] tuples;
private FTupleCursor cursor;
private boolean supportsRandomAccess = false;
public FTupleAdapter( ITuple tuple ) {
setTuple( tuple );
columns = new FTupleColumn[ tuple.columns() ];
tuples = new FTuple[ tuple.columns() ];
cursor = new FTupleCursorAdapter( tuple );
try {
if ( tuple.rows() > 0 )
cursor.setRow(0);
supportsRandomAccess = true;
} catch (Throwable t) {}
cursor.start();
for ( int i = 0; i < columns.length; i++ ) {
columns[i] = new FTupleColumnAdapter( tuple, i );
if ( tuple.columnType(i) == ITuple.class )
tuples[i] = new FTupleAdapter( tuple.getTuple(i) );
}
}
public void close() {
}
public FTupleColumn column(int index) {
return columns[ index ];
}
public FTupleColumn columnByName(String name) {
return columns[ tuple.findColumn( name ) ];
}
public FTupleColumn columnByIndex(int index) {
return columns[ index ];
}
public String columnName(int index) {
return tuple.columnName( index );
}
public Class columnType(int index) {
return columns[index].type();
}
public void columnValue(int column, FTupleCursor cursor, Value value) {
Class type = columnType( column );
if ( type == Integer.TYPE ) value.set( tuple.getInt( column ) );
else if ( type == Short.TYPE ) value.set( tuple.getShort( column ) );
else if ( type == Long.TYPE ) value.set( tuple.getLong( column ) );
else if ( type == Float.TYPE ) value.set( tuple.getFloat( column ) );
else if ( type == Double.TYPE ) value.set( tuple.getDouble( column ) );
else if ( type == Boolean.TYPE ) value.set( tuple.getBoolean( column ) );
else if ( type == Byte.TYPE ) value.set( tuple.getByte( column ) );
else if ( type == Character.TYPE ) value.set( tuple.getChar( column ) );
else if ( type == String.class ) value.set( tuple.getString( column ) );
else if ( type == Date.class ) value.set( (Date) tuple.getObject( column ) );
else value.set( tuple.getObject( column ) );
}
public int columns() {
return tuple.columns();
}
public FTupleCursor cursor() throws IllegalStateException {
return cursor;
}
public boolean isInMemory() {
return false;
}
public String name() {
if ( tuple instanceof IManagedObject )
return ( (IManagedObject) tuple ).name();
else
return "title";
}
public int rows() {
return tuple.rows();
}
public boolean supportsMultipleCursors() {
return false;
}
public boolean supportsRandomAccess() {
return supportsRandomAccess;
}
public String title() {
return tuple.title();
}
public FTuple tuple(int index) {
FTuple fTuple = tuples[index];
( (FTupleAdapter)fTuple ).setTuple( tuple.getTuple( index ) );
return fTuple;
}
protected void setTuple( ITuple tuple ) {
this.tuple = tuple;
}
private class FTupleColumnAdapter implements FTupleColumn {
private ITuple tuple;
private int col;
FTupleColumnAdapter( ITuple tuple, int col ) {
this.tuple = tuple;
this.col = col;
}
public boolean hasDefaultValue() {
return false;
}
public void defaultValue(Value value) {
}
public void maxValue(Value value) {
value.set( tuple.columnMax( col ) );
}
public void meanValue(Value value) {
value.set( tuple.columnMean( col ) );
}
public void minValue(Value value) {
value.set( tuple.columnMin( col ) );
}
public String name() {
return tuple.columnName( col );
}
public void rmsValue(Value value) {
value.set( tuple.columnRms( col ) );
}
public Class type() {
Class type = tuple.columnType(col);
if ( type == ITuple.class )
return FTuple.class;
return type;
}
}
private class FTupleCursorAdapter implements FTupleCursor {
private ITuple tuple;
private int row = -1;
FTupleCursorAdapter( ITuple tuple ) {
this.tuple = tuple;
}
public void close() {
}
public boolean next() {
boolean advanced = tuple.next();
if ( advanced ) row++;
return advanced;
}
public int row() {
return row;
}
public void setRow(int n) {
tuple.setRow(n);
row = n;
}
public void skip(int rows) {
tuple.skip( rows );
row += rows;
}
public void start() {
tuple.start();
row = -1;
}
}
}