in crates/iceberg/src/arrow/value.rs [103:167]
fn list(
&mut self,
list: &ListType,
array: &ArrayRef,
elements: Vec<Option<Literal>>,
) -> Result<Vec<Option<Literal>>> {
if list.element_field.required && elements.iter().any(Option::is_none) {
return Err(Error::new(
ErrorKind::DataInvalid,
"The list should not have null value",
));
}
match array.data_type() {
DataType::List(_) => {
let offset = array
.as_any()
.downcast_ref::<ListArray>()
.ok_or_else(|| {
Error::new(ErrorKind::DataInvalid, "The partner is not a list array")
})?
.offsets();
// combine the result according to the offset
let mut result = Vec::with_capacity(offset.len() - 1);
for i in 0..offset.len() - 1 {
let start = offset[i] as usize;
let end = offset[i + 1] as usize;
result.push(Some(Literal::List(elements[start..end].to_vec())));
}
Ok(result)
}
DataType::LargeList(_) => {
let offset = array
.as_any()
.downcast_ref::<LargeListArray>()
.ok_or_else(|| {
Error::new(
ErrorKind::DataInvalid,
"The partner is not a large list array",
)
})?
.offsets();
// combine the result according to the offset
let mut result = Vec::with_capacity(offset.len() - 1);
for i in 0..offset.len() - 1 {
let start = offset[i] as usize;
let end = offset[i + 1] as usize;
result.push(Some(Literal::List(elements[start..end].to_vec())));
}
Ok(result)
}
DataType::FixedSizeList(_, len) => {
let mut result = Vec::with_capacity(elements.len() / *len as usize);
for i in 0..elements.len() / *len as usize {
let start = i * *len as usize;
let end = (i + 1) * *len as usize;
result.push(Some(Literal::List(elements[start..end].to_vec())));
}
Ok(result)
}
_ => Err(Error::new(
ErrorKind::DataInvalid,
"The partner is not a list type",
)),
}
}