@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, operands -> DruidExpression.fromExpression(DruidExpression.functionCall(druidFunctionName, operands)) ); } }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, operands -> { if (operands.size() < 2) { throw new ISE("WTF?! Got binary operator[%s] with %s args?", operator.getName(), operands.size()); } return DruidExpression.fromExpression( StringUtils.format( "(%s)", joiner.join( operands.stream() .map(DruidExpression::getExpression) .collect(Collectors.toList()) ) ) ); } ); } }
public static DruidExpression applyTimeExtract( final DruidExpression timeExpression, final TimestampExtractExprMacro.Unit unit, final DateTimeZone timeZone ) { return DruidExpression.fromFunctionCall( "timestamp_extract", ImmutableList.of( timeExpression, DruidExpression.fromExpression(DruidExpression.stringLiteral(unit.name())), DruidExpression.fromExpression(DruidExpression.stringLiteral(timeZone.getID())) ) ); }
private static DruidExpression castDateTimeToChar( final PlannerContext plannerContext, final DruidExpression operand, final SqlTypeName fromType ) { return DruidExpression.fromFunctionCall( "timestamp_format", ImmutableList.of( operand, DruidExpression.fromExpression(DruidExpression.stringLiteral(dateTimeFormatString(fromType))), DruidExpression.fromExpression(DruidExpression.stringLiteral(plannerContext.getTimeZone().getID())) ) ); }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, operands -> DruidExpression.fromExpression( StringUtils.format( "%s(%s)", druidOperator, Iterables.getOnlyElement(operands).getExpression() ) ) ); } }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, operands -> DruidExpression.fromExpression( StringUtils.format( "(%s %s)", Iterables.getOnlyElement(operands).getExpression(), druidOperator ) ) ); } }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, operands -> DruidExpression.fromExpression( StringUtils.format( "(%s %s)", druidOperator, Iterables.getOnlyElement(operands).getExpression() ) ) ); } }
@Test public void testCharacterLength() { testExpression( rexBuilder.makeCall( SqlStdOperatorTable.CHARACTER_LENGTH, inputRef("s") ), DruidExpression.fromExpression("strlen(\"s\")"), 3L ); }
@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 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 testPower() { testExpression( rexBuilder.makeCall(SqlStdOperatorTable.POWER, inputRef("a"), integerLiteral(2)), DruidExpression.fromExpression("pow(\"a\",2)"), 100.0 ); }
@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 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 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 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" ); }