feat(visualization): drop rows with missing values before laying out a Dumbbell Plot - #7567
Conversation
Automated Reviewer SuggestionsBased on the
|
Backport auto-label reportThis
|
5f4b4b0 to
ef32791
Compare
…a Dumbbell Plot Dumbbell Plot took the distinct values of the compared column and sorted them. An empty cell reaches the operator as None, so `unique()` returned a list with a None in it and `sorted` compared None against a string, ending the run with a TypeError. An empty value is ordinary input here. A blank CSV cell arrives as null: univocity returns null for an empty field, and AttributeTypeUtils.parseField passes it through by design. It now drops rows missing any of the three columns it reads, which is what the other visualization operators do: twenty-four of them open their generated Python with `dropna(subset=[...]) #remove missing values`, and Dumbbell Plot was the one that did not. A table left empty by the drop renders the operator's own error rather than an exception, matching how it already reports an empty input. The spec gains the case; it fails on the previous behavior. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #7567 +/- ##
============================================
- Coverage 90.14% 90.13% -0.02%
+ Complexity 4417 4413 -4
============================================
Files 1174 1174
Lines 46964 46965 +1
Branches 5262 5262
============================================
- Hits 42334 42330 -4
- Misses 2876 2877 +1
- Partials 1754 1758 +4
*This pull request uses carry forward flags. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
ef32791 to
83187c0
Compare
|
| config | throughput | MB/s | latency | max Δ latest / 7d | |
|---|---|---|---|---|---|
| 🔴 | bs=10 sw=10 sl=64 | 365 | 0.222 | 26,829/34,546/34,546 us | 🔴 -9.8% / 🔴 +111.3% |
| 🔴 | bs=100 sw=10 sl=64 | 786 | 0.48 | 124,246/156,514/156,514 us | 🟢 -21.7% / 🔴 +45.5% |
| 🟢 | bs=1000 sw=10 sl=64 | 923 | 0.563 | 1,080,012/1,155,567/1,155,567 us | 🟢 -5.9% / 🔴 +11.5% |
Baseline details
Latest main 324278e from same runner
| config | metric | PR | latest main | 7d avg | Δ latest | Δ 7d |
|---|---|---|---|---|---|---|
| bs=10 sw=10 sl=64 | throughput | 365 tuples/sec | 402 tuples/sec | 774.89 tuples/sec | -9.2% | -52.9% |
| bs=10 sw=10 sl=64 | MB/s | 0.222 MB/s | 0.246 MB/s | 0.473 MB/s | -9.8% | -53.1% |
| bs=10 sw=10 sl=64 | p50 | 26,829 us | 25,554 us | 12,738 us | +5.0% | +110.6% |
| bs=10 sw=10 sl=64 | p95 | 34,546 us | 32,476 us | 16,348 us | +6.4% | +111.3% |
| bs=10 sw=10 sl=64 | p99 | 34,546 us | 32,476 us | 18,848 us | +6.4% | +83.3% |
| bs=100 sw=10 sl=64 | throughput | 786 tuples/sec | 795 tuples/sec | 1,005 tuples/sec | -1.1% | -21.8% |
| bs=100 sw=10 sl=64 | MB/s | 0.48 MB/s | 0.485 MB/s | 0.613 MB/s | -1.0% | -21.7% |
| bs=100 sw=10 sl=64 | p50 | 124,246 us | 116,484 us | 100,970 us | +6.7% | +23.1% |
| bs=100 sw=10 sl=64 | p95 | 156,514 us | 199,891 us | 107,605 us | -21.7% | +45.5% |
| bs=100 sw=10 sl=64 | p99 | 156,514 us | 199,891 us | 116,429 us | -21.7% | +34.4% |
| bs=1000 sw=10 sl=64 | throughput | 923 tuples/sec | 932 tuples/sec | 1,030 tuples/sec | -1.0% | -10.4% |
| bs=1000 sw=10 sl=64 | MB/s | 0.563 MB/s | 0.569 MB/s | 0.629 MB/s | -1.1% | -10.5% |
| bs=1000 sw=10 sl=64 | p50 | 1,080,012 us | 1,069,957 us | 991,433 us | +0.9% | +8.9% |
| bs=1000 sw=10 sl=64 | p95 | 1,155,567 us | 1,228,108 us | 1,036,668 us | -5.9% | +11.5% |
| bs=1000 sw=10 sl=64 | p99 | 1,155,567 us | 1,228,108 us | 1,070,470 us | -5.9% | +7.9% |
Raw CSV
config_idx,batch_size,schema_width,string_len,num_batches,total_ms,total_tuples,total_bytes,tuples_per_sec,mb_per_sec,lat_p50_us,lat_p95_us,lat_p99_us
0,10,10,64,20,548.65,200,128000,365,0.222,26829.22,34546.15,34546.15
1,100,10,64,20,2544.64,2000,1280000,786,0.480,124246.23,156514.33,156514.33
2,1000,10,64,20,21667.06,20000,12800000,923,0.563,1080011.53,1155566.63,1155566.63|
@aglinxinyuan May you take a look at this? |
What changes were proposed in this PR?
Dumbbell Plot took the distinct values of the compared column and sorted them. An empty cell reaches the operator as
None, sounique()returned a list with aNonein it andsortedcomparedNoneagainst a string, ending the run with a TypeError.An empty value is ordinary input here. A blank CSV cell arrives as null, since univocity returns null for an empty field and
AttributeTypeUtils.parseFieldpasses it through by design.It now drops rows missing any of the three columns it reads, which is what the other visualization operators do: twenty-four of them open their generated Python with
dropna(subset=[...]) #remove missing values, and Dumbbell Plot was the one that did not. A table left empty by the drop renders the operator's own error rather than an exception, matching how it already reports an empty input.Any related issues, documentation, discussions?
Closes #7562
How was this PR tested?
DumbbellPlotOpDescSpecgains a case asserting the generated Python drops on all three configured columns before it sorts. It fails on the previous behavior, 7 passed / 1 failed before the change and 8 / 0 after.Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (Claude Opus 5)