/** * */ package edu.washington.escience.myria.operator; import static org.junit.Assert.assertEquals; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; 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.storage.TupleUtils; import edu.washington.escience.myria.util.TestEnvVars; /** * Tests that crossing with a singleton works and catches the major error cases. */ public class CrossWithSingletonTest { private final int NUM_TUPLES = TupleUtils.getBatchSize(Type.DOUBLE_TYPE) * 3 + 3; private BatchTupleSource dataSource = null; private TupleBatch singleton = null; @Before public void setUp() { Schema dataSchema = Schema.ofFields("val1", Type.LONG_TYPE, "val2", Type.STRING_TYPE); TupleBatchBuffer tbb = new TupleBatchBuffer(dataSchema); for (int i = 0; i < NUM_TUPLES; ++i) { tbb.putLong(0, i); tbb.putString(1, "" + i); } dataSource = new BatchTupleSource(tbb.getAll()); tbb = new TupleBatchBuffer(Schema.ofFields(Type.DATETIME_TYPE, Type.BOOLEAN_TYPE)); tbb.putDateTime(0, DateTime.now()); tbb.putBoolean(1, false); singleton = tbb.popAny(); } @SuppressWarnings("deprecation") private void verifyMatch(final CrossWithSingleton cross) throws DbException { cross.open(TestEnvVars.get()); int numTuples = 0; while (!cross.eos()) { TupleBatch next = cross.nextReady(); if (next == null) { continue; } for (int j = 0; j < next.numTuples(); ++j) { assertEquals(j + numTuples, next.getLong(0, j)); assertEquals("" + (j + numTuples), next.getString(1, j)); for (int k = 0; k < singleton.numColumns(); ++k) { assertEquals(next.getObject(2 + k, j), singleton.getObject(k, 0)); } } numTuples += next.numTuples(); } } @Test public void testWithSingleton() throws DbException { BatchTupleSource singletonSource = new BatchTupleSource(singleton); CrossWithSingleton cross = new CrossWithSingleton(dataSource, singletonSource); assertEquals(Schema.merge(dataSource.getSchema(), singleton.getSchema()), cross.getSchema()); verifyMatch(cross); } @Test(expected = IllegalStateException.class) public void testWithSingletonWrongSide() throws DbException { BatchTupleSource singletonSource = new BatchTupleSource(singleton); CrossWithSingleton cross = new CrossWithSingleton(singletonSource, dataSource); assertEquals(Schema.merge(singleton.getSchema(), dataSource.getSchema()), cross.getSchema()); verifyMatch(cross); } @Test(expected = IllegalStateException.class) public void testWithTwoSingletons() throws DbException { TupleBatchBuffer tbb = new TupleBatchBuffer(singleton.getSchema()); tbb.appendTB(singleton); tbb.appendTB(singleton); BatchTupleSource source = new BatchTupleSource(tbb.getAll()); CrossWithSingleton cross = new CrossWithSingleton(dataSource, source); assertEquals(Schema.merge(dataSource.getSchema(), singleton.getSchema()), cross.getSchema()); verifyMatch(cross); } @Test(expected = IllegalStateException.class) public void testWithEmptyRelation() throws DbException { CrossWithSingleton cross = new CrossWithSingleton(dataSource, EmptyRelation.of(singleton.getSchema())); verifyMatch(cross); } }