Skip to content

Commit 423769d

Browse files
committed
fix(cube): Make LogicalPlan protobuf deserialization roundtrip unnested unions
1 parent 6aec4d4 commit 423769d

File tree

2 files changed

+5
-15
lines changed

2 files changed

+5
-15
lines changed

datafusion/proto/src/logical_plan/mod.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -785,16 +785,12 @@ impl AsLogicalPlan for LogicalPlanNode {
785785
"Protobuf deserialization error, Union was require at least two input.",
786786
)));
787787
}
788-
let (first, rest) = union.inputs.split_first().unwrap();
789-
let mut builder = LogicalPlanBuilder::from(
790-
first.try_into_logical_plan(ctx, extension_codec)?,
791-
);
792788

793-
for i in rest {
794-
let plan = i.try_into_logical_plan(ctx, extension_codec)?;
795-
builder = builder.union(plan)?;
789+
let mut input_plans = Vec::with_capacity(union.inputs.len());
790+
for input in &union.inputs {
791+
input_plans.push(Arc::new(input.try_into_logical_plan(ctx, extension_codec)?));
796792
}
797-
builder.build()
793+
Ok(LogicalPlan::Union(datafusion_expr::Union::try_new_with_loose_types(input_plans)?))
798794
}
799795
LogicalPlanType::CrossJoin(crossjoin) => {
800796
let left = into_logical_plan!(crossjoin.left, ctx, extension_codec)?;

datafusion/proto/tests/cases/roundtrip_logical_plan.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ use arrow::datatypes::{
2525
};
2626
use arrow::util::pretty::pretty_format_batches;
2727
use datafusion::datasource::file_format::json::JsonFormatFactory;
28-
use datafusion::optimizer::eliminate_nested_union::EliminateNestedUnion;
29-
use datafusion::optimizer::Optimizer;
3028
use datafusion_common::parsers::CompressionTypeVariant;
3129
use prost::Message;
3230
use std::any::Any;
@@ -2603,13 +2601,9 @@ async fn roundtrip_union_query() -> Result<()> {
26032601
ctx.register_csv("t2", "tests/testdata/test.csv", CsvReadOptions::default())
26042602
.await?;
26052603
let logical_round_trip = logical_plan_from_bytes(&bytes, &ctx)?;
2606-
// proto deserialization only supports 2-way union, hence this plan has nested unions
2607-
// apply the flatten unions optimizer rule to be able to compare
2608-
let optimizer = Optimizer::with_rules(vec![Arc::new(EliminateNestedUnion::new())]);
2609-
let unnested = optimizer.optimize(logical_round_trip, &(ctx.state()), |_x, _y| {})?;
26102604
assert_eq!(
26112605
format!("{}", plan.display_indent_schema()),
2612-
format!("{}", unnested.display_indent_schema()),
2606+
format!("{}", logical_round_trip.display_indent_schema()),
26132607
);
26142608
Ok(())
26152609
}

0 commit comments

Comments
 (0)