Skip to main content

nyx_space/io/
parquet_string.rs

1use arrow::{
2    array::{Array, LargeStringArray, StringArray},
3    error::ArrowError,
4};
5use std::sync::Arc;
6
7pub enum AbstractStringArray<'a> {
8    Small(&'a StringArray),
9    Large(&'a LargeStringArray),
10}
11
12impl<'a> AbstractStringArray<'a> {
13    pub fn value(&self, i: usize) -> &str {
14        match self {
15            AbstractStringArray::Small(s) => s.value(i),
16            AbstractStringArray::Large(s) => s.value(i),
17        }
18    }
19
20    pub fn is_null(&self, i: usize) -> bool {
21        match self {
22            AbstractStringArray::Small(s) => s.is_null(i),
23            AbstractStringArray::Large(s) => s.is_null(i),
24        }
25    }
26
27    pub fn is_valid(&self, i: usize) -> bool {
28        match self {
29            AbstractStringArray::Small(s) => s.is_valid(i),
30            AbstractStringArray::Large(s) => s.is_valid(i),
31        }
32    }
33}
34
35impl<'a> TryFrom<&'a Arc<dyn Array>> for AbstractStringArray<'a> {
36    type Error = ArrowError;
37
38    fn try_from(array: &'a Arc<dyn Array>) -> Result<Self, Self::Error> {
39        if let Some(s) = array.as_any().downcast_ref::<StringArray>() {
40            Ok(AbstractStringArray::Small(s))
41        } else {
42            match array.as_any().downcast_ref::<LargeStringArray>() {
43                Some(downcasted) => Ok(Self::Large(downcasted)),
44                None => Err(ArrowError::CastError(
45                    "column is neither StringArray nor LargeStringArray".to_string(),
46                )),
47            }
48        }
49    }
50}