package test.prefuse.data;
import junit.framework.TestCase;
import prefuse.data.CascadedTable;
import prefuse.data.Table;
import prefuse.data.Tuple;
import prefuse.data.expression.AbstractPredicate;
import prefuse.data.expression.AndPredicate;
import prefuse.data.expression.ArithmeticExpression;
import prefuse.data.expression.ColumnExpression;
import prefuse.data.expression.ComparisonPredicate;
import prefuse.data.expression.Expression;
import prefuse.data.expression.NumericLiteral;
import prefuse.data.expression.Predicate;
import prefuse.data.expression.RangePredicate;
import prefuse.data.io.DelimitedTextTableWriter;
import prefuse.data.util.TableIterator;
import test.prefuse.TestConfig;
public class CascadedTableTest extends TestCase implements TableTestData {
Table t;
/**
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
t = TableTest.getTestCaseTable();
}
/**
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
t = null;
}
public void testCascadedTableRangeFilters() {
double lo = 1;
double hi = 20;
// index the double column
t.index(HEADERS[4]);
// where id > 0 && dub > 1 && dub < 20
ColumnExpression id = new ColumnExpression(HEADERS[0]);
ColumnExpression dub = new ColumnExpression(HEADERS[4]);
NumericLiteral x0 = new NumericLiteral(0);
NumericLiteral xlo = new NumericLiteral(lo);
NumericLiteral xhi1 = new NumericLiteral(hi-1.0);
NumericLiteral xhi2 = new NumericLiteral(1.0f);
Expression xhi = new ArithmeticExpression(
ArithmeticExpression.ADD, xhi1, xhi2);
ComparisonPredicate idCmp = new ComparisonPredicate(
ComparisonPredicate.GTEQ, id, x0);
RangePredicate dubRg = new RangePredicate(RangePredicate.IN_EX, dub,
xlo, xhi);
AndPredicate filter = new AndPredicate(idCmp, dubRg);
if ( TestConfig.verbose() ) {
System.out.println(filter.toString());
}
CascadedTable ft = new CascadedTable(t, filter);
TableIterator iter = ft.iterator();
while ( iter.hasNext() ) {
int row = iter.nextInt();
try {
for (int c = 0; c < NCOLS; ++c) {
Object o1 = TABLE[c][ft.getColumnRow(row,c)];
Object o2 = ft.get(row,HEADERS[c]);
assertEquals(o1, o2);
}
} catch (Exception e) {
fail("Caught exception: " + e);
}
}
// add an extra column to the cascaded table
String name = "test";
ft.addColumn(name, double.class, new Double(Math.PI));
iter = ft.iterator();
while (iter.hasNext()) {
int row = iter.nextInt();
iter.setDouble(name, Math.E);
assertTrue(Math.E == ft.getDouble(row, name));
}
int nr = t.addRow();
t.setInt(nr, HEADERS[0], nr+1);
t.setDouble(nr, HEADERS[4], 2.5);
if ( TestConfig.verbose() ) {
try {
new DelimitedTextTableWriter().writeTable(ft, System.out);
} catch ( Exception e ) { e.printStackTrace(); }
}
}
/*
* Test method for
* 'prefuse.data.CascadedTable.CascadedTable(Table,RowFilter)'
*/
public void testCascadedTableTableRowFilter() {
final float thresh = 5.0f;
Predicate p = new AbstractPredicate() {
public boolean getBoolean(Tuple t) {
return t.getFloat(HEADERS[3]) < thresh;
}
};
CascadedTable ft = new CascadedTable(t, p);
for ( int i=0, r=0; i<NROWS; ++i ) {
float val = ((Float)TABLE[3][i]).floatValue();
if ( val < thresh ) {
try {
for ( int c=0; c<NCOLS; ++c ) {
Object o1 = TABLE[c][i];
Object o2 = ft.get(r, HEADERS[c]);
assertEquals(o1, o2);
}
++r;
} catch ( Exception e ) {
fail("Caught exception: "+e);
}
}
}
// add an extra column to the cascaded table
String name = "test";
ft.addColumn(name, double.class, new Double(Math.PI));
TableIterator iter = ft.iterator();
while ( iter.hasNext() ) {
int row = iter.nextInt();
iter.setDouble(name, Math.E);
assertTrue(Math.E == ft.getDouble(row, name));
}
int nr = t.addRow();
t.setFloat(nr, HEADERS[3], 0.5f);
t.setInt(nr, HEADERS[0], 77);
nr = t.addRow();
t.setFloat(nr, HEADERS[3], 0.5f);
t.setInt(nr, HEADERS[0], 99);
if ( TestConfig.verbose() ) {
try {
new DelimitedTextTableWriter().writeTable(ft, System.out);
} catch ( Exception e ) { e.printStackTrace(); }
}
}
}