public void onMatch(RelOptRuleCall call) { final Aggregate aggregate = call.rel(0); final DruidQuery query = call.rel(1); if (!DruidQuery.isValidSignature(query.signature() + 'a')) { return; } if (aggregate.indicator || aggregate.getGroupSets().size() != 1 || BAD_AGG.apply(ImmutableTriple.of(aggregate, (RelNode) aggregate, query)) || !validAggregate(aggregate, query)) { return; } final RelNode newAggregate = aggregate.copy(aggregate.getTraitSet(), ImmutableList.of(Util.last(query.rels))); call.transformTo(DruidQuery.extendQuery(query, newAggregate)); }
(Aggregate) newAggregate); } else { final DruidQuery query1 = DruidQuery.extendQuery(query, newProject); query2 = DruidQuery.extendQuery(query1, newAggregate);
public void onMatch(RelOptRuleCall call) { final Sort sort = call.rel(0); final DruidQuery query = call.rel(1); if (!DruidQuery.isValidSignature(query.signature() + 'l')) { return; } // Either it is: // - a sort and limit on a dimension/metric part of the druid group by query or // - a sort without limit on the time column on top of // Agg operator (transformable to timeseries query), or // - a simple limit on top of other operator than Agg if (!validSortLimit(sort, query)) { return; } final RelNode newSort = sort.copy(sort.getTraitSet(), ImmutableList.of(Util.last(query.rels))); call.transformTo(DruidQuery.extendQuery(query, newSort)); }
public void onMatch(RelOptRuleCall call) { final Sort sort = call.rel(0); final DruidQuery query = call.rel(1); if (!DruidQuery.isValidSignature(query.signature() + 'l')) { return; } // Either it is: // - a pure limit above a query of type scan // - a sort and limit on a dimension/metric part of the druid group by query if (sort.offset != null && RexLiteral.intValue(sort.offset) != 0) { // offset not supported by Druid return; } if (query.getQueryType() == QueryType.SCAN && !RelOptUtil.isPureLimit(sort)) { return; } final RelNode newSort = sort .copy(sort.getTraitSet(), ImmutableList.of(Util.last(query.rels))); call.transformTo(DruidQuery.extendQuery(query, newSort)); } }
final RelNode newFilter = filter.copy(filter.getTraitSet(), Util.last(query.rels), RexUtil.composeConjunction(rexBuilder, triple.getMiddle(), false)); newDruidQuery = DruidQuery.extendQuery(query, newFilter); newDruidQuery = DruidQuery.extendQuery((DruidQuery) newDruidQuery, intervals);
(Aggregate) newAggregate); } else { final DruidQuery query1 = DruidQuery.extendQuery(query, newProject); query2 = DruidQuery.extendQuery(query1, newAggregate);
final RelNode newFilter = filter.copy(filter.getTraitSet(), Util.last(query.rels), RexUtil.composeConjunction(rexBuilder, triple.getMiddle())); newDruidQuery = DruidQuery.extendQuery(query, newFilter); newDruidQuery = DruidQuery.extendQuery((DruidQuery) newDruidQuery, intervals);
@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); } } }
final DruidQuery newQuery = DruidQuery.extendQuery(query, newProject); call.transformTo(newQuery);
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)); } }
RelNode newNode = DruidQuery.extendQuery(query, newProject); call.transformTo(newNode); return; final DruidQuery newQuery = DruidQuery.extendQuery(query, newProject); final RelNode newProject2 = project.copy(project.getTraitSet(), newQuery, above, project.getRowType());
RelNode newNode = DruidQuery.extendQuery(query, newProject); call.transformTo(newNode); return; final DruidQuery newQuery = DruidQuery.extendQuery(query, newProject); final RelNode newProject2 = project.copy(project.getTraitSet(), newQuery, above, project.getRowType());
public void onMatch(RelOptRuleCall call) { Project project = call.rel(0); DruidQuery query = call.rel(1); final RelOptCluster cluster = project.getCluster(); final RexBuilder rexBuilder = cluster.getRexBuilder(); if (!DruidQuery.isValidSignature(query.signature() + 'o')) { return; } Pair<ImmutableMap<String, String>, Boolean> scanned = scanProject(query, project); // Only try to push down Project when there will be Post aggregators in result DruidQuery if (scanned.right) { Pair<Project, Project> splitProjectAggregate = splitProject(rexBuilder, query, project, scanned.left, cluster); Project inner = splitProjectAggregate.left; Project outer = splitProjectAggregate.right; DruidQuery newQuery = DruidQuery.extendQuery(query, inner); // When all project get pushed into DruidQuery, the project can be replaced by DruidQuery. if (outer != null) { Project newProject = outer.copy(outer.getTraitSet(), newQuery, outer.getProjects(), outer.getRowType()); call.transformTo(newProject); } else { call.transformTo(newQuery); } } }