package edu.washington.escience.myria.operator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Comparator; import java.util.Map.Entry; import org.junit.Test; import edu.washington.escience.myria.DbException; import edu.washington.escience.myria.storage.TupleBatch; import edu.washington.escience.myria.storage.TupleBatchBuffer; import edu.washington.escience.myria.util.TestEnvVars; import edu.washington.escience.myria.util.TestUtils; public class MergeTest { @Test public void testMergeConstructorWithNull() throws DbException { BatchTupleSource[] children = new BatchTupleSource[1]; children[0] = new BatchTupleSource(TestUtils.generateRandomTuples(10, 10, false)); Merge merge = new Merge(null, null, null); merge.setChildren(children); merge.setSortedColumns(new int[] {0}, new boolean[] {true}); } @Test public void testMergeCount() throws DbException { BatchTupleSource[] children = new BatchTupleSource[3]; children[0] = new BatchTupleSource(TestUtils.generateRandomTuples(12300, 5000, true)); children[1] = new BatchTupleSource(TestUtils.generateRandomTuples(4200, 2000, true)); children[2] = new BatchTupleSource(TestUtils.generateRandomTuples(9900, 5000, true)); NAryOperator merge = new Merge(children, new int[] {0}, new boolean[] {true}); merge.open(TestEnvVars.get()); TupleBatch tb = null; int count = 0; while (!merge.eos()) { tb = merge.nextReady(); if (tb != null) { count += tb.numTuples(); } } merge.close(); assertEquals(12300 + 4200 + 9900, count); } @Test public void testMergeTuplesSorted() throws DbException { TupleBatchBuffer[] randomTuples = new TupleBatchBuffer[3]; randomTuples[0] = TestUtils.generateRandomTuples(52300, 5000, true); randomTuples[1] = TestUtils.generateRandomTuples(14200, 5000, true); randomTuples[2] = TestUtils.generateRandomTuples(29900, 5000, true); BatchTupleSource[] children = new BatchTupleSource[3]; children[0] = new BatchTupleSource(randomTuples[0]); children[1] = new BatchTupleSource(randomTuples[1]); children[2] = new BatchTupleSource(randomTuples[2]); NAryOperator merge = new Merge(children, new int[] {0, 1}, new boolean[] {true, true}); merge.open(TestEnvVars.get()); TupleBatch tb; final ArrayList<Entry<Long, String>> entries = new ArrayList<Entry<Long, String>>(); while (!merge.eos()) { tb = merge.nextReady(); if (tb != null) { for (int i = 0; i < tb.numTuples(); i++) { entries.add(new SimpleEntry<Long, String>(tb.getLong(0, i), tb.getString(1, i))); } } } merge.close(); assertEquals(52300 + 14200 + 29900, entries.size()); Comparator<Entry<Long, String>> comparator = new TestUtils.EntryComparator(); Entry<Long, String> previous = null; for (Entry<Long, String> entry : entries) { if (previous != null) { assertTrue(comparator.compare(previous, entry) <= 0); } previous = entry; } } }