public PlanNode replace(int group, PlanNode node, String reason)
{
PlanNode old = getGroup(group).membership;
checkArgument(new HashSet<>(old.getOutputSymbols()).equals(new HashSet<>(node.getOutputSymbols())),
"%s: transformed expression doesn't produce same outputs: %s vs %s",
reason,
old.getOutputSymbols(),
node.getOutputSymbols());
if (node instanceof GroupReference) {
node = getNode(((GroupReference) node).getGroupId());
}
else {
node = insertChildrenAndRewrite(node);
}
incrementReferenceCounts(node, group);
getGroup(group).membership = node;
decrementReferenceCounts(old, group);
evictStatisticsAndCost(group);
return node;
}