diff --git a/pyiceberg/expressions/visitors.py b/pyiceberg/expressions/visitors.py index 209a57a325..51b47db991 100644 --- a/pyiceberg/expressions/visitors.py +++ b/pyiceberg/expressions/visitors.py @@ -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)) diff --git a/tests/expressions/test_evaluator.py b/tests/expressions/test_evaluator.py index f4c2f89491..57c06af71e 100644 --- a/tests/expressions/test_evaluator.py +++ b/tests/expressions/test_evaluator.py @@ -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: