@Override public boolean satisfies(RelTrait trait) { if (trait instanceof DistributionTrait) { DistributionType requiredDist = ((DistributionTrait) trait).getType(); if (requiredDist == DistributionType.ANY) { return true; } if (this.type == DistributionType.HASH_DISTRIBUTED) { if (requiredDist == DistributionType.HASH_DISTRIBUTED) { // A subset of the required distribution columns can satisfy (subsume) the requirement // e.g: required distribution: {a, b, c} // Following can satisfy the requirements: {a}, {b}, {c}, {a, b}, {b, c}, {a, c} or {a, b, c} // New: Use equals for subsumes check of hash distribution. If we uses subsumes, // a join may end up with hash-distributions using different keys. This would // cause incorrect query result. return this.equals(trait); } } } return this.equals(trait); }
private boolean isDefaultDist(RelNode n) { return n.getTraitSet().getTrait(DistributionTraitDef.INSTANCE).equals(DistributionTrait.DEFAULT); }
@Override public boolean canConvert( RelOptPlanner planner, DistributionTrait fromTrait, DistributionTrait toTrait, RelNode fromRel) { if (fromTrait.equals(toTrait)) { return true; } // Source trait is "ANY", which is abstract type of distribution. // We do not want to convert from "ANY", since it's abstract. // Source trait should be concrete type: SINGLETON, HASH_DISTRIBUTED, etc. if (fromTrait.equals(DistributionTrait.DEFAULT) && !(fromRel instanceof RelSubset) ) { return false; } // It is only possible to apply a distribution trait to a PHYSICAL convention. if (fromRel.getConvention() != Prel.PHYSICAL) { return false; } if (fromTrait.getType() == DistributionType.HASH_DISTRIBUTED && toTrait.getType() == DistributionType.BROADCAST_DISTRIBUTED) { return false; } if (fromTrait.getType() == DistributionType.BROADCAST_DISTRIBUTED && toTrait.getType() == DistributionType.HASH_DISTRIBUTED) { return false; } return true; }
&& ! left.getTraitSet().getTrait(DistributionTraitDef.INSTANCE).equals(DistributionTrait.SINGLETON) && (join.getJoinType() == JoinRelType.INNER || join.getJoinType() == JoinRelType.LEFT)) {