2727from typing_extensions import Annotated
2828
2929from pyiceberg .exceptions import CommitFailedException
30- from pyiceberg .partitioning import PARTITION_FIELD_ID_START , PartitionSpec
30+ from pyiceberg .partitioning import INITIAL_PARTITION_SPEC_ID , PARTITION_FIELD_ID_START , PartitionSpec
3131from pyiceberg .schema import Schema
3232from pyiceberg .table .metadata import SUPPORTED_TABLE_FORMAT_VERSION , TableMetadata , TableMetadataUtil
3333from pyiceberg .table .refs import MAIN_BRANCH , SnapshotRef
3636 Snapshot ,
3737 SnapshotLogEntry ,
3838)
39- from pyiceberg .table .sorting import SortOrder
39+ from pyiceberg .table .sorting import UNSORTED_SORT_ORDER , SortOrder
4040from pyiceberg .typedef import (
4141 IcebergBaseModel ,
4242 Properties ,
@@ -90,8 +90,6 @@ class AddSchemaUpdate(IcebergBaseModel):
9090 # This field is required: https://github.com/apache/iceberg/pull/7445
9191 last_column_id : int = Field (alias = "last-column-id" )
9292
93- initial_change : bool = Field (default = False , exclude = True )
94-
9593
9694class SetCurrentSchemaUpdate (IcebergBaseModel ):
9795 action : Literal ["set-current-schema" ] = Field (default = "set-current-schema" )
@@ -104,8 +102,6 @@ class AddPartitionSpecUpdate(IcebergBaseModel):
104102 action : Literal ["add-spec" ] = Field (default = "add-spec" )
105103 spec : PartitionSpec
106104
107- initial_change : bool = Field (default = False , exclude = True )
108-
109105
110106class SetDefaultSpecUpdate (IcebergBaseModel ):
111107 action : Literal ["set-default-spec" ] = Field (default = "set-default-spec" )
@@ -118,8 +114,6 @@ class AddSortOrderUpdate(IcebergBaseModel):
118114 action : Literal ["add-sort-order" ] = Field (default = "add-sort-order" )
119115 sort_order : SortOrder = Field (alias = "sort-order" )
120116
121- initial_change : bool = Field (default = False , exclude = True )
122-
123117
124118class SetDefaultSortOrderUpdate (IcebergBaseModel ):
125119 action : Literal ["set-default-sort-order" ] = Field (default = "set-default-sort-order" )
@@ -304,9 +298,10 @@ def _(update: AddSchemaUpdate, base_metadata: TableMetadata, context: _TableMeta
304298 if update .last_column_id < base_metadata .last_column_id :
305299 raise ValueError (f"Invalid last column id { update .last_column_id } , must be >= { base_metadata .last_column_id } " )
306300
301+ skip_empty_schema = base_metadata .schemas == [Schema ()]
307302 metadata_updates : Dict [str , Any ] = {
308303 "last_column_id" : update .last_column_id ,
309- "schemas" : [update .schema_ ] if update . initial_change else base_metadata .schemas + [update .schema_ ],
304+ "schemas" : [update .schema_ ] if skip_empty_schema else base_metadata .schemas + [update .schema_ ],
310305 }
311306
312307 context .add_update (update )
@@ -335,19 +330,23 @@ def _(update: SetCurrentSchemaUpdate, base_metadata: TableMetadata, context: _Ta
335330
336331@_apply_table_update .register (AddPartitionSpecUpdate )
337332def _ (update : AddPartitionSpecUpdate , base_metadata : TableMetadata , context : _TableMetadataUpdateContext ) -> TableMetadata :
333+ context .add_update (update )
334+ if update .spec .spec_id == INITIAL_PARTITION_SPEC_ID :
335+ # no op
336+ return base_metadata
337+
338338 for spec in base_metadata .partition_specs :
339- if spec .spec_id == update .spec .spec_id and not update . initial_change :
339+ if spec .spec_id == update .spec .spec_id :
340340 raise ValueError (f"Partition spec with id { spec .spec_id } already exists: { spec } " )
341341
342342 metadata_updates : Dict [str , Any ] = {
343- "partition_specs" : [ update . spec ] if update . initial_change else base_metadata .partition_specs + [update .spec ],
343+ "partition_specs" : base_metadata .partition_specs + [update .spec ],
344344 "last_partition_id" : max (
345345 max ([field .field_id for field in update .spec .fields ], default = 0 ),
346346 base_metadata .last_partition_id or PARTITION_FIELD_ID_START - 1 ,
347347 ),
348348 }
349349
350- context .add_update (update )
351350 return base_metadata .model_copy (update = metadata_updates )
352351
353352
@@ -443,12 +442,22 @@ def _(update: SetSnapshotRefUpdate, base_metadata: TableMetadata, context: _Tabl
443442 return base_metadata .model_copy (update = metadata_updates )
444443
445444
445+ @_apply_table_update .register (RemoveSnapshotRefUpdate )
446+ def _ (update : RemoveSnapshotRefUpdate , base_metadata : TableMetadata , context : _TableMetadataUpdateContext ) -> TableMetadata :
447+ # (TODO) actually implement this
448+ context .add_update (update )
449+ return base_metadata
450+
451+
446452@_apply_table_update .register (AddSortOrderUpdate )
447453def _ (update : AddSortOrderUpdate , base_metadata : TableMetadata , context : _TableMetadataUpdateContext ) -> TableMetadata :
448454 context .add_update (update )
455+ if update .sort_order == UNSORTED_SORT_ORDER :
456+ # no op
457+ return base_metadata
449458 return base_metadata .model_copy (
450459 update = {
451- "sort_orders" : [ update . sort_order ] if update . initial_change else base_metadata .sort_orders + [update .sort_order ],
460+ "sort_orders" : base_metadata .sort_orders + [update .sort_order ],
452461 }
453462 )
454463
0 commit comments