@Override public Object clone() { JoinDesc ret = new JoinDesc(); Map<Byte, List<ExprNodeDesc>> cloneExprs = new HashMap<Byte, List<ExprNodeDesc>>(); cloneExprs.putAll(getExprs()); ret.setExprs(cloneExprs); Map<Byte, List<ExprNodeDesc>> cloneFilters = new HashMap<Byte, List<ExprNodeDesc>>(); cloneFilters.putAll(getFilters()); ret.setFilters(cloneFilters); ret.setConds(getConds().clone()); ret.setNoOuterJoin(getNoOuterJoin()); ret.setNullSafes(getNullSafes()); ret.setHandleSkewJoin(handleSkewJoin); ret.setSkewKeyDefinition(getSkewKeyDefinition()); ret.setTagOrder(getTagOrder().clone()); if (getKeyTableDesc() != null) { ret.setKeyTableDesc((TableDesc) getKeyTableDesc().clone()); } if (getBigKeysDirMap() != null) { Map<Byte, String> cloneBigKeysDirMap = new HashMap<Byte, String>(); cloneBigKeysDirMap.putAll(getBigKeysDirMap()); ret.setBigKeysDirMap(cloneBigKeysDirMap); } if (getSmallKeysDirMap() != null) { Map<Byte, Map<Byte, String>> cloneSmallKeysDirMap = new HashMap<Byte, Map<Byte, String>>(); cloneSmallKeysDirMap.putAll(getSmallKeysDirMap()); ret.setSmallKeysDirMap(cloneSmallKeysDirMap); } if (getSkewKeysValuesTables() != null) { Map<Byte, TableDesc> cloneSkewKeysValuesTables = new HashMap<Byte, TableDesc>(); cloneSkewKeysValuesTables.putAll(getSkewKeysValuesTables()); ret.setSkewKeysValuesTables(cloneSkewKeysValuesTables); } if (getOutputColumnNames() != null) { List<String> cloneOutputColumnNames = new ArrayList<String>(); cloneOutputColumnNames.addAll(getOutputColumnNames()); ret.setOutputColumnNames(cloneOutputColumnNames); } if (getReversedExprs() != null) { Map<String, Byte> cloneReversedExprs = new HashMap<String, Byte>(); cloneReversedExprs.putAll(getReversedExprs()); ret.setReversedExprs(cloneReversedExprs); } return ret; }