private static DistributionTrait hashDistributedOn(final List<String> columns, final RelDataType inputRowType) { return new DistributionTrait(DistributionType.HASH_DISTRIBUTED, FluentIterable.from(WriterUpdater.getFieldIndices(columns, inputRowType)) .transform(new Function<Integer, DistributionField>() { @Override public DistributionField apply(Integer input) { return new DistributionField(input); } }).toList()); } }
protected static enum PhysicalJoinType {HASH_JOIN, MERGE_JOIN, NESTEDLOOP_JOIN};
private DistributionTrait convertDist(DistributionTrait srcDist, Map<Integer, Integer> inToOut) { List<DistributionField> newFields = Lists.newArrayList(); for (DistributionField field : srcDist.getFields()) { if (inToOut.containsKey(field.getFieldId())) { newFields.add(new DistributionField(inToOut.get(field.getFieldId()))); } } // After the projection, if the new distribution fields is empty, or new distribution fields is a subset of // original distribution field, we should replace with either SINGLETON or RANDOM_DISTRIBUTED. if (newFields.isEmpty() || newFields.size() < srcDist.getFields().size()) { if (srcDist.getType() != DistributionType.SINGLETON) { return DistributionTrait.ANY; } else { return DistributionTrait.SINGLETON; } } else { return new DistributionTrait(srcDist.getType(), ImmutableList.copyOf(newFields)); } }
DistributionTrait hashChild = new DistributionTrait(DistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(childDistFields)); traitsChild = call.getPlanner().emptyTraitSet().plus(Prel.PHYSICAL).plus(hashChild);
new DistributionTrait(DistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionFields(windowBase)));
@Override public void onMatch(RelOptRuleCall call) { final SortRel sort = (SortRel) call.rel(0); final RelNode input = sort.getInput(); final PlannerSettings plannerSettings = PrelUtil.getPlannerSettings(call.getPlanner()); final RelTraitSet inputTraits; if (plannerSettings.getOptions().getOption(PlannerSettings.ENABLE_SORT_ROUND_ROBIN)) { // Keep the collation in logical sort just make its input round robin round robin. inputTraits = sort.getTraitSet().plus(Prel.PHYSICAL).plus(DistributionTrait.ROUND_ROBIN); } else { // Keep the collation in logical sort. Convert input into a RelNode with 1) this collation, 2) Physical, 3) hash distributed on DistributionTrait hashDistribution = new DistributionTrait(DistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(sort))); inputTraits = sort.getTraitSet().plus(Prel.PHYSICAL).plus(hashDistribution); } final RelNode convertedInput = convert(input, inputTraits); if(isSingleMode(call)){ call.transformTo(convertedInput); }else{ RelNode exch = new SingleMergeExchangePrel(sort.getCluster(), sort.getTraitSet().plus(Prel.PHYSICAL).plus(DistributionTrait.SINGLETON), convertedInput, sort.getCollation()); call.transformTo(exch); // transform logical "sort" into "SingleMergeExchange". } }
new DistributionTrait(DistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(aggregate, true /* get all grouping keys */))); new DistributionTrait(DistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(aggregate, false /* get single grouping key */)));
new DistributionTrait(DistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(aggregate, true)));