apache / apache/iceberg-python
TruncateTransform.satisfies_order_of raises AttributeError for different widths
- Vorherrschende Sprache
- Python
- Sterne
- 1.1k
- Forks
- 581
- Ø Merge
- 1 T. 17 Std.
- Gemergte PRs (30 T.)
- 78
Beschreibung
### Apache Iceberg version
0.11.0 (latest release)
### Please describe the bug 🐞
### Description
Calling `TruncateTransform.satisfies_order_of` with two valid truncate transforms that have different widths raises an `AttributeError` instead of returning a boolean.
Same-width comparisons work because the method returns early when the transforms are equal.
### Reproduction
```python
from pyiceberg.transforms import TruncateTransform
TruncateTransform(5).satisfies_order_of(TruncateTransform(3))
```
On `main` at commit `48e710d20ceeeaa637d5aeae7746b787410859f8`, this raises:
```text
AttributeError: 'TruncateTransform' object has no attribute '_source_type'
```
The failure reproduces consistently. The same code is also present in the 0.11.1 release.
### Expected behavior
The method should compare the truncate widths and return a boolean:
```python
assert TruncateTransform(5).satisfies_order_of(TruncateTransform(3))
assert not TruncateTransform(3).satisfies_order_of(TruncateTransform(5))
```
This matches the current Apache Iceberg Java implementation:
https://github.com/apache/iceberg/blob/25654ab4b29c8b5b5c20fc427da01cb70d94ed14/api/src/main/java/org/apache/iceberg/transforms/Truncate.java#L130-L141
### Cause
`TruncateTransform.__init__` initializes `_width` but not `_source_type`. However, `satisfies_order_of` still accesses the `source_type` property backed by `_source_type`:
https://github.com/apache/iceberg-python/blob/48e710d20ceeeaa637d5aeae7746b787410859f8/pyiceberg/transforms.py#L783-L905
The existing unit test only compares a transform with itself, so it returns before reaching the failing branch:
https://github.com/apache/iceberg-python/blob/48e710d20ceeeaa637d5aeae7746b787410859f8/tests/test_transforms.py#L501-L512
A focused fix could compare `TruncateTransform` widths directly, consistent with the Java implementation, and add regression cases for different widths.
I would be happy to contribute the fix and regression tests.
### Willingness to contribute
- [x] I can contribute a fix for this bug independently
- [ ] I would be willing to contribute a fix for this bug with guidance from the Iceberg community
- [ ] I cannot contribute a fix for this bug at this time
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Rechercherichtung
Beginnen Sie in pyiceberg/transforms.py bei TruncateTransform.satisfies_order_of und überprüfen Sie den zugehörigen Konstruktor und die source_type-Eigenschaft. Führen Sie die fokussierten Fälle in tests/test_transforms.py in der Nähe der Zeilen 501-512 aus und fügen Sie anschließend Abdeckung für verschiedene Breiten hinzu. Die Aufgabe ist abgeschlossen, wenn Vergleiche die erwarteten booleschen Werte zurückgeben, ohne auf ein nicht initialisiertes Attribut zuzugreifen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- data-engineering
- Issue-Typ
- Bug
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Aktivitätsstatus
- Ruhig
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 82/100