*/
@Test
public void testClone() throws Exception {
Procedure catalog_proc = this.getProcedure(GetNewDestination.class);
Statement catalog_stmt = this.getStatement(catalog_proc, "GetData");
AbstractPlanNode root = PlanNodeUtil.getRootPlanNodeForStatement(catalog_stmt, true);
assertNotNull(root);
AbstractPlanNode clone = (AbstractPlanNode)root.clone();
assertNotNull(clone);
// assertEquals(root, clone);
assertFalse(root == clone);
List<AbstractPlanNode> list0 = new PlanNodeList(root).getExecutionList();
List<AbstractPlanNode> list1 = new PlanNodeList(clone).getExecutionList();
assertEquals(list0.size(), list1.size());
for (int i = 0, cnt = list0.size(); i < cnt; i++) {
AbstractPlanNode node0 = list0.get(i);
assertNotNull(node0);
AbstractPlanNode node1 = list1.get(i);
assertNotNull(node1);
// Compare!
assertFalse(node0 == node1);
assertEquals(node0.getChildPlanNodeCount(), node1.getChildPlanNodeCount());
assertEquals(node0.getInlinePlanNodeCount(), node1.getInlinePlanNodeCount());
assertEquals(node0.getOutputColumnGUIDCount(), node1.getOutputColumnGUIDCount());
List<AbstractExpression> exps0 = new ArrayList<AbstractExpression>(PlanNodeUtil.getExpressionsForPlanNode(node0));
List<AbstractExpression> exps1 = new ArrayList<AbstractExpression>(PlanNodeUtil.getExpressionsForPlanNode(node1));
assertEquals(exps0.size(), exps1.size());
for (int j = 0; j < exps0.size(); j++) {
AbstractExpression exp0 = exps0.get(j);
assertNotNull(exp0);
AbstractExpression exp1 = exps1.get(j);
assertNotNull(exp1);
// assertFalse(exp0 == exp1);
if (exp0.equals(exp1) == false) {
System.err.println("Failed to clone " + node0);
String col0 = "";
for (AbstractExpression exp : exps0)
col0 += "\n" + ExpressionUtil.debug(exp);
String col1 = "";
for (AbstractExpression exp : exps1)
col1 += "\n" + ExpressionUtil.debug(exp);
System.err.println(StringUtil.columns(col0, col1));
}
assertEquals(exp0, exp1);
} // FOR (exps)
// Make sure that they don't have the same reference!
node0.setOutputColumns(Collections.singleton(Integer.MIN_VALUE));
assertFalse(node0.getOutputColumnGUIDs().equals(node1.getOutputColumnGUIDs()));
} // FOR (nodes)
}