arrow2_convert 0.5.0

Convert between nested rust types and Arrow with arrow2
Documentation
use arrow2::array::*;
use arrow2::chunk::Chunk;
use arrow2_convert::{serialize::*, ArrowField, ArrowSerialize};
use std::sync::Arc;

#[test]
fn test_flatten_chunk() {
    #[derive(Debug, Clone, ArrowField, ArrowSerialize)]
    struct Struct {
        a: i64,
        b: i64,
    }

    let target = Chunk::new(vec![
        Int64Array::from(&[Some(1), Some(2)]).boxed(),
        Int64Array::from(&[Some(1), Some(2)]).boxed(),
    ]);

    let array = vec![Struct { a: 1, b: 1 }, Struct { a: 2, b: 2 }];

    let array: Box<dyn Array> = array.try_into_arrow().unwrap();
    let chunk: Chunk<Box<dyn Array>> = Chunk::new(vec![array]);

    let flattened: Chunk<Box<dyn Array>> = chunk.flatten().unwrap();

    assert_eq!(flattened, target);
}

#[test]
fn test_flatten_chunk_empty_chunk_error() {
    let chunk: Chunk<Arc<dyn Array>> = Chunk::new(vec![]);
    assert!(chunk.flatten().is_err());
}

#[test]
fn test_flatten_chunk_no_single_struct_array_error() {
    #[derive(Debug, Clone, ArrowField, ArrowSerialize)]
    struct Struct {
        a: i64,
        b: String,
    }

    let array = vec![
        Struct {
            a: 1,
            b: "one".to_string(),
        },
        Struct {
            a: 2,
            b: "two".to_string(),
        },
    ];

    let array: Arc<dyn Array> = array.try_into_arrow().unwrap();

    let arrays = vec![array.clone(), array.clone()];
    let chunk = Chunk::new(arrays);

    assert!(chunk.flatten().is_err());
}

#[test]
fn test_flatten_chunk_type_not_struct_error() {
    let array: Arc<dyn Array> = Int32Array::from(&[Some(1), None, Some(3)]).arced();
    let chunk = Chunk::new(vec![array]);

    assert!(chunk.flatten().is_err());
}