Skip to content

Commit 29feaf7

Browse files
committed
Make sure refs are removed when removing snapshots
1 parent c5cbfe4 commit 29feaf7

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

pyiceberg/table/update/__init__.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,8 +468,18 @@ def _(update: RemoveSnapshotsUpdate, base_metadata: TableMetadata, context: _Tab
468468
for s in base_metadata.snapshots
469469
if s.snapshot_id not in update.snapshot_ids
470470
]
471+
472+
remove_ref_updates = (
473+
RemoveSnapshotRefUpdate(ref_name=ref_name)
474+
for ref_name, ref in base_metadata.refs.items()
475+
if ref.snapshot_id in update.snapshot_ids
476+
)
477+
new_metadata = base_metadata
478+
for remove_ref in remove_ref_updates:
479+
new_metadata = _apply_table_update(remove_ref, new_metadata, context)
480+
471481
context.add_update(update)
472-
return base_metadata.model_copy(update={"snapshots": snapshots})
482+
return new_metadata.model_copy(update={"snapshots": snapshots})
473483

474484

475485
@_apply_table_update.register(RemoveSnapshotRefUpdate)

tests/table/test_init.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -795,15 +795,18 @@ def test_update_metadata_set_snapshot_ref(table_v2: Table) -> None:
795795

796796

797797
def test_update_remove_snapshots(table_v2: Table) -> None:
798-
update = RemoveSnapshotsUpdate(
799-
snapshot_ids=[3051729675574597004],
800-
)
798+
# assert fixture data to easily understand the test assumptions
799+
assert len(table_v2.metadata.snapshots) == 2
800+
assert len(table_v2.metadata.refs) == 2
801+
update = RemoveSnapshotsUpdate(snapshot_ids=[3051729675574597004])
801802
new_metadata = update_table_metadata(table_v2.metadata, (update,))
802803
assert len(new_metadata.snapshots) == 1
803804
assert new_metadata.snapshots[0].snapshot_id == 3055729675574597004
804805
assert new_metadata.snapshots[0].parent_snapshot_id == None
805806
assert new_metadata.current_snapshot_id == 3055729675574597004
806807
assert new_metadata.last_updated_ms > table_v2.metadata.last_updated_ms
808+
assert len(new_metadata.refs) == 1
809+
assert new_metadata.refs["main"].snapshot_id == 3055729675574597004
807810

808811

809812
def test_update_remove_snapshots_doesnt_exist(table_v2: Table) -> None:

0 commit comments

Comments
 (0)