Skip to content

Commit 6fc7913

Browse files
committed
address comment
1 parent d102da3 commit 6fc7913

2 files changed

Lines changed: 31 additions & 41 deletions

File tree

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/physical/partitioning.scala

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

169171
case class UnknownPartitioning(numPartitions: Int) extends Partitioning
@@ -178,9 +180,8 @@ case class RoundRobinPartitioning(numPartitions: Int) extends Partitioning
178180
case 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
}

sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/v2/DataSourcePartitioning.scala

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,18 @@ class DataSourcePartitioning(
3030

3131
override val numPartitions: Int = partitioning.numPartitions()
3232

33-
override def satisfies(required: physical.Distribution): Boolean = {
34-
super.satisfies(required) || {
35-
required match {
36-
case d: physical.ClusteredDistribution if isCandidate(d.clustering) =>
37-
val attrs = d.clustering.map(_.asInstanceOf[Attribute])
38-
partitioning.satisfy(
39-
new ClusteredDistribution(attrs.map { a =>
40-
val name = colNames.get(a)
41-
assert(name.isDefined, s"Attribute ${a.name} is not found in the data source output")
42-
name.get
43-
}.toArray))
33+
override def satisfies0(required: physical.Distribution): Boolean = {
34+
required match {
35+
case d: physical.ClusteredDistribution if isCandidate(d.clustering) =>
36+
val attrs = d.clustering.map(_.asInstanceOf[Attribute])
37+
partitioning.satisfy(
38+
new ClusteredDistribution(attrs.map { a =>
39+
val name = colNames.get(a)
40+
assert(name.isDefined, s"Attribute ${a.name} is not found in the data source output")
41+
name.get
42+
}.toArray))
4443

45-
case _ => false
46-
}
44+
case _ => false
4745
}
4846
}
4947

0 commit comments

Comments
 (0)