package net.sourceforge.mayfly.evaluation; import junit.framework.TestCase; import net.sourceforge.mayfly.datastore.Cell; import net.sourceforge.mayfly.datastore.LongCell; import net.sourceforge.mayfly.datastore.StringCell; import net.sourceforge.mayfly.evaluation.expression.Average; import net.sourceforge.mayfly.evaluation.expression.SingleColumn; import net.sourceforge.mayfly.evaluation.what.Selected; import net.sourceforge.mayfly.evaluation.what.WhatElement; import net.sourceforge.mayfly.util.ImmutableList; public class GroupedRowsTest extends TestCase { public void testUngroup() throws Exception { GroupedRows groupedRows = new GroupedRows(); groupedRows.add( keysForColumn("player"), new ResultRow() .withColumn("players", "player", new StringCell("Ganguly")) .withColumn("players", "score", new LongCell(35)) ); groupedRows.add( keysForColumn("player"), new ResultRow() .withColumn("players", "player", new StringCell("Ganguly")) .withColumn("players", "score", new LongCell(45)) ); groupedRows.add( keysForColumn("player"), new ResultRow() .withColumn("players", "player", new StringCell("Tendulkar")) .withColumn("players", "score", new LongCell(80)) ); ResultRows rows = groupedRows.ungroup( new Selected(new SingleColumn("player")) ); assertEquals(2, rows.rowCount()); ResultRow row0 = rows.row(0); assertEquals(1, row0.size()); assertColumn("player", new StringCell("Ganguly"), row0, 0); ResultRow row1 = rows.row(1); assertEquals(1, row1.size()); assertColumn("player", new StringCell("Tendulkar"), row1, 0); } public void testMultiple() throws Exception { GroupedRows groupedRows = new GroupedRows(); groupedRows.add( keysForColumns("player", "year"), new ResultRow() .withColumn("players", "player", new StringCell("Ganguly")) .withColumn("players", "year", new LongCell(2004)) .withColumn("players", "score", new LongCell(35)) ); groupedRows.add( keysForColumns("player", "year"), new ResultRow() .withColumn("players", "player", new StringCell("Ganguly")) .withColumn("players", "year", new LongCell(2004)) .withColumn("players", "score", new LongCell(45)) ); groupedRows.add( keysForColumns("player", "year"), new ResultRow() .withColumn("players", "player", new StringCell("Ganguly")) .withColumn("players", "year", new LongCell(2005)) .withColumn("players", "score", new LongCell(0)) ); groupedRows.add( keysForColumns("player", "year"), new ResultRow() .withColumn("players", "player", new StringCell("Tendulkar")) .withColumn("players", "year", new LongCell(2004)) .withColumn("players", "score", new LongCell(80)) ); Average averageExpression = new Average(new SingleColumn("score"), "avg", false); ResultRows rows = groupedRows.ungroup( new Selected(ImmutableList.fromArray(new WhatElement[] { new SingleColumn("player"), new SingleColumn("year"), averageExpression })) ); assertEquals(3, rows.rowCount()); ResultRow row0 = rows.row(0); ResultRow row1 = rows.row(1); ResultRow row2 = rows.row(2); checkRow(new LongCell(40), "Ganguly", 2004, row0, averageExpression); checkRow(new LongCell(0), "Ganguly", 2005, row1, averageExpression); checkRow(new LongCell(80), "Tendulkar", 2004, row2, averageExpression); } private void checkRow(LongCell expectedAverage, String expectedPlayer, int expectedYear, ResultRow row, Average averageExpression) { assertEquals(3, row.size()); assertExpression(averageExpression, expectedAverage, row, 0); assertColumn("player", new StringCell(expectedPlayer), row, 1); assertColumn("year", new LongCell(expectedYear), row, 2); } private void assertColumn(String expectedColumnName, Cell expectedCell, ResultRow row, int position) { SingleColumn header = (SingleColumn) row.expression(position); assertNull(header.tableOrAlias()); assertEquals(expectedColumnName, header.columnName()); assertEquals(expectedCell, row.cell(position)); } private void assertExpression(Expression expected, Cell expectedCell, ResultRow row, int position) { assertTrue(expected.sameExpression(row.expression(position))); assertEquals(expectedCell, row.cell(position)); } private GroupByKeys keysForColumn(String columnName) { return new GroupByKeys( new GroupItem(new SingleColumn(columnName)) ); } private GroupByKeys keysForColumns(String columnName1, String columnName2) { return new GroupByKeys( new GroupItem(new SingleColumn(columnName1)), new GroupItem(new SingleColumn(columnName2)) ); } }