From 61dbca1bb692d11ce6b3ed3588cb6761adfdff7e Mon Sep 17 00:00:00 2001 From: Sergei Patiakin Date: Mon, 28 Apr 2025 11:59:17 +0200 Subject: [PATCH 1/2] Reorder steps in Operation::execute for Operation::UpdateRepresentation --- iceberg-rust/src/view/transaction/operation.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iceberg-rust/src/view/transaction/operation.rs b/iceberg-rust/src/view/transaction/operation.rs index 94b4e81f..41cd340c 100644 --- a/iceberg-rust/src/view/transaction/operation.rs +++ b/iceberg-rust/src/view/transaction/operation.rs @@ -77,16 +77,16 @@ impl Operation { uuid: metadata.view_uuid, }), vec![ + ViewUpdate::AddSchema { + schema: Schema::from_struct_type(schema, schema_id, None), + last_column_id: Some(last_column_id), + }, ViewUpdate::AddViewVersion { view_version: version, }, ViewUpdate::SetCurrentViewVersion { view_version_id: version_id, }, - ViewUpdate::AddSchema { - schema: Schema::from_struct_type(schema, schema_id, None), - last_column_id: Some(last_column_id), - }, ViewUpdate::SetProperties { updates: HashMap::from_iter(vec![( REF_PREFIX.to_string() + &branch_name, From 75340b9c284a152955cc029b123cfa92fe7d18dc Mon Sep 17 00:00:00 2001 From: Sergei Patiakin Date: Mon, 28 Apr 2025 13:35:43 +0200 Subject: [PATCH 2/2] Conditional AddSchema --- .../src/view/transaction/operation.rs | 53 ++++++++++++------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/iceberg-rust/src/view/transaction/operation.rs b/iceberg-rust/src/view/transaction/operation.rs index 41cd340c..0c6fdf57 100644 --- a/iceberg-rust/src/view/transaction/operation.rs +++ b/iceberg-rust/src/view/transaction/operation.rs @@ -47,9 +47,17 @@ impl Operation { schema, branch, } => { + let schema_changed = metadata.current_schema(branch.as_deref()) + .map(|s| schema != *s.fields()) + .unwrap_or(true); + let version = metadata.current_version(branch.as_deref())?; let version_id = metadata.versions.keys().max().unwrap_or(&0) + 1; - let schema_id = metadata.schemas.keys().max().unwrap_or(&0) + 1; + let schema_id = if schema_changed { + metadata.schemas.keys().max().unwrap_or(&0) + 1 + } else { + *metadata.current_schema(branch.as_deref()).unwrap().schema_id() + }; let last_column_id = schema.iter().map(|x| x.id).max().unwrap_or(0); let version = Version { @@ -72,28 +80,35 @@ impl Operation { let branch_name = branch.unwrap_or("main".to_string()); + let mut view_updates: Vec> = if schema_changed { + vec![ViewUpdate::AddSchema { + schema: Schema::from_struct_type(schema, schema_id, None), + last_column_id: Some(last_column_id), + }] + } else { + vec![] + }; + + view_updates.append(&mut vec![ + ViewUpdate::AddViewVersion { + view_version: version, + }, + ViewUpdate::SetCurrentViewVersion { + view_version_id: version_id, + }, + ViewUpdate::SetProperties { + updates: HashMap::from_iter(vec![( + REF_PREFIX.to_string() + &branch_name, + version_id.to_string(), + )]), + }, + ]); + Ok(( Some(ViewRequirement::AssertViewUuid { uuid: metadata.view_uuid, }), - vec![ - ViewUpdate::AddSchema { - schema: Schema::from_struct_type(schema, schema_id, None), - last_column_id: Some(last_column_id), - }, - ViewUpdate::AddViewVersion { - view_version: version, - }, - ViewUpdate::SetCurrentViewVersion { - view_version_id: version_id, - }, - ViewUpdate::SetProperties { - updates: HashMap::from_iter(vec![( - REF_PREFIX.to_string() + &branch_name, - version_id.to_string(), - )]), - }, - ], + view_updates, )) } Operation::UpdateProperties(entries) => Ok((