package edu.washington.escience.myria.operator;
import java.util.HashMap;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import edu.washington.escience.myria.DbException;
import edu.washington.escience.myria.Schema;
import edu.washington.escience.myria.Type;
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;
import edu.washington.escience.myria.util.Tuple;
public class DifferenceTest {
private TupleBatchBuffer leftTbb, rightTbb;
@Before
public void setUp() throws Exception {
final Schema schema =
new Schema(
ImmutableList.of(Type.LONG_TYPE, Type.STRING_TYPE), ImmutableList.of("id", "name"));
leftTbb = new TupleBatchBuffer(schema);
{
long[] ids = new long[] {0, 2, 2, 3, 4, 5, 6, 8, 8, 8, 8, 10, 10, 10};
String[] names =
new String[] {"c", "c", "c", "b", "b", "b", "b", "a", "a", "a", "a", "a", "a", "a"};
for (int i = 0; i < ids.length; i++) {
leftTbb.putLong(0, ids[i]);
leftTbb.putString(1, names[i]);
}
}
rightTbb = new TupleBatchBuffer(schema);
{
long[] ids = new long[] {2, 10, 2, 9};
String[] names = new String[] {"c", "a", "c", "k"};
for (int i = 0; i < ids.length; i++) {
rightTbb.putLong(0, ids[i]);
rightTbb.putString(1, names[i]);
}
}
}
@Test
public void test() throws Exception {
BatchTupleSource left = new BatchTupleSource(leftTbb);
BatchTupleSource right = new BatchTupleSource(rightTbb);
BinaryOperator diff = new Difference(left, right);
diff.open(TestEnvVars.get());
TupleBatchBuffer result = new TupleBatchBuffer(diff.getSchema());
TupleBatchBuffer expected = new TupleBatchBuffer(diff.getSchema());
{
long[] ids = new long[] {0, 3, 4, 5, 6, 8};
String[] names = new String[] {"c", "b", "b", "b", "b", "a"};
for (int i = 0; i < ids.length; i++) {
expected.putLong(0, ids[i]);
expected.putString(1, names[i]);
}
}
while (!diff.eos()) {
TupleBatch batch = diff.nextReady();
if (batch != null) {
batch.compactInto(result);
}
}
diff.close();
final HashMap<Tuple, Integer> resultBag = TestUtils.tupleBatchToTupleBag(result);
final HashMap<Tuple, Integer> expectedBag = TestUtils.tupleBatchToTupleBag(expected);
TestUtils.assertTupleBagEqual(expectedBag, resultBag);
}
@Test(expected = DbException.class)
public void incompatibleSchemas() throws DbException {
final Schema s1 =
new Schema(
ImmutableList.of(Type.LONG_TYPE, Type.STRING_TYPE), ImmutableList.of("id", "name"));
Operator left = EmptyRelation.of(s1);
final Schema s2 =
new Schema(
ImmutableList.of(Type.INT_TYPE, Type.STRING_TYPE), ImmutableList.of("id", "name"));
Operator right = EmptyRelation.of(s2);
BinaryOperator diff = new Difference(left, right);
diff.open(TestEnvVars.get());
}
}