private DrillDistributionTrait getDistribution(List<Integer> keys) { List<DistributionField> fields = Lists.newArrayList(); for (int key : keys) { fields.add(new DistributionField(key)); } return new DrillDistributionTrait(DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(fields)); }
protected enum PhysicalJoinType {HASH_JOIN, MERGE_JOIN, NESTEDLOOP_JOIN}
private DrillDistributionTrait convertDist(DrillDistributionTrait 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 DrillDistributionTrait.RANDOM_DISTRIBUTED; } else { return DrillDistributionTrait.SINGLETON; } } else { return new DrillDistributionTrait(srcDist.getType(), ImmutableList.copyOf(newFields)); } }
protected RelNode createRangeDistRight(final RelNode rightPrel, final RelDataTypeField rightRowKeyField, final DbGroupScan origDbGroupScan) { List<DrillDistributionTrait.DistributionField> rangeDistFields = Lists.newArrayList(new DrillDistributionTrait.DistributionField(0 /* rowkey ordinal on the right side */)); FieldReference rangeDistRef = FieldReference.getWithQuotedRef(rightRowKeyField.getName()); List<FieldReference> rangeDistRefList = Lists.newArrayList(); rangeDistRefList.add(rangeDistRef); final DrillDistributionTrait distRight; if (IndexPlanUtils.scanIsPartition(origDbGroupScan)) { distRight = new DrillDistributionTrait( DrillDistributionTrait.DistributionType.RANGE_DISTRIBUTED, ImmutableList.copyOf(rangeDistFields), origDbGroupScan.getRangePartitionFunction(rangeDistRefList)); } else { distRight = DrillDistributionTrait.SINGLETON; } RelTraitSet rightTraits = newTraitSet(distRight).plus(Prel.DRILL_PHYSICAL); RelNode convertedRight = Prule.convert(rightPrel, rightTraits); return convertedRight; }
DrillDistributionTrait hashChild = new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(childDistFields)); RelTraitSet traitsChild = call.getPlanner().emptyTraitSet().plus(Prel.DRILL_PHYSICAL).plus(hashChild); convertedChild = convert(child, PrelUtil.fixTraits(call, traitsChild));
settings.getSliceTarget() < indexProjectPrel.getRows()) { final DrillDistributionTrait distRight = new DrillDistributionTrait(DistributionType.BROADCAST_DISTRIBUTED); rightSideTraits = newTraitSet(distRight).plus(Prel.DRILL_PHYSICAL); right.getTraitSet().getTrait(DrillDistributionTraitDef.INSTANCE) != DrillDistributionTrait.SINGLETON) { final DrillDistributionTrait distRight = new DrillDistributionTrait(DistributionType.BROADCAST_DISTRIBUTED); rightSideTraits = newTraitSet(distRight).plus(Prel.DRILL_PHYSICAL);
rangeDistRefList.add(rangeDistRef); RelNode leftScan = DrillPushRowKeyJoinToScanRule.getValidJoinInput(left); DrillDistributionTrait rangePartRight = new DrillDistributionTrait( DrillDistributionTrait.DistributionType.RANGE_DISTRIBUTED, ImmutableList.copyOf(rangeDistFields),
&& windowBase.orderKeys.getFieldCollations().isEmpty()) { DrillDistributionTrait distEmptyKeys = new DrillDistributionTrait(DrillDistributionTrait.DistributionType.SINGLETON); new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionFields(windowBase))); new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionFieldsFromCollation(windowBase)));
new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(aggregate, true /* get all grouping keys */))); new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(aggregate, false /* get single grouping key */)));
OrderedRel rel = indexContext.getSort(); DrillDistributionTrait hashDistribution = new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(indexContext.getDistributionFields()));
@Override public void onMatch(RelOptRuleCall call) { final DrillSortRel sort = call.rel(0); final RelNode input = sort.getInput(); // Keep the collation in logical sort. Convert input into a RelNode with 1) this collation, 2) Physical, 3) hash distributed on DrillDistributionTrait hashDistribution = new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(sort))); final RelTraitSet traits = RelTraitSet.createEmpty().plus(Prel.DRILL_PHYSICAL).plus(hashDistribution); SortPrel child = new SortPrel(sort.getCluster(), traits.plus(sort.getCollation()), convert(sort.getInput(), traits), sort.getCollation(), false); if(isSingleMode(call)){ call.transformTo(child); }else{ RelNode exch = new SingleMergeExchangePrel(sort.getCluster(), sort.getTraitSet().plus(Prel.DRILL_PHYSICAL).plus(DrillDistributionTrait.SINGLETON), child, sort.getCollation()); call.transformTo(exch); // transform logical "sort" into "SingleMergeExchange". } }
new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(aggregate, true))); new DrillDistributionTrait(DrillDistributionTrait.DistributionType.HASH_DISTRIBUTED, ImmutableList.copyOf(getDistributionField(aggregate, false)));
final RelCollation collationLeft, final RelCollation collationRight) throws InvalidRelException { DrillDistributionTrait distBroadcastRight = new DrillDistributionTrait(DrillDistributionTrait.DistributionType.BROADCAST_DISTRIBUTED); RelTraitSet traitsRight = null; RelTraitSet traitsLeft = left.getTraitSet().plus(Prel.DRILL_PHYSICAL);