in crates/iceberg/src/spec/partition.rs [462:505]
fn set_field_ids(
fields: Vec<UnboundPartitionField>,
last_assigned_field_id: i32,
) -> Result<Vec<PartitionField>> {
let mut last_assigned_field_id = last_assigned_field_id;
// Already assigned partition ids. If we see one of these during iteration,
// we skip it.
let assigned_ids = fields
.iter()
.filter_map(|f| f.field_id)
.collect::<std::collections::HashSet<_>>();
fn _check_add_1(prev: i32) -> Result<i32> {
prev.checked_add(1).ok_or_else(|| {
Error::new(
ErrorKind::DataInvalid,
"Cannot assign more partition ids. Overflow.",
)
})
}
let mut bound_fields = Vec::with_capacity(fields.len());
for field in fields.into_iter() {
let partition_field_id = if let Some(partition_field_id) = field.field_id {
last_assigned_field_id = std::cmp::max(last_assigned_field_id, partition_field_id);
partition_field_id
} else {
last_assigned_field_id = _check_add_1(last_assigned_field_id)?;
while assigned_ids.contains(&last_assigned_field_id) {
last_assigned_field_id = _check_add_1(last_assigned_field_id)?;
}
last_assigned_field_id
};
bound_fields.push(PartitionField {
source_id: field.source_id,
field_id: partition_field_id,
name: field.name,
transform: field.transform,
})
}
Ok(bound_fields)
}