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)); } }
public static RelNode getExchange(RelOptCluster cluster, boolean isSingleton, boolean isExchangeRequired, RelTraitSet traits, DrillDistributionTrait distributionTrait, IndexCallContext indexContext, RelNode input) { if (!isExchangeRequired) { return input; } if (isSingleton) { return new SingleMergeExchangePrel(cluster, traits.replace(DrillDistributionTrait.SINGLETON), input, indexContext.getCollation()); } else { return new HashToMergeExchangePrel(cluster, traits.replace(distributionTrait), input, distributionTrait.getFields(), indexContext.getCollation(), PrelUtil.getSettings(cluster).numEndPoints()); } }
private static boolean validateTraits(RelTraitSet traitSet, RelNode left, RelNode right) { ImmutableBitSet bitSet = ImmutableBitSet.range(left.getRowType().getFieldCount(), left.getRowType().getFieldCount() + right.getRowType().getFieldCount()); for (RelTrait trait: traitSet) { if (trait.getTraitDef().getTraitClass().equals(RelCollation.class)) { RelCollation collationTrait = (RelCollation)trait; for (RelFieldCollation field : collationTrait.getFieldCollations()) { if (bitSet.indexOf(field.getFieldIndex()) > 0) { return false; } } } else if (trait.getTraitDef().getTraitClass().equals(DrillDistributionTrait.class)) { DrillDistributionTrait distributionTrait = (DrillDistributionTrait) trait; for (DrillDistributionTrait.DistributionField field : distributionTrait.getFields()) { if (bitSet.indexOf(field.getFieldId()) > 0) { return false; } } } } return true; }
case HASH_DISTRIBUTED: return new HashToRandomExchangePrel(rel.getCluster(), planner.emptyTraitSet().plus(Prel.DRILL_PHYSICAL).plus(toDist), rel, toDist.getFields()); case RANGE_DISTRIBUTED: toDist.getFields(), toDist.getPartitionFunction()); case BROADCAST_DISTRIBUTED: return new BroadcastExchangePrel(rel.getCluster(), planner.emptyTraitSet().plus(Prel.DRILL_PHYSICAL).plus(toDist), rel);