package org.apache.cassandra.hadoop2.multiquery; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.List; import com.datastax.driver.core.DataType; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; import com.google.common.collect.Lists; import org.apache.commons.lang3.tuple.Pair; import org.junit.Test; /** * Test the multi-row iterator. */ public class TestMultiRowIterator extends BaseInputFormatTest { @Test public void testGroupByOneColumn() { ConfigHelper.setInputCqlQuery( mConf, CqlQuerySpec.builder().withKeyspace(KEYSPACE).withTable(TABLE_LOGOS).build()); ResultSet resultSet = mSession.execute(String.format( "SELECT * from %s.%s", KEYSPACE, TABLE_LOGOS )); List<ResultSet> resultSets = Lists.newArrayList(); resultSets.add(resultSet); List<Pair<String, DataType>> columns = Lists.newArrayList(); columns.add(Pair.of(COL_STATE, DataType.text())); MultiRowIterator multiRowIterator = new MultiRowIterator(resultSets, columns); assertTrue(multiRowIterator.hasNext()); // We are grouping by state, so we should get one set of rows for CA, DC, IL, TX. List<List<Row>> rowsByState = Lists.newArrayList(multiRowIterator); assertEquals(4, rowsByState.size()); for (List<Row> rowsForOneState : rowsByState) { String state = rowsForOneState.get(0).getString(COL_STATE); if (state.equals("CA") || state.equals("TX")) { assertEquals(3, rowsForOneState.size()); } else if (state.equals("DC") || state.equals("IL")) { assertEquals(1, rowsForOneState.size()); } else { assertFalse(true); } } } @Test public void testGroupByTwoColumns() { ConfigHelper.setInputCqlQuery(mConf, CqlQuerySpec.builder().withKeyspace(KEYSPACE).withTable(TABLE_LOGOS).build()); ResultSet resultSet = mSession.execute(String.format( "SELECT * from %s.%s", KEYSPACE, TABLE_LOGOS )); List<ResultSet> resultSets = Lists.newArrayList(); resultSets.add(resultSet); List<Pair<String, DataType>> columns = Lists.newArrayList(); columns.add(Pair.of(COL_STATE, DataType.text())); columns.add(Pair.of(COL_CITY, DataType.text())); MultiRowIterator multiRowIterator = new MultiRowIterator(resultSets, columns); assertTrue(multiRowIterator.hasNext()); // We are grouping by state and city, so we should get seven lists (LA has two teams!). List<List<Row>> rowsByState = Lists.newArrayList(multiRowIterator); assertEquals(7, rowsByState.size()); for (List<Row> rowsForOneState : rowsByState) { if (rowsForOneState.get(0).getString(COL_CITY).equals("Los Angeles")) { assertEquals(2, rowsForOneState.size()); } else { assertEquals(1, rowsForOneState.size()); } } } }