use arrow::array::*;
use crate::deserialize::{ArRowDeserialize, DeserializationError, DeserializationTarget};
pub fn read_from_dictionary_array<'a, 'b, T, Item>(
src: &dyn AnyDictionaryArray,
mut dst: &'b mut T,
) -> Result<usize, DeserializationError>
where
Item: 'a + Clone + ArRowDeserialize,
&'b mut T: DeserializationTarget<'a, Item = Item> + 'b,
{
if src.nulls().is_some() {
return Err(DeserializationError::UnexpectedNull(format!(
"{} column contains nulls",
std::any::type_name::<Item>(),
)));
};
let deserialized_values = <Item>::from_array(src.values().clone())?;
for (key, d) in src.normalized_keys().into_iter().zip(dst.iter_mut()) {
*d = deserialized_values
.get(key)
.ok_or_else(|| DeserializationError::DictionaryOverflow {
key,
len: deserialized_values.len(),
data_type: src.data_type().clone(),
})?
.clone();
}
Ok(src.len())
}
pub fn read_options_from_dictionary_array<'a, 'b, T, Item>(
src: &dyn AnyDictionaryArray,
mut dst: &'b mut T,
) -> Result<usize, DeserializationError>
where
Item: 'a + Clone + ArRowDeserialize,
Option<Item>: 'a + Clone + ArRowDeserialize,
&'b mut T: DeserializationTarget<'a, Item = Option<Item>> + 'b,
{
let deserialized_values = <Item>::from_array(src.values().clone())?;
match src.nulls() {
None => read_from_dictionary_array(src, dst),
Some(nulls) => {
for ((not_null, key), d) in nulls
.iter()
.zip(src.normalized_keys().into_iter())
.zip(dst.iter_mut())
{
if not_null {
*d = Some(
deserialized_values
.get(key)
.ok_or_else(|| DeserializationError::DictionaryOverflow {
key,
len: deserialized_values.len(),
data_type: src.data_type().clone(),
})?
.clone(),
);
} else {
*d = None;
}
}
Ok(src.len())
}
}
}