/** Returns a list of the time units covered by an interval type such * as HOUR TO SECOND. Adds MILLISECOND if the end is SECOND, to deal with * fractional seconds. */ private static List<TimeUnit> getTimeUnits(SqlTypeName typeName) { final TimeUnit start = typeName.getStartUnit(); final TimeUnit end = typeName.getEndUnit(); final ImmutableList<TimeUnit> list = TIME_UNITS.subList(start.ordinal(), end.ordinal() + 1); if (end == TimeUnit.SECOND) { return CompositeList.of(list, ImmutableList.of(TimeUnit.MILLISECOND)); } return list; }
/** Returns a list of the time units covered by an interval type such * as HOUR TO SECOND. Adds MILLISECOND if the end is SECOND, to deal with * fractional seconds. */ private static List<TimeUnit> getTimeUnits(SqlTypeName typeName) { final TimeUnit start = typeName.getStartUnit(); final TimeUnit end = typeName.getEndUnit(); final ImmutableList<TimeUnit> list = TIME_UNITS.subList(start.ordinal(), end.ordinal() + 1); if (end == TimeUnit.SECOND) { return CompositeList.of(list, ImmutableList.of(TimeUnit.MILLISECOND)); } return list; }
private static Expression scaleIntervalToNumber( RelDataType sourceType, RelDataType targetType, Expression operand) { switch (targetType.getSqlTypeName().getFamily()) { case NUMERIC: switch (sourceType.getSqlTypeName()) { case INTERVAL_YEAR: case INTERVAL_YEAR_MONTH: case INTERVAL_MONTH: case INTERVAL_DAY: case INTERVAL_DAY_HOUR: case INTERVAL_DAY_MINUTE: case INTERVAL_DAY_SECOND: case INTERVAL_HOUR: case INTERVAL_HOUR_MINUTE: case INTERVAL_HOUR_SECOND: case INTERVAL_MINUTE: case INTERVAL_MINUTE_SECOND: case INTERVAL_SECOND: // Scale to the given field. final BigDecimal multiplier = BigDecimal.ONE; final BigDecimal divider = sourceType.getSqlTypeName().getEndUnit().multiplier; return RexImpTable.multiplyDivide(operand, multiplier, divider); } } return operand; }
private static Expression scaleIntervalToNumber( RelDataType sourceType, RelDataType targetType, Expression operand) { switch (targetType.getSqlTypeName().getFamily()) { case NUMERIC: switch (sourceType.getSqlTypeName()) { case INTERVAL_YEAR: case INTERVAL_YEAR_MONTH: case INTERVAL_MONTH: case INTERVAL_DAY: case INTERVAL_DAY_HOUR: case INTERVAL_DAY_MINUTE: case INTERVAL_DAY_SECOND: case INTERVAL_HOUR: case INTERVAL_HOUR_MINUTE: case INTERVAL_HOUR_SECOND: case INTERVAL_MINUTE: case INTERVAL_MINUTE_SECOND: case INTERVAL_SECOND: // Scale to the given field. final BigDecimal multiplier = BigDecimal.ONE; final BigDecimal divider = sourceType.getSqlTypeName().getEndUnit().multiplier; return RexImpTable.multiplyDivide(operand, multiplier, divider); } } return operand; }
private RexNode makeCastIntervalToExact(RelDataType toType, RexNode exp) { final TimeUnit endUnit = exp.getType().getSqlTypeName().getEndUnit(); final TimeUnit baseUnit = baseUnit(exp.getType().getSqlTypeName()); final BigDecimal multiplier = baseUnit.multiplier; final int scale = 0; BigDecimal divider = endUnit.multiplier.scaleByPowerOfTen(-scale); RexNode value = multiplyDivide(decodeIntervalOrDecimal(exp), multiplier, divider); if (scale > 0) { RelDataType decimalType = getTypeFactory().createSqlType( SqlTypeName.DECIMAL, scale + exp.getType().getPrecision(), scale); value = encodeIntervalOrDecimal(value, decimalType, false); } return ensureType(toType, value, false); }
private RexNode makeCastIntervalToExact(RelDataType toType, RexNode exp) { final TimeUnit endUnit = exp.getType().getSqlTypeName().getEndUnit(); final TimeUnit baseUnit = baseUnit(exp.getType().getSqlTypeName()); final BigDecimal multiplier = baseUnit.multiplier; final int scale = 0; BigDecimal divider = endUnit.multiplier.scaleByPowerOfTen(-scale); RexNode value = multiplyDivide(decodeIntervalOrDecimal(exp), multiplier, divider); if (scale > 0) { RelDataType decimalType = getTypeFactory().createSqlType( SqlTypeName.DECIMAL, scale + exp.getType().getPrecision(), scale); value = encodeIntervalOrDecimal(value, decimalType, false); } return ensureType(toType, value, false); }
boolean nullable = isNullable || that.isNullable; TimeUnit thisStart = Objects.requireNonNull(typeName.getStartUnit()); TimeUnit thisEnd = typeName.getEndUnit(); final TimeUnit thatStart = Objects.requireNonNull(that.typeName.getStartUnit()); final TimeUnit thatEnd = that.typeName.getEndUnit();
boolean nullable = isNullable || that.isNullable; TimeUnit thisStart = Objects.requireNonNull(typeName.getStartUnit()); TimeUnit thisEnd = typeName.getEndUnit(); final TimeUnit thatStart = Objects.requireNonNull(that.typeName.getStartUnit()); final TimeUnit thatEnd = that.typeName.getEndUnit();
baseUnit(literal.getTypeName()).multiplier; final BigDecimal divider = literal.getTypeName().getEndUnit().multiplier; value = value2.multiply(multiplier) .divide(divider, 0, RoundingMode.HALF_DOWN);
baseUnit(literal.getTypeName()).multiplier; final BigDecimal divider = literal.getTypeName().getEndUnit().multiplier; value = value2.multiply(multiplier) .divide(divider, 0, RoundingMode.HALF_DOWN);
sourceExpression.getType().getSqlTypeName().getEndUnit().multiplier.intValue());
switch (sourceType.getSqlTypeName().getFamily()) { case NUMERIC: final BigDecimal multiplier = targetType.getSqlTypeName().getEndUnit().multiplier; final BigDecimal divider = BigDecimal.ONE; convert = RexImpTable.multiplyDivide(convert, multiplier, divider);
switch (sourceType.getSqlTypeName().getFamily()) { case NUMERIC: final BigDecimal multiplier = targetType.getSqlTypeName().getEndUnit().multiplier; final BigDecimal divider = BigDecimal.ONE; convert = RexImpTable.multiplyDivide(convert, multiplier, divider);