vbarua commented on code in PR #13931: URL: https://github.com/apache/datafusion/pull/13931#discussion_r1899698878
########## datafusion/substrait/src/logical_plan/producer.rs: ########## @@ -185,257 +501,290 @@ pub fn to_substrait_extended_expr( })) } -/// Convert DataFusion LogicalPlan to Substrait Rel -#[allow(deprecated)] pub fn to_substrait_rel( + producer: &mut impl SubstraitProducer, plan: &LogicalPlan, - state: &dyn SubstraitPlanningState, - extensions: &mut Extensions, ) -> Result<Box<Rel>> { match plan { - LogicalPlan::TableScan(scan) => { - let projection = scan.projection.as_ref().map(|p| { - p.iter() - .map(|i| StructItem { - field: *i as i32, - child: None, - }) - .collect() - }); + LogicalPlan::Projection(plan) => producer.consume_projection(plan), + LogicalPlan::Filter(plan) => producer.consume_filter(plan), + LogicalPlan::Window(plan) => producer.consume_window(plan), + LogicalPlan::Aggregate(plan) => producer.consume_aggregate(plan), + LogicalPlan::Sort(plan) => producer.consume_sort(plan), + LogicalPlan::Join(plan) => producer.consume_join(plan), + LogicalPlan::Repartition(plan) => producer.consume_repartition(plan), + LogicalPlan::Union(plan) => producer.consume_union(plan), + LogicalPlan::TableScan(plan) => producer.consume_table_scan(plan), + LogicalPlan::EmptyRelation(plan) => producer.consume_empty_relation(plan), + LogicalPlan::SubqueryAlias(plan) => producer.consume_subquery_alias(plan), + LogicalPlan::Limit(plan) => producer.consume_limit(plan), + LogicalPlan::Values(plan) => producer.consume_values(plan), + LogicalPlan::Distinct(plan) => producer.consume_distinct(plan), + LogicalPlan::Extension(plan) => producer.consume_extension(plan), + _ => not_impl_err!("Unsupported plan type: {plan:?}")?, + } +} - let projection = projection.map(|struct_items| MaskExpression { - select: Some(StructSelect { struct_items }), - maintain_singular_struct: false, - }); +pub fn from_table_scan( + _producer: &mut impl SubstraitProducer, + scan: &TableScan, +) -> Result<Box<Rel>> { + let projection = scan.projection.as_ref().map(|p| { + p.iter() + .map(|i| StructItem { + field: *i as i32, + child: None, + }) + .collect() + }); + + let projection = projection.map(|struct_items| MaskExpression { + select: Some(StructSelect { struct_items }), + maintain_singular_struct: false, + }); + + let table_schema = scan.source.schema().to_dfschema_ref()?; + let base_schema = to_substrait_named_struct(&table_schema)?; + + Ok(Box::new(Rel { + rel_type: Some(RelType::Read(Box::new(ReadRel { + common: None, + base_schema: Some(base_schema), + filter: None, + best_effort_filter: None, + projection, + advanced_extension: None, + read_type: Some(ReadType::NamedTable(NamedTable { + names: scan.table_name.to_vec(), + advanced_extension: None, + })), + }))), + })) +} - let table_schema = scan.source.schema().to_dfschema_ref()?; - let base_schema = to_substrait_named_struct(&table_schema)?; +pub fn from_empty_relation(e: &EmptyRelation) -> Result<Box<Rel>> { + if e.produce_one_row { + return not_impl_err!("Producing a row from empty relation is unsupported"); + } + #[allow(deprecated)] Review Comment: The deprecation warnings are for fields on the generated protobufs. For example here it's the `values` field on the VirtualFields. My intent with moving the `#[allow(deprecated)]` to the statement declarations was to more tightly associate it with the code with the deprecated fields. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org For additional commands, e-mail: github-h...@datafusion.apache.org