/** * Returns a shallow copy of a relational expression with a particular * input replaced. */ public static RelNode replaceInput( RelNode parent, int ordinal, RelNode newInput) { final List<RelNode> inputs = new ArrayList<RelNode>(parent.getInputs()); if (inputs.get(ordinal) == newInput) { return parent; } inputs.set(ordinal, newInput); return parent.copy(parent.getTraitSet(), inputs); }
/** Helper for {@link #replace}. */ private static RelNode replaceRecurse( RelNode query, RelNode find, RelNode replace) { if (query == find) { return replace; } final List<RelNode> inputs = query.getInputs(); if (!inputs.isEmpty()) { final List<RelNode> newInputs = new ArrayList<RelNode>(); for (RelNode input : inputs) { newInputs.add(replaceRecurse(input, find, replace)); } if (!newInputs.equals(inputs)) { return query.copy(query.getTraitSet(), newInputs); } } return query; }
private static RelNode replaceRecurse( RelNode query, RelNode find, RelNode replace) { if (query == find) { return replace; } final List<RelNode> inputs = query.getInputs(); if (!inputs.isEmpty()) { final List<RelNode> newInputs = new ArrayList<RelNode>(); for (RelNode input : inputs) { newInputs.add(replaceRecurse(input, find, replace)); } if (!newInputs.equals(inputs)) { return query.copy(query.getTraitSet(), newInputs); } } return query; }
public static <T extends RelNode> T addTrait( T rel, RelTrait trait) { //noinspection unchecked return (T) rel.copy( rel.getTraitSet().replace(trait), (List) rel.getInputs()); }
public static <T extends RelNode> T addTrait( T rel, RelTrait trait) { //noinspection unchecked return (T) rel.copy( rel.getTraitSet().replace(trait), (List) rel.getInputs()); }
public void decorrelateRelGeneric(RelNode rel) { RelNode newRel = rel.copy(rel.getTraitSet(), rel.getInputs()); if (rel.getInputs().size() > 0) { List<RelNode> oldInputs = rel.getInputs(); List<RelNode> newInputs = Lists.newArrayList(); for (int i = 0; i < oldInputs.size(); ++i) { RelNode newInputRel = mapOldToNewRel.get(oldInputs.get(i)); if ((newInputRel == null) || mapNewRelToMapCorVarToOutputPos.containsKey(newInputRel)) { // if child is not rewritten, or if it produces correlated // variables, terminate rewrite return; } else { newInputs.add(newInputRel); newRel.replaceInput(i, newInputRel); } } if (!Util.equalShallow(oldInputs, newInputs)) { newRel = rel.copy(rel.getTraitSet(), newInputs); } } // the output position should not change since there are no corVars // coming from below. Map<Integer, Integer> mapOldToNewOutputPos = Maps.newHashMap(); for (int i = 0; i < rel.getRowType().getFieldCount(); i++) { mapOldToNewOutputPos.put(i, i); } mapOldToNewRel.put(rel, newRel); mapNewRelToMapOldToNewOutputPos.put(newRel, mapOldToNewOutputPos); }
public void rewriteGeneric(RelNode rel) { RelNode newRel = rel.copy(rel.getTraitSet(), rel.getInputs()); List<RelNode> oldInputs = rel.getInputs(); for (int i = 0; i < oldInputs.size(); ++i) { newRel.replaceInput( i, getNewForOldRel(oldInputs.get(i))); } setNewForOldRel(rel, newRel); }
public void rewriteGeneric(RelNode rel) { RelNode newRel = rel.copy(rel.getTraitSet(), rel.getInputs()); List<RelNode> oldInputs = rel.getInputs(); for (int i = 0; i < oldInputs.size(); ++i) { newRel.replaceInput( i, getNewForOldRel(oldInputs.get(i))); } setNewForOldRel(rel, newRel); }
/** * Visits a particular child of a parent. */ protected RelNode visitChild(RelNode parent, int i, RelNode child) { Stacks.push(stack, parent); try { RelNode child2 = child.accept(this); if (child2 != child) { final List<RelNode> newInputs = new ArrayList<RelNode>(parent.getInputs()); newInputs.set(i, child2); return parent.copy(parent.getTraitSet(), newInputs); } return parent; } finally { Stacks.pop(stack, parent); } }
p = p.copy(p.getTraitSet(), inputs); planner.provenanceMap.put( p, new VolcanoPlanner.DirectProvenance(pOld));
p = p.copy(p.getTraitSet(), inputs);
consumerRel.copy( consumerRel.getTraitSet(), newInputs);
consumerRel.copy( consumerRel.getTraitSet(), newInputs);
rel = rel.copy(rel.getTraitSet(), (List) newInputs);
rel = rel.copy(rel.getTraitSet(), newInputs); onCopy(oldRel, rel);