Skip to content

Commit 5469caf

Browse files
author
Davies Liu
committed
add more tests
1 parent 21a81b5 commit 5469caf

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/Optimizer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -728,8 +728,7 @@ object ReorderJoin extends Rule[LogicalPlan] with PredicateHelper {
728728
if (input.size == 2) {
729729
Join(input(0), input(1), Inner, conditions.reduceLeftOption(And))
730730
} else {
731-
val left = input.head
732-
val rest = input.drop(1)
731+
val left :: rest = input.toList
733732
// find out the first join that have at least one join condition
734733
val conditionalJoin = rest.find { plan =>
735734
val refs = left.outputSet ++ plan.outputSet
@@ -743,6 +742,7 @@ object ReorderJoin extends Rule[LogicalPlan] with PredicateHelper {
743742
val (joinConditions, others) = conditions.partition(_.references.subsetOf(joinedRefs))
744743
val joined = Join(left, right, Inner, joinConditions.reduceLeftOption(And))
745744

745+
// should not have reference to same logical plan
746746
createOrderedJoin(Seq(joined) ++ rest.filterNot(_ eq right), others)
747747
}
748748
}

sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/JoinOrderSuite.scala

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import org.apache.spark.sql.catalyst.analysis
2121
import org.apache.spark.sql.catalyst.analysis.EliminateSubQueries
2222
import org.apache.spark.sql.catalyst.dsl.expressions._
2323
import org.apache.spark.sql.catalyst.dsl.plans._
24+
import org.apache.spark.sql.catalyst.expressions.Expression
25+
import org.apache.spark.sql.catalyst.planning.ExtractFiltersAndInnerJoins
2426
import org.apache.spark.sql.catalyst.plans.PlanTest
2527
import org.apache.spark.sql.catalyst.plans.logical.{LocalRelation, LogicalPlan}
2628
import org.apache.spark.sql.catalyst.rules.RuleExecutor
@@ -48,7 +50,31 @@ class JoinOrderSuite extends PlanTest {
4850
val testRelation = LocalRelation('a.int, 'b.int, 'c.int)
4951
val testRelation1 = LocalRelation('d.int)
5052

51-
test("joins: reorder inner joins") {
53+
test("extract filters and joins") {
54+
val x = testRelation.subquery('x)
55+
val y = testRelation1.subquery('y)
56+
val z = testRelation.subquery('z)
57+
58+
def testExtract(plan: LogicalPlan, expected: Option[(Seq[LogicalPlan], Seq[Expression])]) {
59+
assert(ExtractFiltersAndInnerJoins.unapply(plan) === expected)
60+
}
61+
62+
testExtract(x, None)
63+
testExtract(x.where("x.b".attr === 1), None)
64+
testExtract(x.join(y), Some(Seq(x, y), Seq()))
65+
testExtract(x.join(y, condition = Some("x.b".attr === "y.d".attr)),
66+
Some(Seq(x, y), Seq("x.b".attr === "y.d".attr)))
67+
testExtract(x.join(y).where("x.b".attr === "y.d".attr),
68+
Some(Seq(x, y), Seq("x.b".attr === "y.d".attr)))
69+
testExtract(x.join(y).join(z), Some(Seq(x, y, z), Seq()))
70+
testExtract(x.join(y).where("x.b".attr === "y.d".attr).join(z),
71+
Some(Seq(x, y, z), Seq("x.b".attr === "y.d".attr)))
72+
testExtract(x.join(y).join(x.join(z)), Some(Seq(x, y, x.join(z)), Seq()))
73+
testExtract(x.join(y).join(x.join(z)).where("x.b".attr === "y.d".attr),
74+
Some(Seq(x, y, x.join(z)), Seq("x.b".attr === "y.d".attr)))
75+
}
76+
77+
test("reorder inner joins") {
5278
val x = testRelation.subquery('x)
5379
val y = testRelation1.subquery('y)
5480
val z = testRelation.subquery('z)

0 commit comments

Comments
 (0)