@Nullable public static DruidExpression convertCall( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode, final String functionName, final Function<List<DruidExpression>, SimpleExtraction> simpleExtractionFunction ) { return convertCall( plannerContext, rowSignature, rexNode, druidExpressions -> DruidExpression.of( simpleExtractionFunction == null ? null : simpleExtractionFunction.apply(druidExpressions), DruidExpression.functionCall(functionName, druidExpressions) ) ); }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, druidExpressions -> DruidExpression.of( null, DruidExpression.functionCall("concat", druidExpressions) ) ); } }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, druidExpressions -> DruidExpression.of( null, DruidExpression.functionCall("concat", druidExpressions) ) ); } }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, druidExpressions -> DruidExpression.of( null, StringUtils.format( "(%s + 1)", DruidExpression.functionCall("strpos", druidExpressions) ) ) ); } }
@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() ); }
@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 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" ); }
DruidExpression.of( SimpleExtraction.of("t", null), "\"t\""
@Nullable public static DruidExpression convertCall( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode, final String functionName, final Function<List<DruidExpression>, SimpleExtraction> simpleExtractionFunction ) { return convertCall( plannerContext, rowSignature, rexNode, druidExpressions -> DruidExpression.of( simpleExtractionFunction == null ? null : simpleExtractionFunction.apply(druidExpressions), DruidExpression.functionCall(functionName, druidExpressions) ) ); }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, druidExpressions -> DruidExpression.of( null, DruidExpression.functionCall("concat", druidExpressions) ) ); } }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, druidExpressions -> DruidExpression.of( null, DruidExpression.functionCall("concat", druidExpressions) ) ); } }
@Override public DruidExpression toDruidExpression( final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode ) { return OperatorConversions.convertCall( plannerContext, rowSignature, rexNode, druidExpressions -> DruidExpression.of( null, StringUtils.format( "(%s + 1)", DruidExpression.functionCall("strpos", druidExpressions) ) ) ); } }