TupleDType sourceTuple,
TupleDType targetTuple)
throws TypeIncompatibleException
{
// convert using arithmetic project
ProcessingElementNode project =
new ProcessingElementNode(TUPLE_CONVERT);
// create the descriptor
// TODO add stypes and dtypes
List<ProcessingElementInputDescriptor> inputs = new ArrayList<ProcessingElementInputDescriptor>(4);
ProcessingElementInputDescriptor desc = new ProcessingElementInputDescriptor("data");
inputs.add(desc);
desc = new ProcessingElementInputDescriptor("columnNames");
inputs.add(desc);
desc = new ProcessingElementInputDescriptor("resultColumnNames");
inputs.add(desc);
desc = new ProcessingElementInputDescriptor("expressions");
inputs.add(desc);
List<ProcessingElementOutputDescriptor> outputs =
Arrays.asList(new ProcessingElementOutputDescriptor("result"));
ProcessingElementDescriptor descriptor =
new SimpleProcessingElementDescriptor(inputs, outputs, null);
project.setDescriptor(descriptor);
// columns that are mapped
LiteralValuesNode columnNames = new LiteralValuesNode();
// projection expressions
LiteralValuesNode expressions = new LiteralValuesNode();
expressions.add(ListMarker.BEGIN);
columnNames.add(ListMarker.BEGIN);
for (Entry<String, DType> element : sourceTuple.getElements().entrySet())
{
DType targetType = targetTuple.getElements().get(element.getKey());
if (TypeUtilities.isEqual(element.getValue(), targetType))
{
// no conversion required
continue;
}
else
{
// look up the projection expression
String proj = mConverter.getProjection(element.getValue(), targetType);
if (proj == null)
{
throw new TypeIncompatibleException(
"No arithmetic project expression found for DType conversion from "
+ element.getValue() + " to " + targetType);
}
// replace ? with the tuple column name
String expression = proj.replaceAll("\\?", element.getKey());
// map the column using the expression
columnNames.add(element.getKey());
expressions.add(expression);
}
}
expressions.add(ListMarker.END);
columnNames.add(ListMarker.END);
project.connectInput("expressions", 0, expressions.getOutput());
project.connectInput("columnNames", 0, columnNames.getOutput());
composite.add(expressions);
composite.add(columnNames);
composite.add(project);
return project;
}