package edu.washington.escience.myria.operator.apply;
import static org.junit.Assert.assertEquals;
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.expression.ConstantExpression;
import edu.washington.escience.myria.expression.SequenceExpression;
import edu.washington.escience.myria.expression.Expression;
import edu.washington.escience.myria.expression.ExpressionOperator;
import edu.washington.escience.myria.expression.SplitExpression;
import edu.washington.escience.myria.expression.VariableExpression;
import edu.washington.escience.myria.operator.Apply;
import edu.washington.escience.myria.operator.BatchTupleSource;
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;
public class FlatteningApplyTest {
private final String SEPARATOR = ",";
private final int SPLIT_MAX = 10;
private final long COUNTER_MAX = 2 * TupleUtils.getBatchSize(Type.LONG_TYPE) + 1;
private final long EXPECTED_RESULTS = SPLIT_MAX * COUNTER_MAX;
@Test
public void testApply() throws DbException {
final Schema schema =
Schema.ofFields(
"int_count",
Type.LONG_TYPE,
"ignore_1",
Type.FLOAT_TYPE,
"joined_ints",
Type.STRING_TYPE,
"ignore_2",
Type.BOOLEAN_TYPE);
final Schema expectedResultSchema =
Schema.ofFields(
"int_count",
Type.LONG_TYPE,
"joined_ints",
Type.STRING_TYPE,
"int_values",
Type.LONG_TYPE,
"joined_ints_splits",
Type.STRING_TYPE);
final TupleBatchBuffer input = new TupleBatchBuffer(schema);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < SPLIT_MAX; ++i) {
sb.append(i);
if (i < SPLIT_MAX - 1) {
sb.append(SEPARATOR);
}
}
final String joinedInts = sb.toString();
input.putLong(0, COUNTER_MAX);
input.putFloat(1, 1.0f);
input.putString(2, joinedInts);
input.putBoolean(3, true);
ImmutableList.Builder<Expression> Expressions = ImmutableList.builder();
ExpressionOperator countColIdx = new VariableExpression(0);
Expressions.add(new Expression("int_count", countColIdx));
ExpressionOperator splitColIdx = new VariableExpression(2);
Expressions.add(new Expression("joined_ints", splitColIdx));
ExpressionOperator counter = new SequenceExpression(countColIdx);
Expressions.add(new Expression("int_values", counter));
ExpressionOperator regex = new ConstantExpression(SEPARATOR);
ExpressionOperator split = new SplitExpression(splitColIdx, regex);
Expressions.add(new Expression("joined_ints_splits", split));
Apply apply = new Apply(new BatchTupleSource(input), Expressions.build());
apply.open(TestEnvVars.get());
int rowIdx = 0;
while (!apply.eos()) {
TupleBatch result = apply.nextReady();
if (result != null) {
assertEquals(expectedResultSchema, result.getSchema());
for (int batchIdx = 0; batchIdx < result.numTuples(); ++batchIdx, ++rowIdx) {
assertEquals(COUNTER_MAX, result.getLong(0, batchIdx));
assertEquals(joinedInts, result.getString(1, batchIdx));
assertEquals((rowIdx / SPLIT_MAX), result.getLong(2, batchIdx));
assertEquals((rowIdx % SPLIT_MAX), Integer.parseInt(result.getString(3, batchIdx)));
}
}
}
assertEquals(EXPECTED_RESULTS, rowIdx);
apply.close();
}
}