Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions pyiceberg/expressions/visitors.py
Original file line number Diff line number Diff line change
Expand Up @@ -1527,12 +1527,14 @@ def eval(self, file: DataFile) -> bool:
Returns: false if the file may contain any row that doesn't match
the expression, true otherwise.
"""
if file.record_count <= 0:
# Older version don't correctly implement record count from avro file and thus
# set record count -1 when importing avro tables to iceberg tables. This should
# be updated once we implemented and set correct record count.
if file.record_count == 0:
return ROWS_MUST_MATCH

if file.record_count < 0:
# Older versions set the record count to -1 when importing Avro tables.
# Treat an unknown count conservatively rather than as an empty file.
return ROWS_MIGHT_NOT_MATCH

return visit(self.expr, _StrictMetricsEvaluationVisitor(self.struct, file))


Expand Down
2 changes: 1 addition & 1 deletion tests/expressions/test_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1523,7 +1523,7 @@ def test_metrics_evaluator_record_count_short_circuits() -> None:
)
assert _InclusiveMetricsEvaluator(schema, EqualTo("x", 10)).eval(negative_record_file) is ROWS_MIGHT_MATCH
assert _StrictMetricsEvaluator(schema, EqualTo("x", 10)).eval(zero_record_file) is ROWS_MUST_MATCH
assert _StrictMetricsEvaluator(schema, EqualTo("x", 10)).eval(negative_record_file) is ROWS_MUST_MATCH
assert _StrictMetricsEvaluator(schema, EqualTo("x", 10)).eval(negative_record_file) is ROWS_MIGHT_NOT_MATCH


def test_strict_not(schema_data_file: Schema, strict_data_file_1: DataFile) -> None:
Expand Down