|
22 | 22 | import pytest |
23 | 23 |
|
24 | 24 | import pyiceberg.table as table_module |
25 | | -from pyiceberg.expressions import BooleanExpression, GreaterThan |
| 25 | +from pyiceberg.expressions import BooleanExpression, EqualTo, GreaterThan |
26 | 26 | from pyiceberg.manifest import DataFile, FileFormat |
27 | 27 | from pyiceberg.schema import Schema |
28 | 28 | from pyiceberg.table import ManifestGroupPlanner, Table |
@@ -63,3 +63,32 @@ def evaluate(struct: StructProtocol) -> bool: |
63 | 63 | assert not partition_evaluator(_data_file(1, 1)) |
64 | 64 | assert partition_evaluator(_data_file(2, 10)) |
65 | 65 | assert evaluator_calls == [[1, 10]] |
| 66 | + |
| 67 | + |
| 68 | +def test_metrics_evaluator_prepares_once_per_plan(table_v2: Table, monkeypatch: pytest.MonkeyPatch) -> None: |
| 69 | + class CountingMetricsEvaluator: |
| 70 | + def __init__( |
| 71 | + self, |
| 72 | + schema: Schema, |
| 73 | + expr: BooleanExpression, |
| 74 | + case_sensitive: bool = True, |
| 75 | + include_empty_files: bool = False, |
| 76 | + ) -> None: |
| 77 | + self.calls: list[DataFile] = [] |
| 78 | + instances.append(self) |
| 79 | + |
| 80 | + def eval(self, data_file: DataFile) -> bool: |
| 81 | + self.calls.append(data_file) |
| 82 | + return True |
| 83 | + |
| 84 | + instances: list[CountingMetricsEvaluator] = [] |
| 85 | + monkeypatch.setattr(table_module, "_InclusiveMetricsEvaluator", CountingMetricsEvaluator) |
| 86 | + planner = ManifestGroupPlanner(table_metadata=table_v2.metadata, io=table_v2.io, row_filter=EqualTo("x", 10)) |
| 87 | + first_file = _data_file(1, 1) |
| 88 | + second_file = _data_file(2, 2) |
| 89 | + |
| 90 | + metrics_evaluator = planner._build_metrics_evaluator() |
| 91 | + assert len(instances) == 1 |
| 92 | + assert metrics_evaluator(first_file) |
| 93 | + assert metrics_evaluator(second_file) |
| 94 | + assert instances[0].calls == [first_file, second_file] |
0 commit comments