This is an automated email from the ASF dual-hosted git repository.
houqp pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/master by this push:
new 7b8d72c feat: add join type for logical plan display (#1674)
7b8d72c is described below
commit 7b8d72c5342610a40827f23df7d5604cf24133fd
Author: xudong.w <[email protected]>
AuthorDate: Fri Jan 28 02:17:28 2022 +0800
feat: add join type for logical plan display (#1674)
---
datafusion/src/logical_plan/builder.rs | 2 +-
datafusion/src/logical_plan/plan.rs | 25 ++++++++++++++++++--
datafusion/src/optimizer/filter_push_down.rs | 30 ++++++++++++------------
datafusion/src/optimizer/projection_push_down.rs | 6 ++---
datafusion/src/sql/planner.rs | 22 ++++++++---------
datafusion/tests/sql/explain_analyze.rs | 6 ++---
6 files changed, 56 insertions(+), 35 deletions(-)
diff --git a/datafusion/src/logical_plan/builder.rs
b/datafusion/src/logical_plan/builder.rs
index fc60939..613c8e9 100644
--- a/datafusion/src/logical_plan/builder.rs
+++ b/datafusion/src/logical_plan/builder.rs
@@ -1150,7 +1150,7 @@ mod tests {
// id column should only show up once in projection
let expected = "Projection: #t1.id, #t1.first_name, #t1.last_name,
#t1.state, #t1.salary, #t2.first_name, #t2.last_name, #t2.state, #t2.salary\
- \n Join: Using #t1.id = #t2.id\
+ \n Inner Join: Using #t1.id = #t2.id\
\n TableScan: t1 projection=None\
\n TableScan: t2 projection=None";
diff --git a/datafusion/src/logical_plan/plan.rs
b/datafusion/src/logical_plan/plan.rs
index b40dfc0..3d49e54 100644
--- a/datafusion/src/logical_plan/plan.rs
+++ b/datafusion/src/logical_plan/plan.rs
@@ -25,6 +25,7 @@ use crate::error::DataFusionError;
use crate::logical_plan::dfschema::DFSchemaRef;
use crate::sql::parser::FileType;
use arrow::datatypes::{DataType, Field, Schema, SchemaRef};
+use std::fmt::Formatter;
use std::{
collections::HashSet,
fmt::{self, Display},
@@ -48,6 +49,20 @@ pub enum JoinType {
Anti,
}
+impl Display for JoinType {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ let join_type = match self {
+ JoinType::Inner => "Inner",
+ JoinType::Left => "Left",
+ JoinType::Right => "Right",
+ JoinType::Full => "Full",
+ JoinType::Semi => "Semi",
+ JoinType::Anti => "Anti",
+ };
+ write!(f, "{}", join_type)
+ }
+}
+
/// Join constraint
#[derive(Debug, Clone, Copy)]
pub enum JoinConstraint {
@@ -934,16 +949,22 @@ impl LogicalPlan {
LogicalPlan::Join(Join {
on: ref keys,
join_constraint,
+ join_type,
..
}) => {
let join_expr: Vec<String> =
keys.iter().map(|(l, r)| format!("{} = {}", l,
r)).collect();
match join_constraint {
JoinConstraint::On => {
- write!(f, "Join: {}", join_expr.join(", "))
+ write!(f, "{} Join: {}", join_type,
join_expr.join(", "))
}
JoinConstraint::Using => {
- write!(f, "Join: Using {}", join_expr.join(",
"))
+ write!(
+ f,
+ "{} Join: Using {}",
+ join_type,
+ join_expr.join(", ")
+ )
}
}
}
diff --git a/datafusion/src/optimizer/filter_push_down.rs
b/datafusion/src/optimizer/filter_push_down.rs
index 6141af1..ababb52 100644
--- a/datafusion/src/optimizer/filter_push_down.rs
+++ b/datafusion/src/optimizer/filter_push_down.rs
@@ -1014,7 +1014,7 @@ mod tests {
format!("{:?}", plan),
"\
Filter: #test.a <= Int64(1)\
- \n Join: #test.a = #test2.a\
+ \n Inner Join: #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n TableScan: test2 projection=None"
@@ -1022,7 +1022,7 @@ mod tests {
// filter sent to side before the join
let expected = "\
- Join: #test.a = #test2.a\
+ Inner Join: #test.a = #test2.a\
\n Filter: #test.a <= Int64(1)\
\n TableScan: test projection=None\
\n Projection: #test2.a\
@@ -1055,7 +1055,7 @@ mod tests {
format!("{:?}", plan),
"\
Filter: #test.a <= Int64(1)\
- \n Join: Using #test.a = #test2.a\
+ \n Inner Join: Using #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n TableScan: test2 projection=None"
@@ -1063,7 +1063,7 @@ mod tests {
// filter sent to side before the join
let expected = "\
- Join: Using #test.a = #test2.a\
+ Inner Join: Using #test.a = #test2.a\
\n Filter: #test.a <= Int64(1)\
\n TableScan: test projection=None\
\n Projection: #test2.a\
@@ -1099,7 +1099,7 @@ mod tests {
format!("{:?}", plan),
"\
Filter: #test.c <= #test2.b\
- \n Join: #test.a = #test2.a\
+ \n Inner Join: #test.a = #test2.a\
\n Projection: #test.a, #test.c\
\n TableScan: test projection=None\
\n Projection: #test2.a, #test2.b\
@@ -1138,7 +1138,7 @@ mod tests {
format!("{:?}", plan),
"\
Filter: #test.b <= Int64(1)\
- \n Join: #test.a = #test2.a\
+ \n Inner Join: #test.a = #test2.a\
\n Projection: #test.a, #test.b\
\n TableScan: test projection=None\
\n Projection: #test2.a, #test2.c\
@@ -1146,7 +1146,7 @@ mod tests {
);
let expected = "\
- Join: #test.a = #test2.a\
+ Inner Join: #test.a = #test2.a\
\n Projection: #test.a, #test.b\
\n Filter: #test.b <= Int64(1)\
\n TableScan: test projection=None\
@@ -1180,7 +1180,7 @@ mod tests {
format!("{:?}", plan),
"\
Filter: #test2.a <= Int64(1)\
- \n Join: Using #test.a = #test2.a\
+ \n Left Join: Using #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n TableScan: test2 projection=None"
@@ -1189,7 +1189,7 @@ mod tests {
// filter not duplicated nor pushed down - i.e. noop
let expected = "\
Filter: #test2.a <= Int64(1)\
- \n Join: Using #test.a = #test2.a\
+ \n Left Join: Using #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n TableScan: test2 projection=None";
@@ -1221,7 +1221,7 @@ mod tests {
format!("{:?}", plan),
"\
Filter: #test.a <= Int64(1)\
- \n Join: Using #test.a = #test2.a\
+ \n Right Join: Using #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n TableScan: test2 projection=None"
@@ -1230,7 +1230,7 @@ mod tests {
// filter not duplicated nor pushed down - i.e. noop
let expected = "\
Filter: #test.a <= Int64(1)\
- \n Join: Using #test.a = #test2.a\
+ \n Right Join: Using #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n TableScan: test2 projection=None";
@@ -1262,7 +1262,7 @@ mod tests {
format!("{:?}", plan),
"\
Filter: #test.a <= Int64(1)\
- \n Join: Using #test.a = #test2.a\
+ \n Left Join: Using #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n TableScan: test2 projection=None"
@@ -1270,7 +1270,7 @@ mod tests {
// filter sent to left side of the join, not the right
let expected = "\
- Join: Using #test.a = #test2.a\
+ Left Join: Using #test.a = #test2.a\
\n Filter: #test.a <= Int64(1)\
\n TableScan: test projection=None\
\n Projection: #test2.a\
@@ -1303,7 +1303,7 @@ mod tests {
format!("{:?}", plan),
"\
Filter: #test2.a <= Int64(1)\
- \n Join: Using #test.a = #test2.a\
+ \n Right Join: Using #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n TableScan: test2 projection=None"
@@ -1311,7 +1311,7 @@ mod tests {
// filter sent to right side of join, not duplicated to the left
let expected = "\
- Join: Using #test.a = #test2.a\
+ Right Join: Using #test.a = #test2.a\
\n TableScan: test projection=None\
\n Projection: #test2.a\
\n Filter: #test2.a <= Int64(1)\
diff --git a/datafusion/src/optimizer/projection_push_down.rs
b/datafusion/src/optimizer/projection_push_down.rs
index fb45e98..1a64a44 100644
--- a/datafusion/src/optimizer/projection_push_down.rs
+++ b/datafusion/src/optimizer/projection_push_down.rs
@@ -593,7 +593,7 @@ mod tests {
// make sure projections are pushed down to both table scans
let expected = "Projection: #test.a, #test.b, #test2.c1\
- \n Join: #test.a = #test2.c1\
+ \n Left Join: #test.a = #test2.c1\
\n TableScan: test projection=Some([0, 1])\
\n TableScan: test2 projection=Some([0])";
@@ -634,7 +634,7 @@ mod tests {
// make sure projections are pushed down to both table scans
let expected = "Projection: #test.a, #test.b\
- \n Join: #test.a = #test2.c1\
+ \n Left Join: #test.a = #test2.c1\
\n TableScan: test projection=Some([0, 1])\
\n TableScan: test2 projection=Some([0])";
@@ -673,7 +673,7 @@ mod tests {
// make sure projections are pushed down to table scan
let expected = "Projection: #test.a, #test.b\
- \n Join: Using #test.a = #test2.a\
+ \n Left Join: Using #test.a = #test2.a\
\n TableScan: test projection=Some([0, 1])\
\n TableScan: test2 projection=Some([0])";
diff --git a/datafusion/src/sql/planner.rs b/datafusion/src/sql/planner.rs
index e951a3a..9da54ca 100644
--- a/datafusion/src/sql/planner.rs
+++ b/datafusion/src/sql/planner.rs
@@ -3289,7 +3289,7 @@ mod tests {
JOIN orders \
ON id = customer_id";
let expected = "Projection: #person.id, #orders.order_id\
- \n Join: #person.id = #orders.customer_id\
+ \n Inner Join: #person.id = #orders.customer_id\
\n TableScan: person projection=None\
\n TableScan: orders projection=None";
quick_test(sql, expected);
@@ -3303,7 +3303,7 @@ mod tests {
ON id = customer_id AND order_id > 1 ";
let expected = "Projection: #person.id, #orders.order_id\
\n Filter: #orders.order_id > Int64(1)\
- \n Join: #person.id = #orders.customer_id\
+ \n Inner Join: #person.id = #orders.customer_id\
\n TableScan: person projection=None\
\n TableScan: orders projection=None";
quick_test(sql, expected);
@@ -3316,7 +3316,7 @@ mod tests {
LEFT JOIN orders \
ON id = customer_id AND order_id > 1";
let expected = "Projection: #person.id, #orders.order_id\
- \n Join: #person.id = #orders.customer_id\
+ \n Left Join: #person.id = #orders.customer_id\
\n TableScan: person projection=None\
\n Filter: #orders.order_id > Int64(1)\
\n TableScan: orders projection=None";
@@ -3330,7 +3330,7 @@ mod tests {
RIGHT JOIN orders \
ON id = customer_id AND id > 1";
let expected = "Projection: #person.id, #orders.order_id\
- \n Join: #person.id = #orders.customer_id\
+ \n Right Join: #person.id = #orders.customer_id\
\n Filter: #person.id > Int64(1)\
\n TableScan: person projection=None\
\n TableScan: orders projection=None";
@@ -3344,7 +3344,7 @@ mod tests {
JOIN orders \
ON person.id = orders.customer_id";
let expected = "Projection: #person.id, #orders.order_id\
- \n Join: #person.id = #orders.customer_id\
+ \n Inner Join: #person.id = #orders.customer_id\
\n TableScan: person projection=None\
\n TableScan: orders projection=None";
quick_test(sql, expected);
@@ -3357,7 +3357,7 @@ mod tests {
JOIN person as person2 \
USING (id)";
let expected = "Projection: #person.first_name, #person.id\
- \n Join: Using #person.id = #person2.id\
+ \n Inner Join: Using #person.id = #person2.id\
\n TableScan: person projection=None\
\n TableScan: person2 projection=None";
quick_test(sql, expected);
@@ -3370,7 +3370,7 @@ mod tests {
JOIN lineitem as lineitem2 \
USING (l_item_id)";
let expected = "Projection: #lineitem.l_item_id,
#lineitem.l_description, #lineitem.price, #lineitem2.l_description,
#lineitem2.price\
- \n Join: Using #lineitem.l_item_id = #lineitem2.l_item_id\
+ \n Inner Join: Using #lineitem.l_item_id = #lineitem2.l_item_id\
\n TableScan: lineitem projection=None\
\n TableScan: lineitem2 projection=None";
quick_test(sql, expected);
@@ -3384,8 +3384,8 @@ mod tests {
JOIN lineitem ON o_item_id = l_item_id";
let expected =
"Projection: #person.id, #orders.order_id, #lineitem.l_description\
- \n Join: #orders.o_item_id = #lineitem.l_item_id\
- \n Join: #person.id = #orders.customer_id\
+ \n Inner Join: #orders.o_item_id = #lineitem.l_item_id\
+ \n Inner Join: #person.id = #orders.customer_id\
\n TableScan: person projection=None\
\n TableScan: orders projection=None\
\n TableScan: lineitem projection=None";
@@ -3918,8 +3918,8 @@ mod tests {
fn cross_join_to_inner_join() {
let sql = "select person.id from person, orders, lineitem where
person.id = lineitem.l_item_id and orders.o_item_id = lineitem.l_description;";
let expected = "Projection: #person.id\
- \n Join: #lineitem.l_description =
#orders.o_item_id\
- \n Join: #person.id = #lineitem.l_item_id\
+ \n Inner Join: #lineitem.l_description =
#orders.o_item_id\
+ \n Inner Join: #person.id =
#lineitem.l_item_id\
\n TableScan: person projection=None\
\n TableScan: lineitem projection=None\
\n TableScan: orders projection=None";
diff --git a/datafusion/tests/sql/explain_analyze.rs
b/datafusion/tests/sql/explain_analyze.rs
index 7c1fa69..2bd78ec 100644
--- a/datafusion/tests/sql/explain_analyze.rs
+++ b/datafusion/tests/sql/explain_analyze.rs
@@ -616,9 +616,9 @@ order by
Sort: #revenue DESC NULLS FIRST\
\n Projection: #customer.c_custkey, #customer.c_name,
#SUM(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount) AS revenue,
#customer.c_acctbal, #nation.n_name, #customer.c_address, #customer.c_phone,
#customer.c_comment\
\n Aggregate: groupBy=[[#customer.c_custkey, #customer.c_name,
#customer.c_acctbal, #customer.c_phone, #nation.n_name, #customer.c_address,
#customer.c_comment]], aggr=[[SUM(#lineitem.l_extendedprice * Int64(1) -
#lineitem.l_discount)]]\
- \n Join: #customer.c_nationkey = #nation.n_nationkey\
- \n Join: #orders.o_orderkey = #lineitem.l_orderkey\
- \n Join: #customer.c_custkey = #orders.o_custkey\
+ \n Inner Join: #customer.c_nationkey = #nation.n_nationkey\
+ \n Inner Join: #orders.o_orderkey = #lineitem.l_orderkey\
+ \n Inner Join: #customer.c_custkey = #orders.o_custkey\
\n TableScan: customer projection=Some([0, 1, 2, 3, 4, 5, 7])\
\n Filter: #orders.o_orderdate >= Date32(\"8674\") AND
#orders.o_orderdate < Date32(\"8766\")\
\n TableScan: orders projection=Some([0, 1, 4]),
filters=[#orders.o_orderdate >= Date32(\"8674\"), #orders.o_orderdate <
Date32(\"8766\")]\