in crates/iceberg/src/arrow/record_batch_projector.rs [80:115]
fn fetch_field_index<F1, F2>(
fields: &Fields,
index_vec: &mut Vec<usize>,
target_field_id: i64,
field_id_fetch_func: &F1,
searchable_field_func: &F2,
) -> Result<Option<FieldRef>>
where
F1: Fn(&Field) -> Result<Option<i64>>,
F2: Fn(&Field) -> bool,
{
for (pos, field) in fields.iter().enumerate() {
let id = field_id_fetch_func(field)?;
if let Some(id) = id {
if target_field_id == id {
index_vec.push(pos);
return Ok(Some(field.clone()));
}
}
if let DataType::Struct(inner) = field.data_type() {
if searchable_field_func(field) {
if let Some(res) = Self::fetch_field_index(
inner,
index_vec,
target_field_id,
field_id_fetch_func,
searchable_field_func,
)? {
index_vec.push(pos);
return Ok(Some(res));
}
}
}
}
Ok(None)
}