mbutrovich commented on code in PR #2057: URL: https://github.com/apache/datafusion-comet/pull/2057#discussion_r2267479920
########## native/core/src/execution/planner.rs: ########## @@ -474,6 +481,123 @@ impl PhysicalPlanner { ))) } } + }, + Value::ListVal(values) => { + if let DataType::List(f) = data_type { + match f.data_type() { + DataType::Null => { + SingleRowListArrayBuilder::new(Arc::new(NullArray::new(values.clone().null_mask.len()))) + .build_list_scalar() + } + DataType::Boolean => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(BooleanArray::new(BooleanBuffer::from(vals.boolean_values), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Int8 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Int8Array::new(vals.byte_values.iter().map(|&x| x as i8).collect::<Vec<_>>().into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Int16 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Int16Array::new(vals.short_values.iter().map(|&x| x as i16).collect::<Vec<_>>().into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Int32 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Int32Array::new(vals.int_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Int64 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Int64Array::new(vals.long_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Float32 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Float32Array::new(vals.float_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Float64 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Float64Array::new(vals.double_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Timestamp(TimeUnit::Microsecond, None) => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(TimestampMicrosecondArray::new(vals.long_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Timestamp(TimeUnit::Microsecond, Some(tz)) => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(TimestampMicrosecondArray::new(vals.long_values.into(), Some(vals.null_mask.into())).with_timezone(Arc::clone(tz)))) + .build_list_scalar() + } + DataType::Date32 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Date32Array::new(vals.int_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Binary => { + // Using a builder here as it is quite complicated to create StringArray from a vector with nulls Review Comment: Nit: "BinaryArray" in this one, not "StringArray". ########## native/core/src/execution/planner.rs: ########## @@ -474,6 +481,123 @@ impl PhysicalPlanner { ))) } } + }, + Value::ListVal(values) => { + if let DataType::List(f) = data_type { + match f.data_type() { + DataType::Null => { + SingleRowListArrayBuilder::new(Arc::new(NullArray::new(values.clone().null_mask.len()))) + .build_list_scalar() + } + DataType::Boolean => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(BooleanArray::new(BooleanBuffer::from(vals.boolean_values), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Int8 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Int8Array::new(vals.byte_values.iter().map(|&x| x as i8).collect::<Vec<_>>().into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Int16 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Int16Array::new(vals.short_values.iter().map(|&x| x as i16).collect::<Vec<_>>().into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Int32 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Int32Array::new(vals.int_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Int64 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Int64Array::new(vals.long_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Float32 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Float32Array::new(vals.float_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Float64 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Float64Array::new(vals.double_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Timestamp(TimeUnit::Microsecond, None) => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(TimestampMicrosecondArray::new(vals.long_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Timestamp(TimeUnit::Microsecond, Some(tz)) => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(TimestampMicrosecondArray::new(vals.long_values.into(), Some(vals.null_mask.into())).with_timezone(Arc::clone(tz)))) + .build_list_scalar() + } + DataType::Date32 => { + let vals = values.clone(); + SingleRowListArrayBuilder::new(Arc::new(Date32Array::new(vals.int_values.into(), Some(vals.null_mask.into())))) + .build_list_scalar() + } + DataType::Binary => { + // Using a builder here as it is quite complicated to create StringArray from a vector with nulls + // to calculate correct offsets + let vals = values.clone(); + let len = vals.bytes_values.len(); + let mut arr = BinaryBuilder::with_capacity(len, len); + + for (i, v) in vals.bytes_values.into_iter().enumerate() { + if vals.null_mask[i] { + arr.append_value(v); + } else { + arr.append_null(); + } + } + + SingleRowListArrayBuilder::new(Arc::new(arr.finish())) + .build_list_scalar() + } + DataType::Utf8 => { + // Using a builder here as it is quite complicated to create StringArray from a vector with nulls + // to calculate correct offsets + let vals = values.clone(); + let len = vals.string_values.len(); + let mut arr = StringBuilder::with_capacity(len, len); Review Comment: Maybe add a TODO that there could be a better heuristic for the second arg than `len` or maybe even serialize over the number of bytes _a priori_. -- 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