/** * Creates a relational expression which projects an array of expressions, and optionally * optimizes. * * <p>The result may not be a {@link ProjectRel}. If the projection is trivial, <code>child</code> * is returned directly; and future versions may return other formulations of expressions, such as * {@link CalcRel}. * * @param child input relational expression * @param exprs list of expressions for the input columns * @param fieldNames aliases of the expressions, or null to generate * @param optimize Whether to return <code>child</code> unchanged if the projections are trivial. */ public static RelNode createProject( RelNode child, List<RexNode> exprs, List<String> fieldNames, boolean optimize) { final RelOptCluster cluster = child.getCluster(); final RexProgram program = RexProgram.create(child.getRowType(), exprs, null, fieldNames, cluster.getRexBuilder()); final List<RelCollation> collationList = program.getCollations(child.getCollationList()); if (DeprecateProjectAndFilter) { return new CalcRel( cluster, child.getTraitSet(), child, program.getOutputRowType(), program, collationList); } else { final RelDataType rowType = RexUtil.createStructType(cluster.getTypeFactory(), exprs, fieldNames); if (optimize && RemoveTrivialProjectRule.isIdentity(exprs, rowType, child.getRowType())) { return child; } return new ProjectRel( cluster, cluster.traitSetOf( collationList.isEmpty() ? RelCollationImpl.EMPTY : collationList.get(0)), child, exprs, rowType, ProjectRelBase.Flags.Boxed); } }
/** * Creates a relational expression which projects an array of expressions, and optionally * optimizes. * * <p>The result may not be a {@link ProjectRel}. If the projection is trivial, <code>child</code> * is returned directly; and future versions may return other formulations of expressions, such as * {@link CalcRel}. * * @param child input relational expression * @param exprs list of expressions for the input columns * @param fieldNames aliases of the expressions, or null to generate * @param optimize Whether to return <code>child</code> unchanged if the projections are trivial. */ public static RelNode createProject( RelNode child, List<RexNode> exprs, List<String> fieldNames, boolean optimize) { final RelOptCluster cluster = child.getCluster(); final RexProgram program = RexProgram.create(child.getRowType(), exprs, null, fieldNames, cluster.getRexBuilder()); final List<RelCollation> collationList = program.getCollations(child.getCollationList()); if (DEPRECATE_PROJECT_AND_FILTER) { return new CalcRel( cluster, child.getTraitSet(), child, program.getOutputRowType(), program, collationList); } else { final RelDataType rowType = RexUtil.createStructType( cluster.getTypeFactory(), exprs, fieldNames == null ? null : SqlValidatorUtil.uniquify(fieldNames, SqlValidatorUtil.F_SUGGESTER)); if (optimize && RemoveTrivialProjectRule.isIdentity(exprs, rowType, child.getRowType())) { return child; } return new ProjectRel( cluster, cluster.traitSetOf( collationList.isEmpty() ? RelCollationImpl.EMPTY : collationList.get(0)), child, exprs, rowType, ProjectRelBase.Flags.BOXED); } }
/** * Creates a relational expression which filters according to a given condition, returning the * same fields as its input. * * @param child Child relational expression * @param condition Condition * @return Relational expression */ public static RelNode createFilter(RelNode child, RexNode condition) { if (DeprecateProjectAndFilter) { final RelOptCluster cluster = child.getCluster(); RexProgramBuilder builder = new RexProgramBuilder(child.getRowType(), cluster.getRexBuilder()); builder.addIdentity(); builder.addCondition(condition); final RexProgram program = builder.getProgram(); return new CalcRel( cluster, child.getTraitSet(), child, program.getOutputRowType(), program, Collections.<RelCollation>emptyList()); } else { return new FilterRel(child.getCluster(), child, condition); } }
/** * Creates a ProjectRel with no sort keys. * * @param cluster Cluster this relational expression belongs to * @param child input relational expression * @param exps set of expressions for the input columns * @param fieldNames aliases of the expressions * @param flags values as in {@link ProjectRelBase.Flags} */ public ProjectRel( RelOptCluster cluster, RelNode child, RexNode[] exps, String[] fieldNames, int flags) { this( cluster, child, exps, RexUtil.createStructType(cluster.getTypeFactory(), exps, fieldNames), flags, Collections.<RelCollation>emptyList()); }
/** * Creates a sorter. * * @param cluster Cluster this relational expression belongs to * @param traits Traits * @param child input relational expression * @param collations array of sort specifications */ public SortRel( RelOptCluster cluster, RelTraitSet traits, RelNode child, List<RelFieldCollation> collations) { super(cluster, traits, child); this.collations = collations; fieldExps = new RexNode[collations.size()]; final RelDataTypeField[] fields = getRowType().getFields(); for (int i = 0; i < collations.size(); ++i) { int iField = collations.get(i).getFieldIndex(); fieldExps[i] = cluster.getRexBuilder().makeInputRef(fields[iField].getType(), iField); } }
/** * Creates a new ValuesRel. Note that tuples passed in become owned by this rel (without a deep * copy), so caller must not modify them after this call, otherwise bad things will happen. * * @param cluster . * @param rowType row type for tuples produced by this rel * @param tuples 2-dimensional array of tuple values to be produced; outer list contains tuples; * each inner list is one tuple; all tuples must be of same length, conforming to rowType */ public ValuesRel(RelOptCluster cluster, RelDataType rowType, List<List<RexLiteral>> tuples) { super(cluster, rowType, tuples, cluster.traitSetOf(Convention.NONE)); }