private ILogicalOperator copyAndSubstituteVar(ILogicalOperator op, ILogicalOperator argOp)
throws AlgebricksException {
ILogicalOperator newOp = OperatorManipulationUtil.deepCopy(argOp);
variableMapping.clear();
IsomorphismUtilities.mapVariablesTopDown(op, argOp, variableMapping);
List<LogicalVariable> liveVars = new ArrayList<>();
for (int i = 0; i < argOp.getInputs().size(); i++) {
VariableUtilities.getLiveVariables(argOp.getInputs().get(i).getValue(), liveVars);
}
List<LogicalVariable> producedVars = new ArrayList<>();
VariableUtilities.getProducedVariables(argOp, producedVars);
List<LogicalVariable> producedVarsNew = new ArrayList<>();
VariableUtilities.getProducedVariables(op, producedVarsNew);
if (producedVars.size() != producedVarsNew.size()) {
return newOp;
}
for (Entry<LogicalVariable, LogicalVariable> map : variableMapping.entrySet()) {
if (liveVars.contains(map.getKey())) {
VariableUtilities.substituteVariables(newOp, map.getKey(), map.getValue(), null);
}
}
for (int i = 0; i < producedVars.size(); i++) {
VariableUtilities.substituteVariables(newOp, producedVars.get(i), producedVarsNew.get(i), null);
}
return newOp;
}