@Test public void testCharacterLength() { testExpression( rexBuilder.makeCall( SqlStdOperatorTable.CHARACTER_LENGTH, inputRef("s") ), DruidExpression.fromExpression("strlen(\"s\")"), 3L ); }
@Test public void testPower() { testExpression( rexBuilder.makeCall(SqlStdOperatorTable.POWER, inputRef("a"), integerLiteral(2)), DruidExpression.fromExpression("pow(\"a\",2)"), 100.0 ); }
@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() ); }
@Test public void testDateTrunc() { testExpression( rexBuilder.makeCall( new DateTruncOperatorConversion().calciteOperator(), rexBuilder.makeLiteral("hour"), timestampLiteral(DateTimes.of("2000-02-03T04:05:06Z")) ), DruidExpression.fromExpression("timestamp_floor(949550706000,'PT1H',null,'UTC')"), DateTimes.of("2000-02-03T04:00:00").getMillis() ); testExpression( rexBuilder.makeCall( new DateTruncOperatorConversion().calciteOperator(), rexBuilder.makeLiteral("DAY"), timestampLiteral(DateTimes.of("2000-02-03T04:05:06Z")) ), DruidExpression.fromExpression("timestamp_floor(949550706000,'P1D',null,'UTC')"), DateTimes.of("2000-02-03T00:00:00").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 ); }
testExpression( rexBuilder.makeCall(truncateFunction, inputRef("a")), DruidExpression.fromExpression("(cast(cast(\"a\" * 1,'long'),'double') / 1)"), 10.0 ); testExpression( rexBuilder.makeCall(truncateFunction, inputRef("x")), DruidExpression.fromExpression("(cast(cast(\"x\" * 1,'long'),'double') / 1)"), 2.0 ); testExpression( rexBuilder.makeCall(truncateFunction, inputRef("y")), DruidExpression.fromExpression("(cast(cast(\"y\" * 1,'long'),'double') / 1)"), 3.0 ); testExpression( rexBuilder.makeCall(truncateFunction, inputRef("z")), DruidExpression.fromExpression("(cast(cast(\"z\" * 1,'long'),'double') / 1)"), -2.0 ); testExpression( rexBuilder.makeCall(truncateFunction, inputRef("x"), integerLiteral(1)), DruidExpression.fromExpression("(cast(cast(\"x\" * 10.0,'long'),'double') / 10.0)"), 2.2 );
@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 testRegexpExtract() { testExpression( rexBuilder.makeCall( new RegexpExtractOperatorConversion().calciteOperator(), inputRef("s"), rexBuilder.makeLiteral("f(.)"), integerLiteral(1) ), DruidExpression.of( SimpleExtraction.of("s", new RegexDimExtractionFn("f(.)", 1, true, null)), "regexp_extract(\"s\",'f(.)',1)" ), "o" ); testExpression( rexBuilder.makeCall( new RegexpExtractOperatorConversion().calciteOperator(), inputRef("s"), rexBuilder.makeLiteral("f(.)") ), DruidExpression.of( SimpleExtraction.of("s", new RegexDimExtractionFn("f(.)", 0, true, null)), "regexp_extract(\"s\",'f(.)')" ), "fo" ); }
@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 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 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 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 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 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 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() ); }
testExpression( rexBuilder.makeCall( SqlStdOperatorTable.POSITION, rexBuilder.makeLiteral("oo"), inputRef("s") ), DruidExpression.fromExpression("(strpos(\"s\",'oo',0) + 1)"), ); testExpression( rexBuilder.makeCall( SqlStdOperatorTable.POSITION, rexBuilder.makeLiteral("oo"), inputRef("s"), rexBuilder.makeExactLiteral(BigDecimal.valueOf(2)) ), ); testExpression( rexBuilder.makeCall( SqlStdOperatorTable.POSITION, rexBuilder.makeLiteral("oo"), inputRef("s"), rexBuilder.makeExactLiteral(BigDecimal.valueOf(3)) ),
@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 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 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() ); }
testExpression( rexBuilder.makeCall( SqlStdOperatorTable.TRIM, rexBuilder.makeFlag(SqlTrimFunction.Flag.BOTH), rexBuilder.makeLiteral(" "), inputRef("spacey") ), DruidExpression.fromExpression("trim(\"spacey\",' ')"), ); testExpression( rexBuilder.makeCall( SqlStdOperatorTable.TRIM, rexBuilder.makeFlag(SqlTrimFunction.Flag.LEADING), rexBuilder.makeLiteral(" h"), inputRef("spacey") ), DruidExpression.fromExpression("ltrim(\"spacey\",' h')"), testExpression( rexBuilder.makeCall( SqlStdOperatorTable.TRIM, rexBuilder.makeFlag(SqlTrimFunction.Flag.TRAILING), rexBuilder.makeLiteral(" e"), inputRef("spacey") ), DruidExpression.fromExpression("rtrim(\"spacey\",' e')"),