in crates/iceberg/src/spec/table_metadata_builder.rs [1065:1124]
fn reassign_ids(
schema: Schema,
spec: UnboundPartitionSpec,
sort_order: SortOrder,
) -> Result<(Schema, PartitionSpec, SortOrder)> {
// Re-assign field ids and schema ids for a new table.
let previous_id_to_name = schema.field_id_to_name_map().clone();
let fresh_schema = schema
.into_builder()
.with_schema_id(DEFAULT_SCHEMA_ID)
.with_reassigned_field_ids(FIRST_FIELD_ID)
.build()?;
// Re-build partition spec with new ids
let mut fresh_spec = PartitionSpecBuilder::new(fresh_schema.clone());
for field in spec.fields() {
let source_field_name = previous_id_to_name.get(&field.source_id).ok_or_else(|| {
Error::new(
ErrorKind::DataInvalid,
format!(
"Cannot find source column with id {} for partition column {} in schema.",
field.source_id, field.name
),
)
})?;
fresh_spec =
fresh_spec.add_partition_field(source_field_name, &field.name, field.transform)?;
}
let fresh_spec = fresh_spec.build()?;
// Re-build sort order with new ids
let mut fresh_order = SortOrder::builder();
for mut field in sort_order.fields {
let source_field_name = previous_id_to_name.get(&field.source_id).ok_or_else(|| {
Error::new(
ErrorKind::DataInvalid,
format!(
"Cannot find source column with id {} for sort column in schema.",
field.source_id
),
)
})?;
let new_field_id = fresh_schema
.field_by_name(source_field_name)
.ok_or_else(|| {
Error::new(
ErrorKind::Unexpected,
format!(
"Cannot find source column with name {} for sort column in re-assigned schema.",
source_field_name
),
)
})?.id;
field.source_id = new_field_id;
fresh_order.with_sort_field(field);
}
let fresh_sort_order = fresh_order.build(&fresh_schema)?;
Ok((fresh_schema, fresh_spec, fresh_sort_order))
}