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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]