@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 testCharacterLength() { testExpression( rexBuilder.makeCall( SqlStdOperatorTable.CHARACTER_LENGTH, inputRef("s") ), DruidExpression.fromExpression("strlen(\"s\")"), 3L ); }
@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 testOtherTimeCeil() { // CEIL(__time TO unit) testExpression( rexBuilder.makeCall( SqlStdOperatorTable.CEIL, inputRef("t"), rexBuilder.makeFlag(TimeUnitRange.YEAR) ), DruidExpression.fromExpression("timestamp_ceil(\"t\",'P1Y',null,'UTC')"), DateTimes.of("2001").getMillis() ); }
@Test public void testFloor() { testExpression( rexBuilder.makeCall(SqlStdOperatorTable.FLOOR, inputRef("a")), DruidExpression.fromExpression("floor(\"a\")"), 10.0 ); testExpression( rexBuilder.makeCall(SqlStdOperatorTable.FLOOR, inputRef("x")), DruidExpression.fromExpression("floor(\"x\")"), 2.0 ); testExpression( rexBuilder.makeCall(SqlStdOperatorTable.FLOOR, inputRef("y")), DruidExpression.fromExpression("floor(\"y\")"), 3.0 ); testExpression( rexBuilder.makeCall(SqlStdOperatorTable.FLOOR, inputRef("z")), DruidExpression.fromExpression("floor(\"z\")"), -3.0 ); }
@Test public void testCeil() { testExpression( rexBuilder.makeCall(SqlStdOperatorTable.CEIL, inputRef("a")), DruidExpression.fromExpression("ceil(\"a\")"), 10.0 ); testExpression( rexBuilder.makeCall(SqlStdOperatorTable.CEIL, inputRef("x")), DruidExpression.fromExpression("ceil(\"x\")"), 3.0 ); testExpression( rexBuilder.makeCall(SqlStdOperatorTable.CEIL, inputRef("y")), DruidExpression.fromExpression("ceil(\"y\")"), 3.0 ); testExpression( rexBuilder.makeCall(SqlStdOperatorTable.CEIL, inputRef("z")), DruidExpression.fromExpression("ceil(\"z\")"), -2.0 ); }
@Test public void testOtherTimeFloor() { // FLOOR(__time TO unit) testExpression( rexBuilder.makeCall( SqlStdOperatorTable.FLOOR, inputRef("t"), rexBuilder.makeFlag(TimeUnitRange.YEAR) ), DruidExpression.fromExpression("timestamp_floor(\"t\",'P1Y',null,'UTC')"), DateTimes.of("2000").getMillis() ); }
@Test public void testPower() { testExpression( rexBuilder.makeCall(SqlStdOperatorTable.POWER, inputRef("a"), integerLiteral(2)), DruidExpression.fromExpression("pow(\"a\",2)"), 100.0 ); }
@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() ); }
@Test public void testConcat() { testExpression( rexBuilder.makeCall( typeFactory.createSqlType(SqlTypeName.VARCHAR), SqlStdOperatorTable.CONCAT, ImmutableList.of( inputRef("s"), rexBuilder.makeLiteral("bar") ) ), DruidExpression.fromExpression("concat(\"s\",'bar')"), "foobar" ); }
@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 testCastAsDate() { testExpression( rexBuilder.makeAbstractCast( typeFactory.createSqlType(SqlTypeName.DATE), inputRef("t") ), DruidExpression.fromExpression("timestamp_floor(\"t\",'P1D',null,'UTC')"), DateTimes.of("2000-02-03").getMillis() ); testExpression( rexBuilder.makeAbstractCast( typeFactory.createSqlType(SqlTypeName.DATE), inputRef("dstr") ), DruidExpression.fromExpression( "timestamp_floor(timestamp_parse(\"dstr\",null,'UTC'),'P1D',null,'UTC')" ), DateTimes.of("2000-02-03").getMillis() ); }
@Test public void testCastAsTimestamp() { testExpression( rexBuilder.makeAbstractCast( typeFactory.createSqlType(SqlTypeName.TIMESTAMP), inputRef("t") ), DruidExpression.of( SimpleExtraction.of("t", null), "\"t\"" ), DateTimes.of("2000-02-03T04:05:06Z").getMillis() ); testExpression( rexBuilder.makeAbstractCast( typeFactory.createSqlType(SqlTypeName.TIMESTAMP), inputRef("tstr") ), DruidExpression.of( null, "timestamp_parse(\"tstr\",null,'UTC')" ), DateTimes.of("2000-02-03T04:05:06Z").getMillis() ); }
@Test public void testExtract() { testExpression( rexBuilder.makeCall( SqlStdOperatorTable.EXTRACT, rexBuilder.makeFlag(TimeUnitRange.QUARTER), inputRef("t") ), DruidExpression.fromExpression("timestamp_extract(\"t\",'QUARTER','UTC')"), 1L ); testExpression( rexBuilder.makeCall( SqlStdOperatorTable.EXTRACT, rexBuilder.makeFlag(TimeUnitRange.DAY), inputRef("t") ), DruidExpression.fromExpression("timestamp_extract(\"t\",'DAY','UTC')"), 3L ); }
@Test public void testTimeShift() { testExpression( rexBuilder.makeCall( new TimeShiftOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("PT2H"), rexBuilder.makeLiteral(-3, typeFactory.createSqlType(SqlTypeName.INTEGER), true) ), DruidExpression.fromExpression("timestamp_shift(\"t\",'PT2H',-3)"), DateTimes.of("2000-02-02T22:05:06").getMillis() ); }
@Test public void testTimeParse() { testExpression( rexBuilder.makeCall( new TimeParseOperatorConversion().calciteOperator(), inputRef("tstr"), rexBuilder.makeLiteral("yyyy-MM-dd HH:mm:ss") ), DruidExpression.fromExpression("timestamp_parse(\"tstr\",'yyyy-MM-dd HH:mm:ss')"), DateTimes.of("2000-02-03T04:05:06").getMillis() ); testExpression( rexBuilder.makeCall( new TimeParseOperatorConversion().calciteOperator(), inputRef("tstr"), rexBuilder.makeLiteral("yyyy-MM-dd HH:mm:ss"), rexBuilder.makeLiteral("America/Los_Angeles") ), DruidExpression.fromExpression("timestamp_parse(\"tstr\",'yyyy-MM-dd HH:mm:ss','America/Los_Angeles')"), DateTimes.of("2000-02-03T04:05:06-08:00").getMillis() ); }
@Test public void testCastFromDate() { testExpression( rexBuilder.makeAbstractCast( typeFactory.createSqlType(SqlTypeName.VARCHAR), rexBuilder.makeAbstractCast( typeFactory.createSqlType(SqlTypeName.DATE), inputRef("t") ) ), DruidExpression.fromExpression( "timestamp_format(timestamp_floor(\"t\",'P1D',null,'UTC'),'yyyy-MM-dd','UTC')" ), "2000-02-03" ); testExpression( rexBuilder.makeAbstractCast( typeFactory.createSqlType(SqlTypeName.BIGINT), rexBuilder.makeAbstractCast( typeFactory.createSqlType(SqlTypeName.DATE), inputRef("t") ) ), DruidExpression.fromExpression("timestamp_floor(\"t\",'P1D',null,'UTC')"), DateTimes.of("2000-02-03").getMillis() ); }
@Test public void testTimeExtract() { testExpression( rexBuilder.makeCall( new TimeExtractOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("QUARTER") ), DruidExpression.fromExpression("timestamp_extract(\"t\",'QUARTER','UTC')"), 1L ); testExpression( rexBuilder.makeCall( new TimeExtractOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("DAY"), rexBuilder.makeLiteral("America/Los_Angeles") ), DruidExpression.fromExpression("timestamp_extract(\"t\",'DAY','America/Los_Angeles')"), 2L ); }
@Test public void testTimeFormat() { testExpression( rexBuilder.makeCall( new TimeFormatOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("yyyy-MM-dd HH:mm:ss") ), DruidExpression.fromExpression("timestamp_format(\"t\",'yyyy-MM-dd HH:mm:ss','UTC')"), "2000-02-03 04:05:06" ); testExpression( rexBuilder.makeCall( new TimeFormatOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("yyyy-MM-dd HH:mm:ss"), rexBuilder.makeLiteral("America/Los_Angeles") ), DruidExpression.fromExpression("timestamp_format(\"t\",'yyyy-MM-dd HH:mm:ss','America/Los_Angeles')"), "2000-02-02 20:05:06" ); }
@Test public void testTimeFloor() { testExpression( rexBuilder.makeCall( new TimeFloorOperatorConversion().calciteOperator(), timestampLiteral(DateTimes.of("2000-02-03T04:05:06Z")), rexBuilder.makeLiteral("PT1H") ), DruidExpression.fromExpression("timestamp_floor(949550706000,'PT1H',null,'UTC')"), DateTimes.of("2000-02-03T04:00:00").getMillis() ); testExpression( rexBuilder.makeCall( new TimeFloorOperatorConversion().calciteOperator(), inputRef("t"), rexBuilder.makeLiteral("P1D"), rexBuilder.makeNullLiteral(typeFactory.createSqlType(SqlTypeName.TIMESTAMP)), rexBuilder.makeLiteral("America/Los_Angeles") ), DruidExpression.fromExpression("timestamp_floor(\"t\",'P1D',null,'America/Los_Angeles')"), DateTimes.of("2000-02-02T08:00:00").getMillis() ); }