/** Multiplies an expression by a constant and divides by another constant, * optimizing appropriately. * * <p>For example, {@code multiplyDivide(e, 10, 1000)} returns * {@code e / 100}. */ public static Expression multiplyDivide(Expression e, BigDecimal multiplier, BigDecimal divider) { if (multiplier.equals(BigDecimal.ONE)) { if (divider.equals(BigDecimal.ONE)) { return e; } return Expressions.divide(e, Expressions.constant(divider.intValueExact())); } final BigDecimal x = multiplier.divide(divider, RoundingMode.UNNECESSARY); switch (x.compareTo(BigDecimal.ONE)) { case 0: return e; case 1: return Expressions.multiply(e, Expressions.constant(x.intValueExact())); case -1: return multiplyDivide(e, BigDecimal.ONE, x); default: throw new AssertionError(); } }
/** Multiplies an expression by a constant and divides by another constant, * optimizing appropriately. * * <p>For example, {@code multiplyDivide(e, 10, 1000)} returns * {@code e / 100}. */ public static Expression multiplyDivide(Expression e, BigDecimal multiplier, BigDecimal divider) { if (multiplier.equals(BigDecimal.ONE)) { if (divider.equals(BigDecimal.ONE)) { return e; } return Expressions.divide(e, Expressions.constant(divider.intValueExact())); } final BigDecimal x = multiplier.divide(divider, RoundingMode.UNNECESSARY); switch (x.compareTo(BigDecimal.ONE)) { case 0: return e; case 1: return Expressions.multiply(e, Expressions.constant(x.intValueExact())); case -1: return multiplyDivide(e, BigDecimal.ONE, x); default: throw new AssertionError(); } }
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; }
typeName1 == SqlTypeName.DATE ? TimeUnit.DAY : TimeUnit.MILLISECOND; TimeUnit toUnit = TimeUnit.MILLISECOND; return multiplyDivide( Expressions.convert_(Expressions.subtract(trop0, trop1), (Class) long.class),
typeName1 == SqlTypeName.DATE ? TimeUnit.DAY : TimeUnit.MILLISECOND; TimeUnit toUnit = TimeUnit.MILLISECOND; return multiplyDivide( Expressions.convert_(Expressions.subtract(trop0, trop1), (Class) long.class),
final BigDecimal multiplier = targetType.getSqlTypeName().getEndUnit().multiplier; final BigDecimal divider = BigDecimal.ONE; convert = RexImpTable.multiplyDivide(convert, multiplier, divider);
final BigDecimal multiplier = targetType.getSqlTypeName().getEndUnit().multiplier; final BigDecimal divider = BigDecimal.ONE; convert = RexImpTable.multiplyDivide(convert, multiplier, divider);