@Override public OptionalJoinSegment<T> clone() { List<QueryModelNode> order = new ArrayList<>(); for(QueryModelNode node: orderedNodes) { order.add(node.clone()); } Set<QueryModelNode> unorder = Sets.newHashSet(order); Map<ValueExpr, Filter> map = new HashMap<>(); for(ValueExpr expr: conditionMap.keySet()) { map.put(expr.clone(), conditionMap.get(expr).clone()); } return new OptionalJoinSegment<T>(unorder, order, map); }
@Override public Regex clone() { Regex clone = (Regex)super.clone(); if (flagsArg != null) { clone.setFlagsArg(flagsArg.clone()); } return clone; } }
@Override public FunctionCall clone() { FunctionCall clone = (FunctionCall)super.clone(); clone.args = new ArrayList<ValueExpr>(getArgs().size()); for (ValueExpr arg : getArgs()) { clone.addArg(arg.clone()); } return clone; } }
@Override public ExtensionElem clone() { ExtensionElem clone = (ExtensionElem)super.clone(); clone.setExpr(getExpr().clone()); return clone; } }
@Override public Filter clone() { Filter clone = (Filter)super.clone(); clone.setCondition(getCondition().clone()); return clone; } }
@Override public NAryValueOperator clone() { NAryValueOperator clone = (NAryValueOperator)super.clone(); clone.setArguments(new ArrayList<ValueExpr>()); for(ValueExpr arg: getArguments()) { clone.addArgument(arg.clone()); } return clone; } }
@Override public CompareSubQueryValueOperator clone() { CompareSubQueryValueOperator clone = (CompareSubQueryValueOperator)super.clone(); clone.setArg(getArg().clone()); return clone; } }
@Override public OrderElem clone() { OrderElem clone = (OrderElem)super.clone(); clone.setExpr(getExpr().clone()); return clone; } }
@Override public LeftJoin clone() { LeftJoin clone = (LeftJoin)super.clone(); if (hasCondition()) { clone.setCondition(getCondition().clone()); } return clone; } }
@Override public UnaryValueOperator clone() { UnaryValueOperator clone = (UnaryValueOperator)super.clone(); if (getArg() != null) { clone.setArg(getArg().clone()); } return clone; } }
@Override public void meet(final Difference node) { if (Sets.intersection(node.getRightArg().getBindingNames(), filterVars).size() > 0) { relocate(filter, node.getRightArg()); } else if (Sets.intersection(node.getLeftArg().getBindingNames(), filterVars).size() > 0) { final Filter clone = new Filter(filter.getArg(), filter .getCondition().clone()); relocate(clone, node.getLeftArg()); } }
@Override public void meet(final Intersection node) { if (Sets.intersection(node.getRightArg().getBindingNames(), filterVars).size() > 0) { relocate(filter, node.getRightArg()); } else if (Sets.intersection(node.getLeftArg().getBindingNames(), filterVars).size() > 0) { final Filter clone = new Filter(filter.getArg(), filter .getCondition().clone()); relocate(clone, node.getLeftArg()); } }
@Override public void meet(Difference node) { Filter clone = new Filter(); clone.setCondition(filter.getCondition().clone()); relocate(filter, node.getLeftArg()); relocate(clone, node.getRightArg()); FilterRelocator.relocate(filter); FilterRelocator.relocate(clone); }
@Override public void meet(Intersection node) { Filter clone = new Filter(); clone.setCondition(filter.getCondition().clone()); relocate(filter, node.getLeftArg()); relocate(clone, node.getRightArg()); FilterRelocator.relocate(filter); FilterRelocator.relocate(clone); }
@Override public void meet(Union union) { Filter clone = new Filter(); clone.setCondition(filter.getCondition().clone()); relocate(filter, union.getLeftArg()); relocate(clone, union.getRightArg()); FilterRelocator.relocate(filter); FilterRelocator.relocate(clone); }
@Override public void meet(Union union) { Filter clone = new Filter(); clone.setCondition(filter.getCondition().clone()); relocate(filter, union.getLeftArg()); relocate(clone, union.getRightArg()); FilterRelocator.relocate(filter); FilterRelocator.relocate(clone); }
@Override public void meet(Difference node) { Filter clone = new Filter(); clone.setCondition(filter.getCondition().clone()); relocate(filter, node.getLeftArg()); relocate(clone, node.getRightArg()); FilterRelocator.relocate(filter); FilterRelocator.relocate(clone); }
@Override public void meet(Intersection node) { Filter clone = new Filter(); clone.setCondition(filter.getCondition().clone()); relocate(filter, node.getLeftArg()); relocate(clone, node.getRightArg()); FilterRelocator.relocate(filter); FilterRelocator.relocate(clone); }