Problem
Two Raincloud corpus slugs fail with a header mismatch at line 1:
uci-parkinsons — two columns both named mdvp_jitter in Parquet; Vortex stores them as mdvp_jitter and mdvp_jitter [1].
uci-spambase — six columns all named char_freq in Parquet; Vortex stores them as char_freq, char_freq [1], …, char_freq [5].
The oracle uses cols.stream().map(ColumnSchema::name) for the header — emitting the raw Parquet duplicate names — while Vortex/CsvExporter emits the de-duplicated names. The comparison fails at line 1.
Data rows are also at risk: rows.getInt(name) is name-based, so for duplicate column names hardwood may return the same column for every occurrence — even for genuinely distinct data.
Root cause
The Rust Vortex writer de-duplicates duplicate Arrow column names by appending [N] (space-bracket-N-bracket, N starting at 1 for the second occurrence). The Parquet sibling keeps the original duplicate names. The oracle must match the Vortex naming.
Fix
In RaincloudConformanceIntegrationTest.writeOracleCsv:
- Header: de-duplicate Parquet column names using the same
[N] algorithm Vortex uses before writing the CSV header row.
- Data: switch
oracleCell from name-based access (rows.getInt(col.name())) to index-based access (rows.getInt(col.columnIndex())). Hardwood's StructAccessor supports getInt(int), getLong(int), getString(int), isNull(int), etc.
After fixing, flip both uci-parkinsons and uci-spambase from gap:256 to ok in expected-status.csv.
Files
integration/src/test/java/io/github/dfa1/vortex/integration/RaincloudConformanceIntegrationTest.java
writeOracleCsv: de-duplicate column names for header
oracleCell: switch to col.columnIndex() for all rows.getXxx() and rows.isNull() calls
integration/src/test/resources/raincloud/expected-status.csv — flip uci-parkinsons and uci-spambase
Problem
Two Raincloud corpus slugs fail with a header mismatch at line 1:
uci-parkinsons— two columns both namedmdvp_jitterin Parquet; Vortex stores them asmdvp_jitterandmdvp_jitter [1].uci-spambase— six columns all namedchar_freqin Parquet; Vortex stores them aschar_freq,char_freq [1], …,char_freq [5].The oracle uses
cols.stream().map(ColumnSchema::name)for the header — emitting the raw Parquet duplicate names — while Vortex/CsvExporter emits the de-duplicated names. The comparison fails at line 1.Data rows are also at risk:
rows.getInt(name)is name-based, so for duplicate column names hardwood may return the same column for every occurrence — even for genuinely distinct data.Root cause
The Rust Vortex writer de-duplicates duplicate Arrow column names by appending
[N](space-bracket-N-bracket, N starting at 1 for the second occurrence). The Parquet sibling keeps the original duplicate names. The oracle must match the Vortex naming.Fix
In
RaincloudConformanceIntegrationTest.writeOracleCsv:[N]algorithm Vortex uses before writing the CSV header row.oracleCellfrom name-based access (rows.getInt(col.name())) to index-based access (rows.getInt(col.columnIndex())). Hardwood'sStructAccessorsupportsgetInt(int),getLong(int),getString(int),isNull(int), etc.After fixing, flip both
uci-parkinsonsanduci-spambasefromgap:256tookinexpected-status.csv.Files
integration/src/test/java/io/github/dfa1/vortex/integration/RaincloudConformanceIntegrationTest.javawriteOracleCsv: de-duplicate column names for headeroracleCell: switch tocol.columnIndex()for allrows.getXxx()androws.isNull()callsintegration/src/test/resources/raincloud/expected-status.csv— flipuci-parkinsonsanduci-spambase