Skip to content

Commit dd8d76d

Browse files
authored
Update last-updated-ms for DDL operations (#956)
* Update last-updated-ms for DDL operations * Update last-updated-ms if there are valid changes * Update unit tests
1 parent 055938d commit dd8d76d

File tree

4 files changed

+14
-1
lines changed

4 files changed

+14
-1
lines changed

pyiceberg/table/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -911,6 +911,9 @@ def is_added_sort_order(self, sort_order_id: int) -> bool:
911911
update.sort_order.order_id == sort_order_id for update in self._updates if isinstance(update, AddSortOrderUpdate)
912912
)
913913

914+
def has_changes(self) -> bool:
915+
return len(self._updates) > 0
916+
914917

915918
@singledispatch
916919
def _apply_table_update(update: TableUpdate, base_metadata: TableMetadata, context: _TableMetadataUpdateContext) -> TableMetadata:
@@ -1185,6 +1188,10 @@ def update_table_metadata(
11851188
for update in updates:
11861189
new_metadata = _apply_table_update(update, new_metadata, context)
11871190

1191+
# Update last_updated_ms if it was not updated by update operations
1192+
if context.has_changes() and base_metadata.last_updated_ms == new_metadata.last_updated_ms:
1193+
new_metadata = new_metadata.model_copy(update={"last_updated_ms": datetime_to_millis(datetime.now().astimezone())})
1194+
11881195
if enforce_validation:
11891196
return TableMetadataUtil.parse_obj(new_metadata.model_dump())
11901197
else:

tests/catalog/test_glue.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,7 @@ def test_create_table_transaction(
865865
partition_spec=PartitionSpec(PartitionField(source_id=1, field_id=1000, transform=IdentityTransform(), name="foo")),
866866
properties={"format-version": format_version},
867867
) as txn:
868+
last_updated_metadata = txn.table_metadata.last_updated_ms
868869
with txn.update_schema() as update_schema:
869870
update_schema.add_column(path="b", field_type=IntegerType())
870871

@@ -887,6 +888,7 @@ def test_create_table_transaction(
887888
assert table.spec().fields_by_source_id(2)[0].name == "bar"
888889
assert table.spec().fields_by_source_id(2)[0].field_id == 1001
889890
assert table.spec().fields_by_source_id(2)[0].transform == IdentityTransform()
891+
assert table.metadata.last_updated_ms > last_updated_metadata
890892

891893

892894
@mock_aws

tests/catalog/test_sql.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,7 @@ def test_commit_table(catalog: SqlCatalog, table_schema_nested: Schema, table_id
12701270
namespace = Catalog.namespace_from(table_identifier_nocatalog)
12711271
catalog.create_namespace(namespace)
12721272
table = catalog.create_table(table_identifier, table_schema_nested)
1273+
last_updated_ms = table.metadata.last_updated_ms
12731274

12741275
assert catalog._parse_metadata_version(table.metadata_location) == 0
12751276
assert table.metadata.current_schema_id == 0
@@ -1289,6 +1290,7 @@ def test_commit_table(catalog: SqlCatalog, table_schema_nested: Schema, table_id
12891290
assert new_schema
12901291
assert new_schema == update._apply()
12911292
assert new_schema.find_field("b").field_type == IntegerType()
1293+
assert updated_table_metadata.last_updated_ms > last_updated_ms
12921294

12931295

12941296
@pytest.mark.parametrize(

tests/table/test_init.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,7 @@ def test_apply_set_properties_update(table_v2: Table) -> None:
615615
"test_b": "test_b",
616616
"test_c": "test_c",
617617
}
618+
assert new_metadata_add_only.last_updated_ms > base_metadata.last_updated_ms
618619

619620

620621
def test_apply_remove_properties_update(table_v2: Table) -> None:
@@ -689,7 +690,7 @@ def test_update_metadata_add_snapshot(table_v2: Table) -> None:
689690
snapshot_id=25,
690691
parent_snapshot_id=19,
691692
sequence_number=200,
692-
timestamp_ms=1602638573590,
693+
timestamp_ms=1602638593590,
693694
manifest_list="s3:/a/b/c.avro",
694695
summary=Summary(Operation.APPEND),
695696
schema_id=3,
@@ -759,6 +760,7 @@ def test_update_metadata_add_update_sort_order(table_v2: Table) -> None:
759760
assert len(new_metadata.sort_orders) == 2
760761
assert new_metadata.sort_orders[-1] == new_sort_order
761762
assert new_metadata.default_sort_order_id == new_sort_order.order_id
763+
assert new_metadata.last_updated_ms > table_v2.metadata.last_updated_ms
762764

763765

764766
def test_update_metadata_update_sort_order_invalid(table_v2: Table) -> None:

0 commit comments

Comments
 (0)