@Test public void testTimePlusDayTimeInterval() { final Period period = new Period("P1DT1H1M"); testExpression( rexBuilder.makeCall( SqlStdOperatorTable.DATETIME_PLUS, inputRef("t"), rexBuilder.makeIntervalLiteral( new BigDecimal(period.toStandardDuration().getMillis()), // DAY-TIME literals value is millis new SqlIntervalQualifier(TimeUnit.DAY, TimeUnit.MINUTE, SqlParserPos.ZERO) ) ), DruidExpression.of( null, "(\"t\" + 90060000)" ), DateTimes.of("2000-02-03T04:05:06").plus(period).getMillis() ); }
@Test public void testTimePlusYearMonthInterval() { final Period period = new Period("P1Y1M"); testExpression( rexBuilder.makeCall( SqlStdOperatorTable.DATETIME_PLUS, inputRef("t"), rexBuilder.makeIntervalLiteral( new BigDecimal(13), // YEAR-MONTH literals value is months new SqlIntervalQualifier(TimeUnit.YEAR, TimeUnit.MONTH, SqlParserPos.ZERO) ) ), DruidExpression.of( null, "timestamp_shift(\"t\",concat('P', 13, 'M'),1)" ), DateTimes.of("2000-02-03T04:05:06").plus(period).getMillis() ); }
@Test public void testTimeMinusYearMonthInterval() { final Period period = new Period("P1Y1M"); testExpression( rexBuilder.makeCall( typeFactory.createSqlType(SqlTypeName.TIMESTAMP), SqlStdOperatorTable.MINUS_DATE, ImmutableList.of( inputRef("t"), rexBuilder.makeIntervalLiteral( new BigDecimal(13), // YEAR-MONTH literals value is months new SqlIntervalQualifier(TimeUnit.YEAR, TimeUnit.MONTH, SqlParserPos.ZERO) ) ) ), DruidExpression.of( null, "timestamp_shift(\"t\",concat('P', 13, 'M'),-1)" ), DateTimes.of("2000-02-03T04:05:06").minus(period).getMillis() ); }
@Test public void testTimeMinusDayTimeInterval() { final Period period = new Period("P1DT1H1M"); testExpression( rexBuilder.makeCall( typeFactory.createSqlType(SqlTypeName.TIMESTAMP), SqlStdOperatorTable.MINUS_DATE, ImmutableList.of( inputRef("t"), rexBuilder.makeIntervalLiteral( new BigDecimal(period.toStandardDuration().getMillis()), // DAY-TIME literals value is millis new SqlIntervalQualifier(TimeUnit.DAY, TimeUnit.MINUTE, SqlParserPos.ZERO) ) ) ), DruidExpression.of( null, "(\"t\" - 90060000)" ), DateTimes.of("2000-02-03T04:05:06").minus(period).getMillis() ); }
calciteLiteral = rexBuilder.makeIntervalLiteral(totalMonths, new SqlIntervalQualifier(TimeUnit.YEAR, TimeUnit.MONTH, new SqlParserPos(1,1))); break; value).getNanos(), 6); calciteLiteral = rexBuilder.makeIntervalLiteral(secsValueBd.add(nanosValueBd), new SqlIntervalQualifier(TimeUnit.MILLISECOND, null, new SqlParserPos(1, 1)));
calciteLiteral = rexBuilder.makeIntervalLiteral(totalMonths, new SqlIntervalQualifier(TimeUnit.YEAR, TimeUnit.MONTH, new SqlParserPos(1,1))); break; value).getNanos(), 6); calciteLiteral = rexBuilder.makeIntervalLiteral(secsValueBd.add(nanosValueBd), new SqlIntervalQualifier(TimeUnit.MILLISECOND, null, new SqlParserPos(1, 1)));
public RexLiteral convertInterval( SqlRexContext cx, SqlIntervalQualifier intervalQualifier) { RexBuilder rexBuilder = cx.getRexBuilder(); return rexBuilder.makeIntervalLiteral(intervalQualifier); }
public RexLiteral convertInterval( SqlRexContext cx, SqlIntervalQualifier intervalQualifier) { RexBuilder rexBuilder = cx.getRexBuilder(); return rexBuilder.makeIntervalLiteral(intervalQualifier); }
public RexNode convertCall(SqlRexContext cx, SqlCall call) { // TIMESTAMPADD(unit, count, timestamp) // => timestamp + count * INTERVAL '1' UNIT final RexBuilder rexBuilder = cx.getRexBuilder(); final SqlLiteral unitLiteral = call.operand(0); final TimeUnit unit = unitLiteral.symbolValue(TimeUnit.class); RexNode interval2Add; SqlIntervalQualifier qualifier = new SqlIntervalQualifier(unit, null, unitLiteral.getParserPosition()); RexNode op1 = cx.convertExpression(call.operand(1)); switch (unit) { case MICROSECOND: case NANOSECOND: interval2Add = divide(rexBuilder, multiply(rexBuilder, rexBuilder.makeIntervalLiteral(BigDecimal.ONE, qualifier), op1), BigDecimal.ONE.divide(unit.multiplier, RoundingMode.UNNECESSARY)); break; default: interval2Add = multiply(rexBuilder, rexBuilder.makeIntervalLiteral(unit.multiplier, qualifier), op1); } return rexBuilder.makeCall(SqlStdOperatorTable.DATETIME_PLUS, cx.convertExpression(call.operand(2)), interval2Add); } }
public RexNode convertCall(SqlRexContext cx, SqlCall call) { // TIMESTAMPADD(unit, count, timestamp) // => timestamp + count * INTERVAL '1' UNIT final RexBuilder rexBuilder = cx.getRexBuilder(); final SqlLiteral unitLiteral = call.operand(0); final TimeUnit unit = unitLiteral.symbolValue(TimeUnit.class); RexNode interval2Add; SqlIntervalQualifier qualifier = new SqlIntervalQualifier(unit, null, unitLiteral.getParserPosition()); RexNode op1 = cx.convertExpression(call.operand(1)); switch (unit) { case MICROSECOND: case NANOSECOND: interval2Add = divide(rexBuilder, multiply(rexBuilder, rexBuilder.makeIntervalLiteral(BigDecimal.ONE, qualifier), op1), BigDecimal.ONE.divide(unit.multiplier, RoundingMode.UNNECESSARY)); break; default: interval2Add = multiply(rexBuilder, rexBuilder.makeIntervalLiteral(unit.multiplier, qualifier), op1); } return rexBuilder.makeCall(SqlStdOperatorTable.DATETIME_PLUS, cx.convertExpression(call.operand(2)), interval2Add); } }
calciteLiteral = rexBuilder.makeIntervalLiteral(totalMonths, new SqlIntervalQualifier(TimeUnit.YEAR, TimeUnit.MONTH, new SqlParserPos(1,1))); break; calciteLiteral = rexBuilder.makeIntervalLiteral(secsValueBd.add(nanosValueBd), new SqlIntervalQualifier(TimeUnit.DAY, TimeUnit.SECOND, new SqlParserPos(1,1))); break;
@Override public RexNode convertCall(SqlRexContext cx, SqlCall call) { // TIMESTAMPADD(unit, count, timestamp) // => timestamp + count * INTERVAL '1' UNIT final RexBuilder rexBuilder = cx.getRexBuilder(); final SqlLiteral unitLiteral = call.operand(0); final TimeUnit unit = unitLiteral.symbolValue(TimeUnit.class); switch (unit) { // TODO(DX-11268): Support sub-second intervals with TIMESTAMPADD. case MILLISECOND: case MICROSECOND: throw UserException.unsupportedError() .message("TIMESTAMPADD function supports the following time units: YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND") .build(); } final RexNode timestampNode = cx.convertExpression(call.operand(2)); final RexNode multiplyNode = rexBuilder.makeCall(SqlStdOperatorTable.MULTIPLY, rexBuilder.makeIntervalLiteral(unit.multiplier, new SqlIntervalQualifier(unit, null, unitLiteral.getParserPosition())), cx.convertExpression(call.operand(1))); return rexBuilder.makeCall(SqlStdOperatorTable.DATETIME_PLUS, timestampNode, multiplyNode); } });
case INTERVAL_MINUTE_SECOND: case INTERVAL_SECOND: return makeIntervalLiteral((BigDecimal) value, type.getIntervalQualifier()); case MAP:
case INTERVAL_MINUTE_SECOND: case INTERVAL_SECOND: return makeIntervalLiteral((BigDecimal) value, type.getIntervalQualifier()); case MAP:
(BigDecimal) sourceInterval.getValue(); RexLiteral castedInterval = cx.getRexBuilder().makeIntervalLiteral(sourceValue, intervalQualifier); return castToValidatedType(cx, call, castedInterval); sourceValue = sourceValue.multiply(multiplier); RexLiteral castedInterval = cx.getRexBuilder().makeIntervalLiteral( sourceValue, intervalQualifier);
(BigDecimal) sourceInterval.getValue(); RexLiteral castedInterval = cx.getRexBuilder().makeIntervalLiteral(sourceValue, intervalQualifier); return castToValidatedType(cx, call, castedInterval); sourceValue = sourceValue.multiply(multiplier); RexLiteral castedInterval = cx.getRexBuilder().makeIntervalLiteral( sourceValue, intervalQualifier);
literal.getValueAs(SqlIntervalLiteral.IntervalValue.class) .getIntervalQualifier(); return rexBuilder.makeIntervalLiteral( literal.getValueAs(BigDecimal.class), sqlIntervalQualifier);
literal.getValueAs(SqlIntervalLiteral.IntervalValue.class) .getIntervalQualifier(); return rexBuilder.makeIntervalLiteral( literal.getValueAs(BigDecimal.class), sqlIntervalQualifier);