Skip to content

Commit b10575c

Browse files
committed
undo warnings.warn
1 parent 8931ed0 commit b10575c

3 files changed

Lines changed: 36 additions & 19 deletions

File tree

pyiceberg/table/__init__.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ def delete(
641641
self.table_metadata.properties.get(TableProperties.DELETE_MODE, TableProperties.DELETE_MODE_DEFAULT)
642642
== TableProperties.DELETE_MODE_MERGE_ON_READ
643643
):
644-
raise NotImplementedError("Merge on read is not yet supported")
644+
warnings.warn("Merge on read is not yet supported, falling back to copy-on-write", stacklevel=2)
645645

646646
if isinstance(delete_filter, str):
647647
delete_filter = _parse_row_filter(delete_filter)
@@ -1829,9 +1829,6 @@ def from_rest_response(
18291829
18301830
Returns:
18311831
A FileScanTask with the converted data and delete files.
1832-
1833-
Raises:
1834-
NotImplementedError: If equality delete files are encountered.
18351832
"""
18361833
data_file = _rest_file_to_data_file(rest_task.data_file)
18371834

@@ -1850,18 +1847,28 @@ def from_rest_response(
18501847

18511848
def _rest_file_to_data_file(rest_file: RESTContentFile) -> DataFile:
18521849
"""Convert a REST content file to a manifest DataFile."""
1853-
from pyiceberg.catalog.rest.scan_planning import RESTDataFile
1850+
from pyiceberg.catalog.rest.scan_planning import RESTDataFile, RESTEqualityDeleteFile, RESTPositionDeleteFile
1851+
1852+
column_sizes = None
1853+
value_counts = None
1854+
null_value_counts = None
1855+
nan_value_counts = None
1856+
equality_ids = None
1857+
referenced_data_file = None
1858+
content_offset = None
1859+
content_size_in_bytes = None
18541860

18551861
if isinstance(rest_file, RESTDataFile):
18561862
column_sizes = rest_file.column_sizes.to_dict() if rest_file.column_sizes else None
18571863
value_counts = rest_file.value_counts.to_dict() if rest_file.value_counts else None
18581864
null_value_counts = rest_file.null_value_counts.to_dict() if rest_file.null_value_counts else None
18591865
nan_value_counts = rest_file.nan_value_counts.to_dict() if rest_file.nan_value_counts else None
1860-
else:
1861-
column_sizes = None
1862-
value_counts = None
1863-
null_value_counts = None
1864-
nan_value_counts = None
1866+
elif isinstance(rest_file, RESTEqualityDeleteFile):
1867+
equality_ids = rest_file.equality_ids
1868+
elif isinstance(rest_file, RESTPositionDeleteFile):
1869+
referenced_data_file = rest_file.referenced_data_file
1870+
content_offset = rest_file.content_offset
1871+
content_size_in_bytes = rest_file.content_size_in_bytes
18651872

18661873
data_file = DataFile.from_args(
18671874
content=DataFileContent.from_rest_type(rest_file.content),
@@ -1875,6 +1882,10 @@ def _rest_file_to_data_file(rest_file: RESTContentFile) -> DataFile:
18751882
null_value_counts=null_value_counts,
18761883
nan_value_counts=nan_value_counts,
18771884
split_offsets=rest_file.split_offsets,
1885+
equality_ids=equality_ids,
1886+
referenced_data_file=referenced_data_file,
1887+
content_offset=content_offset,
1888+
content_size_in_bytes=content_size_in_bytes,
18781889
sort_order_id=rest_file.sort_order_id,
18791890
)
18801891
data_file.spec_id = rest_file.spec_id

tests/catalog/test_scan_planning_models.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
ValueMap,
3939
)
4040
from pyiceberg.expressions import AlwaysTrue, EqualTo, Reference
41-
from pyiceberg.manifest import FileFormat
41+
from pyiceberg.manifest import DataFileContent, FileFormat
4242

4343
TEST_URI = "https://iceberg-test-catalog/"
4444

@@ -545,7 +545,7 @@ def test_plan_scan_cancelled(rest_scan_catalog: RestCatalog, requests_mock: Mock
545545
list(rest_scan_catalog.plan_scan(("db", "tbl"), request))
546546

547547

548-
def test_plan_scan_equality_deletes_not_supported(rest_scan_catalog: RestCatalog, requests_mock: Mocker) -> None:
548+
def test_plan_scan_equality_deletes_supported(rest_scan_catalog: RestCatalog, requests_mock: Mocker) -> None:
549549
file_one = _rest_data_file(file_path="s3://bucket/tbl/data/file1.parquet")
550550
equality_delete = _rest_equality_delete_file(equality_ids=[1, 2])
551551
requests_mock.post(
@@ -566,5 +566,11 @@ def test_plan_scan_equality_deletes_not_supported(rest_scan_catalog: RestCatalog
566566
)
567567

568568
request = PlanTableScanRequest()
569-
with pytest.raises(NotImplementedError, match="PyIceberg does not yet support equality deletes"):
570-
list(rest_scan_catalog.plan_scan(("db", "tbl"), request))
569+
tasks = list(rest_scan_catalog.plan_scan(("db", "tbl"), request))
570+
assert len(tasks) == 1
571+
task = tasks[0]
572+
assert task.file.file_path == "s3://bucket/tbl/data/file1.parquet"
573+
assert len(task.delete_files) == 1
574+
delete_file = list(task.delete_files)[0]
575+
assert delete_file.content == DataFileContent.EQUALITY_DELETES
576+
assert delete_file.equality_ids == [1, 2]

tests/table/test_snapshots.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,8 +587,8 @@ def test_block_writing_equality_deletes(table_schema_simple: Schema, catalog: Ca
587587
assert "PyIceberg does not support writing DataFileContent.EQUALITY_DELETES" in str(exc.value)
588588

589589

590-
def test_delete_mode_mor_raises_error(table_schema_simple: Schema, catalog: Catalog) -> None:
591-
identifier = "default.test_delete_mode_mor_raises_error"
590+
def test_delete_mode_mor_warns(table_schema_simple: Schema, catalog: Catalog) -> None:
591+
identifier = "default.test_delete_mode_mor_warns"
592592
catalog.create_namespace("default")
593593

594594
catalog.create_table(
@@ -599,7 +599,7 @@ def test_delete_mode_mor_raises_error(table_schema_simple: Schema, catalog: Cata
599599

600600
tbl = catalog.load_table(identifier)
601601

602-
with pytest.raises(NotImplementedError) as exc:
603-
tbl.delete("id = 1")
602+
with pytest.warns() as record:
603+
tbl.delete("foo = 'a'")
604604

605-
assert "Merge on read is not yet supported" in str(exc.value)
605+
assert any("Merge on read is not yet supported, falling back to copy-on-write" in str(w.message) for w in record)

0 commit comments

Comments
 (0)