in crates/iceberg/src/arrow/value.rs [169:201]
fn map(
&mut self,
_map: &MapType,
partner: &ArrayRef,
key_values: Vec<Option<Literal>>,
values: Vec<Option<Literal>>,
) -> Result<Vec<Option<Literal>>> {
// Make sure key_value and value have the same row length
if key_values.len() != values.len() {
return Err(Error::new(
ErrorKind::DataInvalid,
"The key value and value of map should have the same row length",
));
}
let offsets = partner
.as_any()
.downcast_ref::<MapArray>()
.ok_or_else(|| Error::new(ErrorKind::DataInvalid, "The partner is not a map array"))?
.offsets();
// combine the result according to the offset
let mut result = Vec::with_capacity(offsets.len() - 1);
for i in 0..offsets.len() - 1 {
let start = offsets[i] as usize;
let end = offsets[i + 1] as usize;
let mut map = Map::new();
for (key, value) in key_values[start..end].iter().zip(values[start..end].iter()) {
map.insert(key.clone().unwrap(), value.clone());
}
result.push(Some(Literal::Map(map)));
}
Ok(result)
}