This is an automated email from the ASF dual-hosted git repository.
wayne pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 0d7cab055c Support crossjoin in substrait. (#8427)
0d7cab055c is described below
commit 0d7cab055cb39d6df751e070af5a0bf5444e3849
Author: yi wang <[email protected]>
AuthorDate: Wed Dec 6 19:40:01 2023 +0800
Support crossjoin in substrait. (#8427)
* Support crossjoin in substrait.
* use struct destructuring
* remove useless builder.
---
datafusion/substrait/src/logical_plan/consumer.rs | 9 +++++++++
datafusion/substrait/src/logical_plan/producer.rs | 20 +++++++++++++++++++-
.../substrait/tests/cases/roundtrip_logical_plan.rs | 5 +++++
3 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/datafusion/substrait/src/logical_plan/consumer.rs
b/datafusion/substrait/src/logical_plan/consumer.rs
index cf05d814a5..ffc9d094ab 100644
--- a/datafusion/substrait/src/logical_plan/consumer.rs
+++ b/datafusion/substrait/src/logical_plan/consumer.rs
@@ -434,6 +434,15 @@ pub async fn from_substrait_rel(
None => plan_err!("JoinRel without join condition is not
allowed"),
}
}
+ Some(RelType::Cross(cross)) => {
+ let left: LogicalPlanBuilder = LogicalPlanBuilder::from(
+ from_substrait_rel(ctx, cross.left.as_ref().unwrap(),
extensions).await?,
+ );
+ let right =
+ from_substrait_rel(ctx, cross.right.as_ref().unwrap(),
extensions)
+ .await?;
+ left.cross_join(right)?.build()
+ }
Some(RelType::Read(read)) => match &read.as_ref().read_type {
Some(ReadType::NamedTable(nt)) => {
let table_reference = match nt.names.len() {
diff --git a/datafusion/substrait/src/logical_plan/producer.rs
b/datafusion/substrait/src/logical_plan/producer.rs
index d576e70711..c5f1278be6 100644
--- a/datafusion/substrait/src/logical_plan/producer.rs
+++ b/datafusion/substrait/src/logical_plan/producer.rs
@@ -19,7 +19,7 @@ use std::collections::HashMap;
use std::ops::Deref;
use std::sync::Arc;
-use datafusion::logical_expr::{Distinct, Like, WindowFrameUnits};
+use datafusion::logical_expr::{CrossJoin, Distinct, Like, WindowFrameUnits};
use datafusion::{
arrow::datatypes::{DataType, TimeUnit},
error::{DataFusionError, Result},
@@ -40,6 +40,7 @@ use datafusion::logical_expr::{expr, Between, JoinConstraint,
LogicalPlan, Opera
use datafusion::prelude::Expr;
use prost_types::Any as ProtoAny;
use substrait::proto::expression::window_function::BoundsType;
+use substrait::proto::CrossRel;
use substrait::{
proto::{
aggregate_function::AggregationInvocation,
@@ -332,6 +333,23 @@ pub fn to_substrait_rel(
}))),
}))
}
+ LogicalPlan::CrossJoin(cross_join) => {
+ let CrossJoin {
+ left,
+ right,
+ schema: _,
+ } = cross_join;
+ let left = to_substrait_rel(left.as_ref(), ctx, extension_info)?;
+ let right = to_substrait_rel(right.as_ref(), ctx, extension_info)?;
+ Ok(Box::new(Rel {
+ rel_type: Some(RelType::Cross(Box::new(CrossRel {
+ common: None,
+ left: Some(left),
+ right: Some(right),
+ advanced_extension: None,
+ }))),
+ }))
+ }
LogicalPlan::SubqueryAlias(alias) => {
// Do nothing if encounters SubqueryAlias
// since there is no corresponding relation type in Substrait
diff --git a/datafusion/substrait/tests/cases/roundtrip_logical_plan.rs
b/datafusion/substrait/tests/cases/roundtrip_logical_plan.rs
index 1c5dbe9ce8..691fba8644 100644
--- a/datafusion/substrait/tests/cases/roundtrip_logical_plan.rs
+++ b/datafusion/substrait/tests/cases/roundtrip_logical_plan.rs
@@ -394,6 +394,11 @@ async fn roundtrip_inlist_4() -> Result<()> {
roundtrip("SELECT * FROM data WHERE f NOT IN ('a', 'b', 'c', 'd')").await
}
+#[tokio::test]
+async fn roundtrip_cross_join() -> Result<()> {
+ roundtrip("SELECT * FROM data CROSS JOIN data2").await
+}
+
#[tokio::test]
async fn roundtrip_inner_join() -> Result<()> {
roundtrip("SELECT data.a FROM data JOIN data2 ON data.a = data2.a").await