/** Equivalence to {@link org.apache.calcite.plan.RelOptUtil#createCastRel} * for {@link MutableRel}. */ public static MutableRel createCastRel(MutableRel rel, RelDataType castRowType, boolean rename) { RelDataType rowType = rel.getRowType(); if (RelOptUtil.areRowTypesEqual(rowType, castRowType, rename)) { // nothing to do return rel; } List<RexNode> castExps = RexUtil.generateCastExpressions(rel.cluster.getRexBuilder(), castRowType, rowType); final List<String> fieldNames = rename ? castRowType.getFieldNames() : rowType.getFieldNames(); return MutableProject.of(rel, castExps, fieldNames); } }
/** * Generates a cast from one row type to another * * @param rexBuilder RexBuilder to use for constructing casts * @param lhsRowType target row type * @param rhsRowType source row type; fields must be 1-to-1 with lhsRowType, * in same order * @return cast expressions */ public static List<RexNode> generateCastExpressions( RexBuilder rexBuilder, RelDataType lhsRowType, RelDataType rhsRowType) { final List<RelDataTypeField> fieldList = rhsRowType.getFieldList(); int n = fieldList.size(); assert n == lhsRowType.getFieldCount() : "field count: lhs [" + lhsRowType + "] rhs [" + rhsRowType + "]"; List<RexNode> rhsExps = new ArrayList<>(); for (RelDataTypeField field : fieldList) { rhsExps.add( rexBuilder.makeInputRef(field.getType(), field.getIndex())); } return generateCastExpressions(rexBuilder, lhsRowType, rhsExps); }
/** * Generates a cast from one row type to another * * @param rexBuilder RexBuilder to use for constructing casts * @param lhsRowType target row type * @param rhsRowType source row type; fields must be 1-to-1 with lhsRowType, * in same order * @return cast expressions */ public static List<RexNode> generateCastExpressions( RexBuilder rexBuilder, RelDataType lhsRowType, RelDataType rhsRowType) { final List<RelDataTypeField> fieldList = rhsRowType.getFieldList(); int n = fieldList.size(); assert n == lhsRowType.getFieldCount() : "field count: lhs [" + lhsRowType + "] rhs [" + rhsRowType + "]"; List<RexNode> rhsExps = new ArrayList<>(); for (RelDataTypeField field : fieldList) { rhsExps.add( rexBuilder.makeInputRef(field.getType(), field.getIndex())); } return generateCastExpressions(rexBuilder, lhsRowType, rhsExps); }
private static RexNode makeConstructorCall( SqlRexContext cx, SqlFunction constructor, List<RexNode> exprs) { final RexBuilder rexBuilder = cx.getRexBuilder(); RelDataType type = rexBuilder.deriveReturnType(constructor, exprs); int n = type.getFieldCount(); ImmutableList.Builder<RexNode> initializationExprs = ImmutableList.builder(); final InitializerContext initializerContext = new InitializerContext() { public RexBuilder getRexBuilder() { return rexBuilder; } public RexNode convertExpression(SqlNode e) { throw new UnsupportedOperationException(); } }; for (int i = 0; i < n; ++i) { initializationExprs.add( cx.getInitializerExpressionFactory().newAttributeInitializer( type, constructor, i, exprs, initializerContext)); } List<RexNode> defaultCasts = RexUtil.generateCastExpressions( rexBuilder, type, initializationExprs.build()); return rexBuilder.makeNewInvocation(type, defaultCasts); }
private static RexNode makeConstructorCall( SqlRexContext cx, SqlFunction constructor, List<RexNode> exprs) { final RexBuilder rexBuilder = cx.getRexBuilder(); RelDataType type = rexBuilder.deriveReturnType(constructor, exprs); int n = type.getFieldCount(); ImmutableList.Builder<RexNode> initializationExprs = ImmutableList.builder(); final InitializerContext initializerContext = new InitializerContext() { public RexBuilder getRexBuilder() { return rexBuilder; } public RexNode convertExpression(SqlNode e) { throw new UnsupportedOperationException(); } }; for (int i = 0; i < n; ++i) { initializationExprs.add( cx.getInitializerExpressionFactory().newAttributeInitializer( type, constructor, i, exprs, initializerContext)); } List<RexNode> defaultCasts = RexUtil.generateCastExpressions( rexBuilder, type, initializationExprs.build()); return rexBuilder.makeNewInvocation(type, defaultCasts); }
/** Equivalence to {@link org.apache.calcite.plan.RelOptUtil#createCastRel} * for {@link MutableRel}. */ public static MutableRel createCastRel(MutableRel rel, RelDataType castRowType, boolean rename) { RelDataType rowType = rel.rowType; if (RelOptUtil.areRowTypesEqual(rowType, castRowType, rename)) { // nothing to do return rel; } List<RexNode> castExps = RexUtil.generateCastExpressions(rel.cluster.getRexBuilder(), castRowType, rowType); final List<String> fieldNames = rename ? castRowType.getFieldNames() : rowType.getFieldNames(); return MutableProject.of(rel, castExps, fieldNames); }
/** Equivalence to {@link org.apache.calcite.plan.RelOptUtil#createCastRel} * for {@link MutableRel}. */ public static MutableRel createCastRel(MutableRel rel, RelDataType castRowType, boolean rename) { RelDataType rowType = rel.rowType; if (RelOptUtil.areRowTypesEqual(rowType, castRowType, rename)) { // nothing to do return rel; } List<RexNode> castExps = RexUtil.generateCastExpressions(rel.cluster.getRexBuilder(), castRowType, rowType); final List<String> fieldNames = rename ? castRowType.getFieldNames() : rowType.getFieldNames(); return MutableProject.of(rel, castExps, fieldNames); }
/** * Creates a projection which casts a rel's output to a desired row type. * Differs from RelOptUtil implementation by casting even when type is ANY. * * @param rel producer of rows to be converted * @param castRowType row type after cast * @param projectFactory Project Factory * * @return conversion rel */ public static RelNode createCastRel( final RelNode rel, RelDataType castRowType, RelFactories.ProjectFactory projectFactory) { assert projectFactory != null; RelDataType rowType = rel.getRowType(); if (areRowTypesEqual(rowType, castRowType, false, true)) { // nothing to do return rel; } final RexBuilder rexBuilder = rel.getCluster().getRexBuilder(); final List<RexNode> castExps = RexUtil.generateCastExpressions(rexBuilder, castRowType, rowType); return projectFactory.createProject(rel, castExps, rowType.getFieldNames()); }
RexUtil.generateCastExpressions(rexBuilder, castRowType, rowType); if (rename) {
RexUtil.generateCastExpressions(rexBuilder, castRowType, rowType); if (rename) {