@Nullable @Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery query ) { final RexCall call = (RexCall) rexNode; if (call.getOperands().size() != 1) { throw new IllegalStateException("to_date() requires 1 argument, got " + call.getOperands().size()); } final String arg = DruidExpressions.toDruidExpression(call.getOperands().get(0), rowType, query); if (arg == null) { return null; } return DruidExpressions.applyTimestampFloor( arg, Period.days(1).toString(), "", timezoneId(query, call.getOperands().get(0))); } }
@Nullable @Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery query ) { final RexCall call = (RexCall) rexNode; final String arg0 = DruidExpressions.toDruidExpression(call.getOperands().get(0), rowType, query); if (arg0 == null) { return null; } if (SqlTypeUtil.isDatetime((call.getOperands().get(0).getType()))) { // Timestamp is represented as long internally no need to any thing here return DruidExpressions.functionCall("div", ImmutableList.of(arg0, DruidExpressions.numberLiteral(1000))); } // dealing with String type final String format = call.getOperands().size() == 2 ? DruidExpressions .toDruidExpression(call.getOperands().get(1), rowType, query) : DEFAULT_TS_FORMAT; return DruidExpressions .functionCall("unix_timestamp", ImmutableList.of(arg0, DruidExpressions.stringLiteral(format))); } }
@Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery druidQuery) { final RexCall call = (RexCall) rexNode; final List<String> druidExpressions = DruidExpressions.toDruidExpressions( druidQuery, rowType, call.getOperands()); if (druidExpressions == null) { return null; } return DruidQuery.format("%s(%s)", druidOperator, Iterables.getOnlyElement(druidExpressions)); } }
private static String applyTimestampFormat(String arg, String format, TimeZone timeZone) { return DruidExpressions.functionCall("timestamp_format", ImmutableList.of(arg, DruidExpressions.stringLiteral(format), DruidExpressions.stringLiteral(timeZone.getID())) ); }
@Nullable @Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery query ) { final RexCall call = (RexCall) rexNode; if (call.getOperands().size() < 1 || call.getOperands().size() > 2) { throw new IllegalStateException("form_unixtime() requires 1 or 2 argument, got " + call.getOperands().size()); } final String arg = DruidExpressions.toDruidExpression(call.getOperands().get(0), rowType, query); if (arg == null) { return null; } final String numMillis = DruidQuery.format("(%s * '1000')", arg); final String format = call.getOperands().size() == 1 ? DruidExpressions.stringLiteral(DEFAULT_TS_FORMAT) : DruidExpressions .toDruidExpression(call.getOperands().get(1), rowType, query); return DruidExpressions.functionCall("timestamp_format", ImmutableList.of(numMillis, format, DruidExpressions.stringLiteral(TimeZone.getTimeZone("UTC").getID())) ); } }
private static String castCharToDateTime( TimeZone timeZone, String operand, final SqlTypeName toType, String format) { // Cast strings to date times by parsing them from SQL format. final String timestampExpression = DruidExpressions.functionCall( "timestamp_parse", ImmutableList.of( operand, DruidExpressions.stringLiteral(format), DruidExpressions.stringLiteral(timeZone.getID()))); if (toType == SqlTypeName.DATE) { // case to date we need to floor to day first return DruidExpressions.applyTimestampFloor( timestampExpression, Period.days(1).toString(), "", timeZone); } else if (toType == SqlTypeName.TIMESTAMP || toType == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE) { return timestampExpression; } else { throw new IllegalStateException( DruidQuery.format("Unsupported DateTime type[%s]", toType)); } }
@Nullable @Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery query ) { final RexCall call = (RexCall) rexNode; final String arg = DruidExpressions.toDruidExpression(call.getOperands().get(0), rowType, query); if (arg == null) { return null; final String indexExp = DruidExpressions.toDruidExpression(call.getOperands().get(1), rowType, query); if (indexExp == null) { return null; } else { final int index = RexLiteral.intValue(call.getOperands().get(1)) - 1; indexStart = DruidExpressions.numberLiteral(index); length = DruidExpressions.toDruidExpression(call.getOperands().get(2), rowType, query); if (length == null) { return null; length = DruidExpressions.numberLiteral(RexLiteral.intValue(call.getOperands().get(2))); length = DruidExpressions.numberLiteral(-1);
return DruidExpressions.fromColumn(DruidTable.DEFAULT_TIMESTAMP_COLUMN); return DruidExpressions.fromColumn(columnName); return DruidExpressions.numberLiteral((Number) RexLiteral .value(rexNode)); } else if (SqlTypeFamily.INTERVAL_DAY_TIME == sqlTypeName.getFamily()) { return DruidExpressions.numberLiteral(milliseconds); } else if (SqlTypeFamily.INTERVAL_YEAR_MONTH == sqlTypeName.getFamily()) { return DruidExpressions.numberLiteral(months); } else if (SqlTypeName.STRING_TYPES.contains(sqlTypeName)) { return DruidExpressions.stringLiteral(RexLiteral.stringValue(rexNode)); } else if (SqlTypeName.DATE == sqlTypeName || SqlTypeName.TIMESTAMP == sqlTypeName || SqlTypeName.TIME_WITH_LOCAL_TIME_ZONE == sqlTypeName) { return DruidExpressions.numberLiteral( DruidDateTimeUtils.literalValue(rexNode)); } else if (SqlTypeName.BOOLEAN == sqlTypeName) { return DruidExpressions.numberLiteral(RexLiteral.booleanValue(rexNode) ? 1 : 0);
@Nullable private static DruidJsonFilter toDruidExpressionFilter(RexNode rexNode, RelDataType rowType, DruidQuery query) { final String expression = DruidExpressions.toDruidExpression(rexNode, rowType, query); return expression == null ? null : new JsonExpressionFilter(expression); }
@Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery druidQuery) { final RexCall call = (RexCall) rexNode; final List<String> druidExpressions = DruidExpressions.toDruidExpressions( druidQuery, rowType, call.getOperands()); if (druidExpressions == null) { return null; } return DruidExpressions.functionCall(druidFunctionName, druidExpressions); } }
@Nullable @Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery druidQuery) { final RexCall call = (RexCall) rexNode; final List<String> druidExpressions = DruidExpressions.toDruidExpressions( druidQuery, rowType, call.getOperands()); if (druidExpressions == null) { return null; } return DruidExpressions.nAryOperatorCall(druidOperatorName, druidExpressions); } }
@Override public String toDruidExpression( RexNode rexNode, RelDataType rowType, DruidQuery query) { final RexCall call = (RexCall) rexNode; final RexLiteral flag = (RexLiteral) call.getOperands().get(0); final TimeUnitRange calciteUnit = (TimeUnitRange) flag.getValue(); final RexNode arg = call.getOperands().get(1); final String input = DruidExpressions.toDruidExpression(arg, rowType, query); if (input == null) { return null; } final String druidUnit = EXTRACT_UNIT_MAP.get(calciteUnit); if (druidUnit == null) { return null; } final TimeZone tz = arg.getType().getSqlTypeName() == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE ? TimeZone.getTimeZone(query.getConnectionConfig().timeZone()) : DateTimeUtils.UTC_ZONE; return DruidExpressions.applyTimeExtract(input, druidUnit, tz); } }
.toDruidExpression(project, inputRowType, druidQuery); if (expression == null) { return null; virtualColumnsBuilder.add(VirtualColumn.builder() .withName(virColName) .withExpression(DruidExpressions.fromColumn(druidColumn.left)).withType( DruidExpressions.EXPRESSION_TYPES.get(project.getType().getSqlTypeName())) .build());
final RexCall call = (RexCall) rexNode; final RexNode arg = call.getOperands().get(0); final String druidExpression = DruidExpressions.toDruidExpression( arg, rowType, tz = DateTimeUtils.UTC_ZONE; return DruidExpressions.applyTimestampCeil( druidExpression, isoPeriodFormat, "", tz); } else {
public static String stringLiteral(final String s) { return s == null ? nullLiteral() : "'" + escape(s) + "'"; }
public static String applyTimeExtract(String timeExpression, String druidUnit, TimeZone timeZone) { return DruidExpressions.functionCall( "timestamp_extract", ImmutableList.of( timeExpression, DruidExpressions.stringLiteral(druidUnit), DruidExpressions.stringLiteral(timeZone.getID()))); } }
@Nullable @Override public String toDruidExpression(RexNode rexNode, RelDataType rowType, DruidQuery query ) { final RexCall call = (RexCall) rexNode; if (call.getOperands().size() != 2) { throw new IllegalStateException("date_add/date_sub() requires 2 arguments, got " + call.getOperands().size()); } final String arg0 = DruidExpressions.toDruidExpression(call.getOperands().get(0), rowType, query); final String arg1 = DruidExpressions.toDruidExpression(call.getOperands().get(1), rowType, query); if (arg0 == null || arg1 == null) { return null; } final String steps = direction == -1 ? DruidQuery.format("-( %s )", arg1) : arg1; return DruidExpressions.functionCall( "timestamp_shift", ImmutableList.of( arg0, DruidExpressions.stringLiteral("P1D"), steps, DruidExpressions.stringLiteral(timezoneId(query, call.getOperands().get(0)).getID()))); } }
DruidQuery query) { final RexCall call = (RexCall) rexNode; final String arg = DruidExpressions.toDruidExpression( call.getOperands().get(0), rowType, query); if (arg == null) { final String arg1 = DruidExpressions.toDruidExpression( call.getOperands().get(1), rowType, query); if (arg1 == null) { startIndex = DruidExpressions.numberLiteral( RexLiteral.intValue(call.getOperands().get(1)) - 1); length = DruidExpressions.toDruidExpression( call.getOperands().get(2), rowType, query); if (length == null) { length = DruidExpressions.numberLiteral(RexLiteral.intValue(call.getOperands().get(2))); length = DruidExpressions.numberLiteral(-1);
/** * Translate a list of Calcite {@code RexNode} to Druid expressions. * * @param rexNodes list of Calcite expressions meant to be applied on top of the rows * * @return list of Druid expressions in the same order as rexNodes, or null if not possible. * If a non-null list is returned, all elements will be non-null. */ @Nullable public static List<String> toDruidExpressions( final DruidQuery druidRel, final RelDataType rowType, final List<RexNode> rexNodes) { final List<String> retVal = new ArrayList<>(rexNodes.size()); for (RexNode rexNode : rexNodes) { final String druidExpression = toDruidExpression(rexNode, rowType, druidRel); if (druidExpression == null) { return null; } retVal.add(druidExpression); } return retVal; }
public static String applyTimestampCeil( final String input, final String granularity, final String origin, final TimeZone timeZone) { Objects.requireNonNull(input, "input"); Objects.requireNonNull(granularity, "granularity"); return DruidExpressions.functionCall( "timestamp_ceil", ImmutableList.of(input, DruidExpressions.stringLiteral(granularity), DruidExpressions.stringLiteral(origin), DruidExpressions.stringLiteral(timeZone.getID()))); }