/** * utility function to extract timezone id from Druid query * @param query Druid Rel * @return time zone */ private static TimeZone timezoneId(final DruidQuery query, final RexNode arg) { return arg.getType().getSqlTypeName() == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE ? TimeZone.getTimeZone( query.getTopNode().getCluster().getPlanner().getContext().unwrap(CalciteConnectionConfig.class).timeZone()) : TimeZone.getTimeZone("UTC"); }
@Before public void testSetup() { druidQuery = Mockito.mock(DruidQuery.class); final CalciteConnectionConfig connectionConfigMock = Mockito .mock(CalciteConnectionConfig.class); Mockito.when(connectionConfigMock.timeZone()).thenReturn("UTC"); Mockito.when(druidQuery.getConnectionConfig()).thenReturn(connectionConfigMock); Mockito.when(druidQuery.getDruidTable()) .thenReturn( new DruidTable(Mockito.mock(DruidSchema.class), "dataSource", null, ImmutableSet.of(), "timestamp", null, null, null)); } @Test public void testInFilter() throws IOException {
@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); } }
tz = TimeZone.getTimeZone(druidQuery.getConnectionConfig().timeZone()); } else { tz = DateTimeUtils.UTC_ZONE;
tz = TimeZone.getTimeZone(query.getConnectionConfig().timeZone()); } else { tz = DateTimeUtils.UTC_ZONE;
EXTRACT_COLUMN_NAME_PREFIX + "_" + Objects .requireNonNull(DruidDateTimeUtils .extractGranularity(project, druidQuery.getConnectionConfig().timeZone()) .getType().lowerName); } else if (project.getKind() == SqlKind.FLOOR) { FLOOR_COLUMN_NAME_PREFIX + "_" + Objects .requireNonNull(DruidDateTimeUtils .extractGranularity(project, druidQuery.getConnectionConfig().timeZone()) .getType().lowerName); } else {
final String timeZoneConf = druidQuery.getConnectionConfig().timeZone(); final TimeZone timeZone = TimeZone.getTimeZone(timeZoneConf == null ? "UTC" : timeZoneConf); final boolean nullEqualToEmpty = druidQuery.getConnectionConfig().nullEqualToEmpty(); Period.days(1).toString(), "", TimeZone.getTimeZone(druidQuery.getConnectionConfig().timeZone())); } else { return typeCastExpression;
final CalciteConnectionConfig config = getConnectionConfig(); QueryType queryType = QueryType.SCAN; final Translator translator = new Translator(druidTable, rowType, config.timeZone()); List<String> fieldNames = rowType.getFieldNames(); Set<String> usedFieldNames = Sets.newHashSet(fieldNames); usedFieldNames, SqlValidatorUtil.EXPR_SUGGESTER); timeExtractionDimensionSpec = TimeExtractionDimensionSpec.makeFullTimeExtract( extractColumnName, config.timeZone()); dimensions.add(timeExtractionDimensionSpec); builder.add(extractColumnName); DruidDateTimeUtils.extractGranularity(call, config.timeZone()); if (funcGranularity != null) { final String extractColumnName; SqlValidatorUtil.EXPR_SUGGESTER); timeExtractionDimensionSpec = TimeExtractionDimensionSpec.makeTimeExtract( funcGranularity, extractColumnName, config.timeZone()); dimensions.add(timeExtractionDimensionSpec); builder.add(extractColumnName); dimensions.add( TimeExtractionDimensionSpec.makeTimeFloor(funcGranularity, extractColumnName, config.timeZone())); finalGranularity = Granularities.all(); builder.add(extractColumnName); usedFieldNames, SqlValidatorUtil.EXPR_SUGGESTER);
RexCall call = (RexCall) node; final String timeZone = query.getCluster().getPlanner().getContext() .unwrap(CalciteConnectionConfig.class).timeZone(); assert timeZone != null; assert DruidDateTimeUtils.extractGranularity(call, timeZone) != null;
.unwrap(CalciteConnectionConfig.class).timeZone(); assert timeZone != null; if (DruidDateTimeUtils.extractGranularity(call, timeZone) == null) {
RexCall call = (RexCall) node; final String timeZone = query.getCluster().getPlanner().getContext() .unwrap(CalciteConnectionConfig.class).timeZone(); assert timeZone != null; assert DruidDateTimeUtils.extractGranularity(call, timeZone) != null;
if (!triple.getLeft().isEmpty()) { final String timeZone = cluster.getPlanner().getContext() .unwrap(CalciteConnectionConfig.class).timeZone(); assert timeZone != null; intervals = DruidDateTimeUtils.createInterval(
if (!triple.getLeft().isEmpty()) { final String timeZone = cluster.getPlanner().getContext() .unwrap(CalciteConnectionConfig.class).timeZone(); assert timeZone != null; intervals = DruidDateTimeUtils.createInterval(
case EXTRACT: granularity = DruidDateTimeUtils .extractGranularity(rexNode, druidQuery.getConnectionConfig().timeZone()); if (granularity == null) { granularity, druidQuery.getConnectionConfig().timeZone()); columnName = extractColumnName(extractValueNode, rowType, druidQuery); } else { case FLOOR: granularity = DruidDateTimeUtils .extractGranularity(rexNode, druidQuery.getConnectionConfig().timeZone()); if (granularity == null) { || toTypeName == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE) { extractionFunction = TimeExtractionFunction.translateCastToTimeExtract(rexNode, TimeZone.getTimeZone(druidQuery.getConnectionConfig().timeZone())); if (extractionFunction == null) {
@Override public void onMatch(RelOptRuleCall call) { final Filter filter = call.rel(0); final RexBuilder rexBuilder = filter.getCluster().getRexBuilder(); final String timeZone = filter.getCluster().getPlanner().getContext() .unwrap(CalciteConnectionConfig.class).timeZone(); final RexNode condition = replaceTimeUnits(rexBuilder, filter.getCondition(), timeZone); if (condition.equals(filter.getCondition())) { return; } final RelBuilder relBuilder = relBuilderFactory.create(filter.getCluster(), null); relBuilder.push(filter.getInput()) .filter(condition); call.transformTo(relBuilder.build()); } }
@Override public void onMatch(RelOptRuleCall call) { final Filter filter = call.rel(0); final RexBuilder rexBuilder = filter.getCluster().getRexBuilder(); final String timeZone = filter.getCluster().getPlanner().getContext() .unwrap(CalciteConnectionConfig.class).timeZone(); final RexNode condition = replaceTimeUnits(rexBuilder, filter.getCondition(), timeZone); if (RexUtil.eq(condition, filter.getCondition())) { return; } final RelBuilder relBuilder = relBuilderFactory.create(filter.getCluster(), null); relBuilder.push(filter.getInput()) .filter(condition); call.transformTo(relBuilder.build()); } }