@Override
public ILogicalOperator visitUnionOperator(UnionAllOperator op, ILogicalOperator arg) throws AlgebricksException {
List<Mutable<ILogicalOperator>> copiedInputs = new ArrayList<>();
for (Mutable<ILogicalOperator> childRef : op.getInputs()) {
copiedInputs.add(deepCopyOperatorReference(childRef, null));
}
List<List<LogicalVariable>> liveVarsInInputs = new ArrayList<>();
for (Mutable<ILogicalOperator> inputOpRef : copiedInputs) {
List<LogicalVariable> liveVars = new ArrayList<>();
VariableUtilities.getLiveVariables(inputOpRef.getValue(), liveVars);
liveVarsInInputs.add(liveVars);
}
List<LogicalVariable> liveVarsInLeftInput = liveVarsInInputs.get(0);
List<LogicalVariable> liveVarsInRightInput = liveVarsInInputs.get(1);
List<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> copiedTriples = new ArrayList<>();
int index = 0;
for (Triple<LogicalVariable, LogicalVariable, LogicalVariable> triple : op.getVariableMappings()) {
LogicalVariable producedVar = deepCopyVariable(triple.third);
Triple<LogicalVariable, LogicalVariable, LogicalVariable> copiedTriple =
new Triple<>(liveVarsInLeftInput.get(index), liveVarsInRightInput.get(index), producedVar);
copiedTriples.add(copiedTriple);
++index;
}
UnionAllOperator opCopy = new UnionAllOperator(copiedTriples);
deepCopyInputsAnnotationsAndExecutionMode(op, arg, opCopy);
return opCopy;
}