testEval(null, null, null, query, expected);
}
public void testEval(Schema schema, String tableName, String csvTuple, String query, String [] expected) throws IOException {
LazyTuple lazyTuple;
VTuple vtuple = null;
Schema inputSchema = null;
if (schema != null) {
inputSchema = (Schema) schema.clone();
inputSchema.setQualifier(tableName, true);
int targetIdx [] = new int[inputSchema.getColumnNum()];
for (int i = 0; i < targetIdx.length; i++) {
targetIdx[i] = i;
}
lazyTuple = new LazyTuple(inputSchema, Bytes.splitPreserveAllTokens(csvTuple.getBytes(), ',', targetIdx), 0);
vtuple = new VTuple(inputSchema.getColumnNum());
for (int i = 0; i < inputSchema.getColumnNum(); i++) {
// If null value occurs, null datum is manually inserted to an input tuple.
if (lazyTuple.get(i) instanceof TextDatum && lazyTuple.getText(i).asChars().equals("")) {
vtuple.put(i, NullDatum.get());
} else {
vtuple.put(i, lazyTuple.get(i));
}
}
cat.addTable(new TableDescImpl(tableName, inputSchema, CatalogProtos.StoreType.CSV, new Options(), CommonTestingUtil.getTestDir()));
}
Target [] targets = null;
try {
targets = getRawTargets(query);
} catch (PlanningException e) {
assertTrue("Wrong query statement: " + query, false);
}
EvalContext [] evalContexts = new EvalContext[targets.length];
Tuple outTuple = new VTuple(targets.length);
for (int i = 0; i < targets.length; i++) {
EvalNode eval = targets[i].getEvalTree();
evalContexts[i] = eval.newContext();
eval.eval(evalContexts[i], inputSchema, vtuple);
outTuple.put(i, eval.terminate(evalContexts[i]));
}
if (schema != null) {
cat.deleteTable(tableName);
}
for (int i = 0; i < expected.length; i++) {
assertEquals(query, expected[i], outTuple.get(i).asChars());
}
}