in crates/iceberg/src/spec/schema/prune_columns.rs [132:169]
fn r#struct(
&mut self,
r#struct: &StructType,
results: Vec<Option<Type>>,
) -> Result<Option<Type>> {
let fields = r#struct.fields();
let mut selected_field = Vec::with_capacity(fields.len());
let mut same_type = true;
for (field, projected_type) in zip_eq(fields.iter(), results.iter()) {
if let Some(projected_type) = projected_type {
if *field.field_type == *projected_type {
selected_field.push(field.clone());
} else {
same_type = false;
let new_field = NestedField {
id: field.id,
name: field.name.clone(),
required: field.required,
field_type: Box::new(projected_type.clone()),
doc: field.doc.clone(),
initial_default: field.initial_default.clone(),
write_default: field.write_default.clone(),
};
selected_field.push(Arc::new(new_field));
}
}
}
if !selected_field.is_empty() {
if selected_field.len() == fields.len() && same_type {
return Ok(Some(Type::Struct(r#struct.clone())));
} else {
return Ok(Some(Type::Struct(StructType::new(selected_field))));
}
}
Ok(None)
}