nyx_space/io/
parquet_string.rs1use 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}