/** * 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"); }
private static boolean validAggregate(Aggregate aggregate, DruidQuery query) { ImmutableBitSet.Builder builder = ImmutableBitSet.builder(); for (AggregateCall aggCall : aggregate.getAggCallList()) { builder.addAll(aggCall.getArgList()); } return !checkTimestampRefOnQuery(builder.build(), query.getTopNode(), query); } }
/** Checks whether any of the references leads to a metric column. */ private static boolean checkAggregateOnMetric(ImmutableBitSet set, RelNode topProject, DruidQuery query) { if (topProject instanceof Project) { ImmutableBitSet.Builder newSet = ImmutableBitSet.builder(); final Project project = (Project) topProject; for (int index : set) { RexNode node = project.getProjects().get(index); ImmutableBitSet setOfBits = RelOptUtil.InputFinder.bits(node); newSet.addAll(setOfBits); } set = newSet.build(); } for (int index : set) { if (query.druidTable.isMetric(query.getTopNode().getRowType().getFieldNames().get(index))) { return true; } } return false; }
query.getTopNode(), query))) { return -1; query.getTopNode(), query)) { if (idxTimestamp != -1) {
public void onMatch(RelOptRuleCall call) { final Aggregate aggregate = call.rel(0); final DruidQuery query = call.rel(1); final RelNode topDruidNode = query.getTopNode(); final Project project = topDruidNode instanceof Project ? (Project) topDruidNode : null; if (!DruidQuery.isValidSignature(query.signature() + 'a')) { return; } if (aggregate.indicator || aggregate.getGroupSets().size() != 1) { return; } if (DruidQuery .computeProjectGroupSet(project, aggregate.getGroupSet(), query.table.getRowType(), query) == null) { return; } final List<String> aggNames = Util .skip(aggregate.getRowType().getFieldNames(), aggregate.getGroupSet().cardinality()); if (DruidQuery.computeDruidJsonAgg(aggregate.getAggCallList(), aggNames, project, query) == null) { return; } final RelNode newAggregate = aggregate .copy(aggregate.getTraitSet(), ImmutableList.of(query.getTopNode())); call.transformTo(DruidQuery.extendQuery(query, newAggregate)); } }
final RelNode topNode = query.getTopNode(); final Aggregate topAgg; if (topNode instanceof Aggregate) {
@Override public void onMatch(RelOptRuleCall call) { final Filter filter = call.rel(0); final DruidQuery query = call.rel(1); if (!DruidQuery.isValidSignature(query.signature() + 'h')) { return; } final RexNode cond = filter.getCondition(); final DruidJsonFilter druidJsonFilter = DruidJsonFilter .toDruidFilters(cond, query.getTopNode().getRowType(), query); if (druidJsonFilter != null) { final RelNode newFilter = filter .copy(filter.getTraitSet(), Util.last(query.rels), filter.getCondition()); final DruidQuery newDruidQuery = DruidQuery.extendQuery(query, newFilter); call.transformTo(newDruidQuery); } } }
RelNode topNode = query.getTopNode(); Aggregate topAgg; if (topNode instanceof Project && ((Project) topNode).getInput() instanceof Aggregate) {