package nl.helixsoft.recordstream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import nl.helixsoft.recordstream.Reducer.Count;
import nl.helixsoft.recordstream.Reducer.GroupFunc;
import junit.framework.TestCase;
public class TestReduceAndCast extends TestCase {
private static class MockRecordStream extends AbstractRecordStream
{
private final List<String> cols;
private final Object[][] data;
private final RecordMetaData rmd;
MockRecordStream (String[] _cols, Object[][] data)
{
this.cols = Arrays.asList(_cols);
this.data = data;
rmd = new DefaultRecordMetaData(_cols);
}
int row = 0;
@Override
public Record getNext() throws StreamException {
if (row >= data.length) return null;
return new DefaultRecord(rmd, data[row++]);
}
@Override
public RecordMetaData getMetaData()
{
return rmd;
}
@Override
public void close() { }
}
/*
* Test Reduce, and in particular the AsSet and AsList functions
*/
@SuppressWarnings("unchecked")
public void testReduceSet() throws StreamException
{
Map<String, GroupFunc> map = new HashMap<String, GroupFunc>();
map.put ("str1_set", new Reducer.AsSet("str1"));
map.put ("str2_list", new Reducer.AsList("str2"));
RecordStream rs = new MockRecordStream (
new String[] { "groupid", "str1", "str2" },
new Object[][] {
{ 1, "a", "x" },
{ 1, "a", "y" },
{ 2, "b", "z" },
{ 2, "c", "z" },
{ 3, "d", "p" },
{ 3, "e", "q" },
});
Reducer reducer = new Reducer (rs, "groupid", map);
assertEquals (3, reducer.getMetaData().getNumCols());
@SuppressWarnings("unused")
int dummy = reducer.getMetaData().getColumnIndex("groupid"); // throws exception if not found
dummy = reducer.getMetaData().getColumnIndex("str1_set"); // throws exception if not found
dummy = reducer.getMetaData().getColumnIndex("str2_list"); // throws exception if not found
try
{
dummy = reducer.getMetaData().getColumnIndex("strx_set");
fail ("Expected an exception after requesting unknown column");
}
catch (IllegalArgumentException e) { /* OK, as expected */ }
Set<Object> set1;
List<Object> list2;
Record r = reducer.getNext();
set1 = (Set<Object>)r.get("str1_set");
assertTrue (set1.size() == 1 && set1.contains ("a"));
list2 = (List<Object>)r.get("str2_list");
assertTrue (list2.size() == 2 && list2.get(0).equals("x") && list2.get(1).equals ("y"));
r = reducer.getNext();
set1 = (Set<Object>)r.get("str1_set");
assertTrue (set1.size() == 2 && set1.contains ("b") && set1.contains ("c"));
list2 = (List<Object>)r.get("str2_list");
assertTrue (list2.size() == 2 && list2.get(0).equals("z") && list2.get(1).equals ("z"));
r = reducer.getNext();
set1 = (Set<Object>)r.get("str1_set");
assertTrue (set1.size() == 2 && set1.contains ("d") && set1.contains ("e"));
list2 = (List<Object>)r.get("str2_list");
assertTrue (list2.size() == 2 && list2.get(0).equals("p") && list2.get(1).equals ("q"));
r = reducer.getNext();
assertNull (r);
}
public void testReduce() throws StreamException
{
Map<String, GroupFunc> map = new HashMap<String, GroupFunc>();
map.put ("count", new Count());
map.put ("avg_float", new Reducer.AverageFloat("float"));
map.put ("concat_str", new Reducer.Concatenate("str", "-"));
RecordStream rs = new MockRecordStream (
new String[] { "groupid", "float", "str" },
new Object[][] {
{ 1, 1.0f, "abc" },
{ 1, 2.0f, "def" },
{ 2, 3.0f, "ghi" },
{ 3, 4.0f, "jkl" }
});
Reducer reducer = new Reducer (rs, "groupid", map);
assertEquals (4, reducer.getMetaData().getNumCols());
Map<String, Integer> idx = new HashMap<String, Integer>();
for (int i = 0; i < reducer.getMetaData().getNumCols(); ++i) idx.put (reducer.getMetaData().getColumnName(i), i);
assertTrue (idx.containsKey("groupid"));
assertTrue (idx.containsKey("count"));
assertTrue (idx.containsKey("avg_float"));
assertTrue (idx.containsKey("concat_str"));
Record r;
r = reducer.getNext();
assertEquals (1, r.get(idx.get("groupid")));
assertEquals (2, r.get(idx.get("count")));
assertEquals (1.5f, (Float)r.get(idx.get("avg_float")), 0.01f);
assertEquals ("abc-def", r.get(idx.get("concat_str")));
r = reducer.getNext();
assertEquals (2, r.get(idx.get("groupid")));
assertEquals (1, r.get(idx.get("count")));
assertEquals (3.0f, (Float)r.get(idx.get("avg_float")), 0.01f);
assertEquals ("ghi", r.get(idx.get("concat_str")));
r = reducer.getNext();
assertEquals (3, r.get(idx.get("groupid")));
assertEquals (1, r.get(idx.get("count")));
assertEquals (4.0f, (Float)r.get(idx.get("avg_float")), 0.01f);
assertEquals ("jkl", r.get(idx.get("concat_str")));
r = reducer.getNext();
assertNull (r);
}
public void testCast() throws StreamException
{
RecordStream rs = new MockRecordStream (
new String[] { "group", "col", "var" },
new Object[][] {
{ "group1", "col1", "abc" },
{ "group1", "col2", "def" },
{ "group2", "col1", "ghi" },
{ "group2", "col2", "jkl" }
});
Cast cast = new Cast (rs, "group", "col", "var");
assertEquals (3, cast.getMetaData().getNumCols());
Map<String, Integer> idx = new HashMap<String, Integer>();
for (int i = 0; i < cast.getMetaData().getNumCols(); ++i) idx.put (cast.getMetaData().getColumnName(i), i);
assertTrue (idx.containsKey("group"));
assertTrue (idx.containsKey("col1"));
assertTrue (idx.containsKey("col2"));
Record r;
r = cast.getNext();
assertEquals ("group1", r.get(idx.get("group")));
assertEquals ("abc", r.get(idx.get("col1")));
assertEquals ("def", r.get(idx.get("col2")));
r = cast.getNext();
assertEquals ("group2", r.get(idx.get("group")));
assertEquals ("ghi", r.get(idx.get("col1")));
assertEquals ("jkl", r.get(idx.get("col2")));
r = cast.getNext();
assertNull (r);
}
public void testCastMultiKey() throws StreamException
{
RecordStream rs = new MockRecordStream (
new String[] { "group", "subgroup", "col", "var" },
new Object[][] {
{ "group0", "subgroup1", "col1", "abc" },
{ "group0", "subgroup1", "col2", "def" },
{ "group0", "subgroup2", "col1", "ghi" },
{ "group0", "subgroup2", "col2", "jkl" }
});
Cast cast = new Cast (rs, new String[] { "group", "subgroup" }, "col", "var");
assertEquals (4, cast.getMetaData().getNumCols());
Map<String, Integer> idx = new HashMap<String, Integer>();
for (int i = 0; i < cast.getMetaData().getNumCols(); ++i) idx.put (cast.getMetaData().getColumnName(i), i);
assertTrue (idx.containsKey("group"));
assertTrue (idx.containsKey("subgroup"));
assertTrue (idx.containsKey("col1"));
assertTrue (idx.containsKey("col2"));
Record r;
r = cast.getNext();
assertEquals ("group0", r.get(idx.get("group")));
assertEquals ("subgroup1", r.get(idx.get("subgroup")));
assertEquals ("abc", r.get(idx.get("col1")));
assertEquals ("def", r.get(idx.get("col2")));
r = cast.getNext();
assertEquals ("group0", r.get(idx.get("group")));
assertEquals ("subgroup2", r.get(idx.get("subgroup")));
assertEquals ("ghi", r.get(idx.get("col1")));
assertEquals ("jkl", r.get(idx.get("col2")));
r = cast.getNext();
assertNull (r);
}
}