You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@arrow.apache.org by "Jorge Leitão (Jira)" <ji...@apache.org> on 2021/01/31 14:38:00 UTC

[jira] [Resolved] (ARROW-11394) [Rust] Slice + Concat incorrect for structs

     [ https://issues.apache.org/jira/browse/ARROW-11394?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jorge Leitão resolved ARROW-11394.
----------------------------------
    Fix Version/s: 4.0.0
       Resolution: Fixed

Issue resolved by pull request 9339
[https://github.com/apache/arrow/pull/9339]

> [Rust] Slice + Concat incorrect for structs
> -------------------------------------------
>
>                 Key: ARROW-11394
>                 URL: https://issues.apache.org/jira/browse/ARROW-11394
>             Project: Apache Arrow
>          Issue Type: Bug
>          Components: Rust
>    Affects Versions: 3.0.0
>            Reporter: Ben Chambers
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 4.0.0
>
>          Time Spent: 2h 20m
>  Remaining Estimate: 0h
>
> If you slice an array and then use it with {{concat}} you get different behaviors when using a primitive array (Float64 in the examples) or a struct array.
> In the case of a float, the result is what I'd expect -- it concatenates the elements from the slice.
> In the case of a struct, it is a bit surprising -- the result has the length of the slice, but starts at the beginning of the original array.
> {code:java}
> // #[test]
> fn test_repro() {
>     // Create float and struct array.
>     let float_array: ArrayRef = Arc::new(Float64Array::from(vec![1.0, 2.0, 3.0, 4.0]));
>     let struct_array = Arc::new(StructArray::from(vec![(
>         Field::new("field", DataType::Float64, true),
>         float_array.clone(),
>     )]));
>     // Slice the float array and verify result is [3.0, 4.0]
>     let float_array_slice_ref = float_array.slice(2, 2);
>     let float_array_slice = float_array_slice_ref
>         .as_any()
>         .downcast_ref::<PrimitiveArray<Float64Type>>()
>         .unwrap();
>     assert_eq!(float_array_slice, &Float64Array::from(vec![3.0, 4.0]));
>     // Slice the struct array and verify result is [3.0, 4.0]
>     let struct_array_slice_ref = struct_array.slice(2, 2);
>     let struct_array_slice = struct_array_slice_ref
>         .as_any()
>         .downcast_ref::<StructArray>()
>         .unwrap();
>     let struct_array_slice_floats = struct_array_slice
>         .column(0)
>         .as_any()
>         .downcast_ref::<PrimitiveArray<Float64Type>>()
>         .unwrap();
>     assert_eq!(
>         struct_array_slice_floats,
>         &Float64Array::from(vec![3.0, 4.0])
>     );
>     // Concat the float array, and verify the result is still [3.0, 4.0].
>     let concat_float_array_ref =
>         arrow::compute::kernels::concat::concat(&[float_array_slice]).unwrap();
>     let concat_float_array = concat_float_array_ref
>         .as_any()
>         .downcast_ref::<PrimitiveArray<Float64Type>>()
>         .unwrap();
>     assert_eq!(concat_float_array, &Float64Array::from(vec![3.0, 4.0]));
>     // Concat the struct array and expect it to match the float array [3.0, 4.0].
>     let concat_struct_array_ref =
>         arrow::compute::kernels::concat::concat(&[struct_array_slice]).unwrap();
>     let concat_struct_array = concat_struct_array_ref
>         .as_any()
>         .downcast_ref::<StructArray>()
>         .unwrap();
>     let concat_struct_array_floats = concat_struct_array
>         .column(0)
>         .as_any()
>         .downcast_ref::<PrimitiveArray<Float64Type>>()
>         .unwrap();
>     // This is what is actually returned
>     assert_eq!(
>         concat_struct_array_floats,
>         &Float64Array::from(vec![1.0, 2.0])
>     );
>     // This is what I'd expect, but fails:
>     assert_eq!(
>         concat_struct_array_floats,
>         &Float64Array::from(vec![3.0, 4.0])
>     );
> }{code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)