RelNode input = aggr.getInput(); RelBuilder relBuilder = call.builder(); RexBuilder rexBuilder = aggr.getCluster().getRexBuilder();
@Override public RelNode convert(RelNode rel) { LogicalAggregate agg = (LogicalAggregate) rel; // AVG() will be transformed into SUM()/COUNT() by AggregateReduceFunctionsRule. // Here only let the transformed plan pass. if (containsAvg(agg)) { return null; } RelTraitSet traitSet = agg.getTraitSet().replace(OLAPRel.CONVENTION); try { return new OLAPAggregateRel(agg.getCluster(), traitSet, convert(agg.getInput(), OLAPRel.CONVENTION), agg.indicator, agg.getGroupSet(), agg.getGroupSets(), agg.getAggCallList()); } catch (InvalidRelException e) { throw new IllegalStateException("Can't create OLAPAggregateRel!", e); } }
@Override public LogicalAggregate copy(RelTraitSet traitSet, RelNode input, boolean indicator, ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) { assert traitSet.containsIfApplicable(Convention.NONE); return new LogicalAggregate(getCluster(), traitSet, input, indicator, groupSet, groupSets, aggCalls); }
@Override public LogicalAggregate copy(RelTraitSet traitSet, RelNode input, boolean indicator, ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) { assert traitSet.containsIfApplicable(Convention.NONE); return new LogicalAggregate(getCluster(), traitSet, input, indicator, groupSet, groupSets, aggCalls); }
@Override public void onMatch(RelOptRuleCall call) { final LogicalAggregate agg = call.rel(0); final RelDataTypeFactory typeFactory = agg.getCluster().getTypeFactory(); final RelBuilder builder = relBuilderFactory.create(agg.getCluster(), null); builder.push(agg.getInput()); builder.aggregate(builder.groupKey(agg.getGroupSet().toArray()), calls);
RelNode input = aggr.getInput(); RelBuilder relBuilder = call.builder(); RexBuilder rexBuilder = aggr.getCluster().getRexBuilder();
@Override public RelNode convert(RelNode rel) { LogicalAggregate agg = (LogicalAggregate) rel; // AVG() will be transformed into SUM()/COUNT() by AggregateReduceFunctionsRule. // Here only let the transformed plan pass. if (containsAvg(agg)) { return null; } RelTraitSet traitSet = agg.getTraitSet().replace(OLAPRel.CONVENTION); try { return new OLAPAggregateRel(agg.getCluster(), traitSet, convert(agg.getInput(), OLAPRel.CONVENTION), agg.indicator, agg.getGroupSet(), agg.getGroupSets(), agg.getAggCallList()); } catch (InvalidRelException e) { throw new IllegalStateException("Can't create OLAPAggregateRel!", e); } }
} else { if(query == null) { query = agg.getCluster().getMetadataQuery(); final RelBuilder builder = relBuilderFactory.create(agg.getCluster(), null); builder.push(agg.getInput()); builder.aggregate(builder.groupKey(agg.getGroupSet().toArray()), calls);
@Override public RelNode visit(LogicalAggregate aggregate) { RelNode input = aggregate.getInput().accept(this); final RelBuilder relBuilder = newCalciteRelBuilderWithoutContext(aggregate.getCluster()); relBuilder.push(input); RelDataType incomingRowType = input.getRowType(); RelDataTypeField modField = incomingRowType.getField(UPDATE_COLUMN, false, false); ImmutableBitSet newGroupSet = aggregate.getGroupSet().rebuild().set(modField.getIndex()).build(); GroupKey groupKey = relBuilder.groupKey(newGroupSet, aggregate.indicator, null); relBuilder.aggregate(groupKey, aggregate.getAggCallList()); Iterable<RexInputRef> projects = FluentIterable.from(aggregate.getRowType().getFieldNames()) .transform(new Function<String, RexInputRef>() { @Override public RexInputRef apply(String fieldName) { return relBuilder.field(fieldName); } }) .append(relBuilder.field(UPDATE_COLUMN)); relBuilder.project(projects); return relBuilder.build(); }
@Override public void onMatch(RelOptRuleCall call) { final LogicalAggregate aggregate = (LogicalAggregate) call.rel(0); final RelNode input = call.rel(1); if (aggregate.containsDistinctCall()) { // currently, don't use this rule if any of the aggregates contains DISTINCT return; } final RelTraitSet traits = aggregate.getTraitSet().plus(Rel.LOGICAL); final RelNode convertedInput = convert(input, input.getTraitSet().plus(Rel.LOGICAL).simplify()); call.transformTo(new AggregateRel(aggregate.getCluster(), traits, convertedInput, aggregate.indicator, aggregate.getGroupSet(), aggregate.getGroupSets(), aggregate.getAggCallList())); } }
@Override public void onMatch(RelOptRuleCall call) { final LogicalAggregate aggregate = call.rel(0); final RelNode input = call.rel(1); if (aggregate.containsDistinctCall()) { // currently, don't use this rule if any of the aggregates contains DISTINCT return; } final RelTraitSet traits = aggregate.getTraitSet().plus(DrillRel.DRILL_LOGICAL); final RelNode convertedInput = convert(input, input.getTraitSet().plus(DrillRel.DRILL_LOGICAL).simplify()); call.transformTo(new DrillAggregateRel(aggregate.getCluster(), traits, convertedInput, aggregate.indicator, aggregate.getGroupSet(), aggregate.getGroupSets(), aggregate.getAggCallList())); } }
public void onMatch(RelOptRuleCall call) { RelTraitSet empty = call.getPlanner().emptyTraitSet(); LogicalAggregate rel = call.rel(0); assert rel.getGroupSet().cardinality() == 1; int aggIndex = rel.getGroupSet().iterator().next(); RelTrait collation = RelCollations.of( new RelFieldCollation(aggIndex, RelFieldCollation.Direction.ASCENDING, RelFieldCollation.NullDirection.FIRST)); RelTraitSet desiredTraits = empty.replace(PHYSICAL).replace(collation); RelNode convertedInput = convert(rel.getInput(), desiredTraits); call.transformTo( new PhysAgg(rel.getCluster(), empty.replace(PHYSICAL), convertedInput, rel.indicator, rel.getGroupSet(), rel.getGroupSets(), rel.getAggCallList())); } }
public void onMatch(RelOptRuleCall call) { RelTraitSet empty = call.getPlanner().emptyTraitSet(); LogicalAggregate rel = call.rel(0); assert rel.getGroupSet().cardinality() == 1; int aggIndex = rel.getGroupSet().iterator().next(); RelTrait collation = RelCollations.of( new RelFieldCollation(aggIndex, RelFieldCollation.Direction.ASCENDING, RelFieldCollation.NullDirection.FIRST)); RelTraitSet desiredTraits = empty.replace(PHYSICAL).replace(collation); RelNode convertedInput = convert(rel.getInput(), desiredTraits); call.transformTo( new PhysAgg(rel.getCluster(), empty.replace(PHYSICAL), convertedInput, rel.indicator, rel.getGroupSet(), rel.getGroupSets(), rel.getAggCallList())); } }