Skip to content

Commit ab1e3b8

Browse files
committed
Add RemovePartitionSpecsUpdate event
1 parent ca70442 commit ab1e3b8

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

pyiceberg/table/update/__init__.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ class RemoveStatisticsUpdate(IcebergBaseModel):
197197
action: Literal["remove-statistics"] = Field(default="remove-statistics")
198198
snapshot_id: int = Field(alias="snapshot-id")
199199

200+
class RemovePartitionSpecsUpdate(IcebergBaseModel):
201+
action: Literal["remove-partition-spec"] = Field(default="remove-partition-spec")
202+
spec_ids: List[int] = Field(alias="spec-ids")
203+
200204

201205
TableUpdate = Annotated[
202206
Union[
@@ -217,6 +221,7 @@ class RemoveStatisticsUpdate(IcebergBaseModel):
217221
RemovePropertiesUpdate,
218222
SetStatisticsUpdate,
219223
RemoveStatisticsUpdate,
224+
RemovePartitionSpecsUpdate,
220225
],
221226
Field(discriminator="action"),
222227
]
@@ -581,6 +586,21 @@ def _(update: RemoveStatisticsUpdate, base_metadata: TableMetadata, context: _Ta
581586

582587
return base_metadata.model_copy(update={"statistics": statistics})
583588

589+
@_apply_table_update.register(RemovePartitionSpecsUpdate)
590+
def _(update: RemovePartitionSpecsUpdate, base_metadata: TableMetadata, context: _TableMetadataUpdateContext) -> TableMetadata:
591+
for remove_spec_id in update.spec_ids:
592+
if not any(spec.spec_id == remove_spec_id for spec in base_metadata.partition_specs):
593+
raise ValueError(f"Partition spec with id {remove_spec_id} does not exist")
594+
595+
if base_metadata.default_spec_id in update.spec_ids:
596+
raise ValueError(f"Cannot remove default partition spec: {base_metadata.default_spec_id}")
597+
598+
partition_specs = [spec for spec in base_metadata.partition_specs if spec.spec_id not in update.spec_ids]
599+
600+
context.add_update(update)
601+
return base_metadata.model_copy(update={"partition_specs": partition_specs})
602+
603+
584604

585605
def update_table_metadata(
586606
base_metadata: TableMetadata,

tests/table/test_init.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
)
6767
from pyiceberg.table.statistics import BlobMetadata, StatisticsFile
6868
from pyiceberg.table.update import (
69+
AddPartitionSpecUpdate,
6970
AddSnapshotUpdate,
7071
AddSortOrderUpdate,
7172
AssertCreate,
@@ -76,6 +77,7 @@
7677
AssertLastAssignedPartitionId,
7778
AssertRefSnapshotId,
7879
AssertTableUUID,
80+
RemovePartitionSpecUpdate,
7981
RemovePropertiesUpdate,
8082
RemoveSnapshotRefUpdate,
8183
RemoveSnapshotsUpdate,
@@ -1267,6 +1269,40 @@ def test_update_metadata_log_overflow(table_v2: Table) -> None:
12671269
assert len(new_metadata.metadata_log) == 1
12681270

12691271

1272+
def test_remove_partition_spec_update(table_v2: Table) -> None:
1273+
base_metadata = table_v2.metadata
1274+
new_spec = PartitionSpec(
1275+
PartitionField(source_id=2, field_id=1001, transform=IdentityTransform(), name="y"), spec_id=1
1276+
)
1277+
metadata_with_new_spec = update_table_metadata(base_metadata, (AddPartitionSpecUpdate(spec=new_spec),))
1278+
1279+
assert len(metadata_with_new_spec.partition_specs) == 2
1280+
1281+
update = RemovePartitionSpecUpdate(spec_ids=[1])
1282+
updated_metadata = update_table_metadata(
1283+
metadata_with_new_spec,
1284+
(update,),
1285+
)
1286+
1287+
assert len(updated_metadata.partition_specs) == 1
1288+
1289+
1290+
def test_remove_partition_spec_update_spec_does_not_exist(table_v2: Table) -> None:
1291+
update = RemovePartitionSpecUpdate(
1292+
spec_ids=[123],
1293+
)
1294+
with pytest.raises(ValueError, match="Partition spec with id 123 does not exist"):
1295+
update_table_metadata(table_v2.metadata, (update,))
1296+
1297+
1298+
def test_remove_partition_spec_update_default_spec(table_v2: Table) -> None:
1299+
update = RemovePartitionSpecUpdate(
1300+
spec_ids=[0],
1301+
)
1302+
with pytest.raises(ValueError, match="Cannot remove default partition spec: 0"):
1303+
update_table_metadata(table_v2.metadata, (update,))
1304+
1305+
12701306
def test_set_statistics_update(table_v2_with_statistics: Table) -> None:
12711307
snapshot_id = table_v2_with_statistics.metadata.current_snapshot_id
12721308

0 commit comments

Comments
 (0)