apache / apache/iceberg-cpp

Full Unicode case-mapping parity for case-insensitive field matching

Aperta
#808 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
C++
Stelle
221
Fork
124
Merge medio
1g 16h
PR unite (30g)
21

Descrizione

### Context

Issue #613 asks for case-insensitive field matching consistent with iceberg-java and iceberg-python (both Unicode-aware), with `İ` (U+0130) as the example. PR #760 (Part of #613) made `StringUtils::ToLower` Unicode-aware using utf8proc **simple (1:1)** case mapping and added allocation-free ASCII fast paths.

This issue captures the **design and remaining plan** to reach full parity and tracks the follow-up PRs.

### Remaining gap

utf8proc's simple mapping still diverges from java for the few code points where simple ≠ full case mapping — chiefly `İ`:

| input | iceberg-cpp (simple) | iceberg-java `toLowerCase(Locale.ROOT)` / Python `str.lower()` |
|---|---|---|
| `İ` (U+0130) | `i` (U+0069) | `i̇` (U+0069 U+0307) |

So `EqualsIgnoreCase("İD", "id")` is **true** in iceberg-cpp but **false** in java/python — the inconsistency #613 is about.

### Design questions

- Match iceberg-java `toLowerCase(Locale.ROOT)` exactly; confirm the operation PyIceberg uses for matching and that it agrees.
- Full lowercase mapping vs. Unicode case folding: utf8proc offers full case folding (`utf8proc_map` + `UTF8PROC_CASEFOLD`); verify it reproduces the java/python result, or add a small explicit mapping.
- Keep the ASCII fast path; stream the non-ASCII path rather than materialize.

### Work Items

- [ ] Full case mapping to close the `İ` / java-parity gap
- [ ] Streaming / allocation-free non-ASCII comparison in `EqualsIgnoreCase` / `StartsWithIgnoreCase` (deferred from #760)

### References

- Issue: #613 (origin)

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Inizia esaminando StringUtils::ToLower e i percorsi EqualsIgnoreCase/StartsWithIgnoreCase di PR #760, quindi confronta il full case folding di utf8proc con iceberg-java e PyIceberg per l’esempio İ. Il lavoro è completato quando sono disponibili un mapping completo delle maiuscole/minuscole compatibile con Java/Python, i percorsi rapidi ASCII sono preservati e un percorso di confronto non ASCII in streaming o senza allocazioni.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
cpp
Ambito
backend
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Tranquilla
Chiarezza
Da chiarire
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.