@@ -162,8 +162,10 @@ trait Partitioning {
162162 def satisfies (required : Distribution ): Boolean = required match {
163163 case UnspecifiedDistribution => true
164164 case AllTuples => numPartitions == 1
165- case _ => false
165+ case _ => required.requiredNumPartitions.forall(_ == numPartitions) && satisfies0(required)
166166 }
167+
168+ protected def satisfies0 (required : Distribution ): Boolean = false
167169}
168170
169171case class UnknownPartitioning (numPartitions : Int ) extends Partitioning
@@ -178,9 +180,8 @@ case class RoundRobinPartitioning(numPartitions: Int) extends Partitioning
178180case object SinglePartition extends Partitioning {
179181 val numPartitions = 1
180182
181- override def satisfies (required : Distribution ): Boolean = required match {
183+ override def satisfies0 (required : Distribution ): Boolean = required match {
182184 case _ : BroadcastDistribution => false
183- case ClusteredDistribution (_, Some (requiredNumPartitions)) => requiredNumPartitions == 1
184185 case _ => true
185186 }
186187}
@@ -197,21 +198,15 @@ case class HashPartitioning(expressions: Seq[Expression], numPartitions: Int)
197198 override def nullable : Boolean = false
198199 override def dataType : DataType = IntegerType
199200
200- override def satisfies (required : Distribution ): Boolean = {
201- super .satisfies(required) || {
202- val satisfyNumPartitions = required.requiredNumPartitions.isEmpty ||
203- required.requiredNumPartitions.get == numPartitions
204- satisfyNumPartitions && {
205- required match {
206- case h : HashClusteredDistribution =>
207- expressions.length == h.hashExprs.length && expressions.zip(h.hashExprs).forall {
208- case (l, r) => l.semanticEquals(r)
209- }
210- case c : ClusteredDistribution =>
211- expressions.forall(x => c.clustering.exists(_.semanticEquals(x)))
212- case _ => false
201+ override def satisfies0 (required : Distribution ): Boolean = {
202+ required match {
203+ case h : HashClusteredDistribution =>
204+ expressions.length == h.hashExprs.length && expressions.zip(h.hashExprs).forall {
205+ case (l, r) => l.semanticEquals(r)
213206 }
214- }
207+ case c : ClusteredDistribution =>
208+ expressions.forall(x => c.clustering.exists(_.semanticEquals(x)))
209+ case _ => false
215210 }
216211 }
217212
@@ -241,17 +236,14 @@ case class RangePartitioning(ordering: Seq[SortOrder], numPartitions: Int)
241236 override def nullable : Boolean = false
242237 override def dataType : DataType = IntegerType
243238
244- override def satisfies (required : Distribution ): Boolean = {
245- super .satisfies(required) || {
246- required match {
247- case OrderedDistribution (requiredOrdering) =>
248- val minSize = Seq (requiredOrdering.size, ordering.size).min
249- requiredOrdering.take(minSize) == ordering.take(minSize)
250- case ClusteredDistribution (requiredClustering, requiredNumPartitions) =>
251- ordering.map(_.child).forall(x => requiredClustering.exists(_.semanticEquals(x))) &&
252- (requiredNumPartitions.isEmpty || requiredNumPartitions.get == numPartitions)
253- case _ => false
254- }
239+ override def satisfies0 (required : Distribution ): Boolean = {
240+ required match {
241+ case OrderedDistribution (requiredOrdering) =>
242+ val minSize = Seq (requiredOrdering.size, ordering.size).min
243+ requiredOrdering.take(minSize) == ordering.take(minSize)
244+ case ClusteredDistribution (requiredClustering, _) =>
245+ ordering.map(_.child).forall(x => requiredClustering.exists(_.semanticEquals(x)))
246+ case _ => false
255247 }
256248 }
257249}
0 commit comments