/** * Given a list of rexnodes it transforms the rexnodes by changing the expr to use new index mapped to the old index. * @param builder : RexBuilder from the planner. * @param exprs: RexNodes to be transformed. * @param corrMap: Mapping between old index to new index. * @return */ public static List<RexNode> transformExprs(RexBuilder builder, List<RexNode> exprs, Map<Integer, Integer> corrMap) { List<RexNode> outputExprs = new ArrayList<>(); DrillRelOptUtil.RexFieldsTransformer transformer = new DrillRelOptUtil.RexFieldsTransformer(builder, corrMap); for (RexNode expr : exprs) { outputExprs.add(transformer.go(expr)); } return outputExprs; }
public RexNode go(RexNode rex) { if (rex instanceof RexCall) { ImmutableList.Builder<RexNode> builder = ImmutableList.builder(); final RexCall call = (RexCall) rex; for (RexNode operand : call.operands) { builder.add(go(operand)); } return call.clone(call.getType(), builder.build()); } else if (rex instanceof RexInputRef) { RexInputRef var = (RexInputRef) rex; int index = var.getIndex(); return rexBuilder.makeInputRef(var.getType(), inputRefMap.get(index)); } else { return rex; } } }
/** * Given a of rexnode it transforms the rexnode by changing the expr to use new index mapped to the old index. * @param builder : RexBuilder from the planner. * @param expr: RexNode to be transformed. * @param corrMap: Mapping between old index to new index. * @return */ public static RexNode transformExpr(RexBuilder builder, RexNode expr, Map<Integer, Integer> corrMap) { DrillRelOptUtil.RexFieldsTransformer transformer = new DrillRelOptUtil.RexFieldsTransformer(builder, corrMap); return transformer.go(expr); }