Skip to content

Commit 72d04a7

Browse files
committed
use field name to find field pos when field id is unavailable
1 parent bc469c3 commit 72d04a7

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

crates/iceberg/src/arrow/value.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ impl SchemaWithPartnerVisitor<ArrayRef> for ArrowArrayToIcebergStructConverter {
429429
pub struct ArrowArrayAccessor;
430430

431431
impl PartnerAccessor<ArrayRef> for ArrowArrayAccessor {
432-
fn struct_parner<'a>(&self, schema_partner: &'a ArrayRef) -> Result<&'a ArrayRef> {
432+
fn struct_partner<'a>(&self, schema_partner: &'a ArrayRef) -> Result<&'a ArrayRef> {
433433
if !matches!(schema_partner.data_type(), DataType::Struct(_)) {
434434
return Err(Error::new(
435435
ErrorKind::DataInvalid,
@@ -463,10 +463,19 @@ impl PartnerAccessor<ArrayRef> for ArrowArrayAccessor {
463463
.map(|id| id == field.id)
464464
.unwrap_or(false)
465465
})
466+
.or_else(|| {
467+
struct_array
468+
.fields()
469+
.iter()
470+
.position(|arrow_field| arrow_field.name().clone() == field.name)
471+
})
466472
.ok_or_else(|| {
467473
Error::new(
468474
ErrorKind::DataInvalid,
469-
format!("Field id {} not found in struct array", field.id),
475+
format!(
476+
"Field with id={} or name={} not found in struct array",
477+
field.id, field.name
478+
),
470479
)
471480
})?;
472481

crates/iceberg/src/spec/schema/visitor.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ pub trait SchemaWithPartnerVisitor<P> {
190190
/// Accessor used to get child partner from parent partner.
191191
pub trait PartnerAccessor<P> {
192192
/// Get the struct partner from schema partner.
193-
fn struct_parner<'a>(&self, schema_partner: &'a P) -> Result<&'a P>;
193+
fn struct_partner<'a>(&self, schema_partner: &'a P) -> Result<&'a P>;
194194
/// Get the field partner from struct partner.
195195
fn field_partner<'a>(&self, struct_partner: &'a P, field: &NestedField) -> Result<&'a P>;
196196
/// Get the list element partner from list partner.
@@ -274,7 +274,7 @@ pub fn visit_schema_with_partner<P, V: SchemaWithPartnerVisitor<P>, A: PartnerAc
274274
) -> Result<V::T> {
275275
let result = visit_struct_with_partner(
276276
&schema.r#struct,
277-
accessor.struct_parner(partner)?,
277+
accessor.struct_partner(partner)?,
278278
visitor,
279279
accessor,
280280
)?;

0 commit comments

Comments
 (0)