feat(visualization): drop rows with missing values before laying out a Dumbbell Plot - #7567
feat(visualization): drop rows with missing values before laying out a Dumbbell Plot#7567kz930 wants to merge 1 commit into
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 87.88% 87.87% -0.02%
+ Complexity 4276 4271 -5
============================================
Files 1176 1176
Lines 47018 47019 +1
Branches 5245 5245
============================================
- Hits 41323 41317 -6
- Misses 3972 3974 +2
- Partials 1723 1728 +5
*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 | 355 | 0.217 | 26,901/39,622/39,622 us | 🔴 +21.8% / 🔴 +147.8% |
| ⚪ | bs=100 sw=10 sl=64 | 788 | 0.481 | 124,178/149,766/149,766 us | ⚪ within ±5% / 🔴 +38.6% |
| ⚪ | bs=1000 sw=10 sl=64 | 920 | 0.562 | 1,080,766/1,141,948/1,141,948 us | ⚪ within ±5% / 🔴 -10.7% |
Baseline details
Latest main e878df3 from same runner
| config | metric | PR | latest main | 7d avg | Δ latest | Δ 7d |
|---|---|---|---|---|---|---|
| bs=10 sw=10 sl=64 | throughput | 355 tuples/sec | 426 tuples/sec | 784.3 tuples/sec | -16.7% | -54.7% |
| bs=10 sw=10 sl=64 | MB/s | 0.217 MB/s | 0.26 MB/s | 0.479 MB/s | -16.5% | -54.7% |
| bs=10 sw=10 sl=64 | p50 | 26,901 us | 22,078 us | 12,590 us | +21.8% | +113.7% |
| bs=10 sw=10 sl=64 | p95 | 39,622 us | 33,509 us | 15,991 us | +18.2% | +147.8% |
| bs=10 sw=10 sl=64 | p99 | 39,622 us | 33,509 us | 18,694 us | +18.2% | +112.0% |
| bs=100 sw=10 sl=64 | throughput | 788 tuples/sec | 812 tuples/sec | 1,002 tuples/sec | -3.0% | -21.4% |
| bs=100 sw=10 sl=64 | MB/s | 0.481 MB/s | 0.495 MB/s | 0.612 MB/s | -2.8% | -21.3% |
| bs=100 sw=10 sl=64 | p50 | 124,178 us | 119,080 us | 101,285 us | +4.3% | +22.6% |
| bs=100 sw=10 sl=64 | p95 | 149,766 us | 153,632 us | 108,068 us | -2.5% | +38.6% |
| bs=100 sw=10 sl=64 | p99 | 149,766 us | 153,632 us | 118,235 us | -2.5% | +26.7% |
| bs=1000 sw=10 sl=64 | throughput | 920 tuples/sec | 908 tuples/sec | 1,030 tuples/sec | +1.3% | -10.7% |
| bs=1000 sw=10 sl=64 | MB/s | 0.562 MB/s | 0.554 MB/s | 0.629 MB/s | +1.4% | -10.6% |
| bs=1000 sw=10 sl=64 | p50 | 1,080,766 us | 1,093,407 us | 991,882 us | -1.2% | +9.0% |
| bs=1000 sw=10 sl=64 | p95 | 1,141,948 us | 1,190,176 us | 1,038,496 us | -4.1% | +10.0% |
| bs=1000 sw=10 sl=64 | p99 | 1,141,948 us | 1,190,176 us | 1,068,265 us | -4.1% | +6.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,562.59,200,128000,355,0.217,26901.03,39622.26,39622.26
1,100,10,64,20,2539.23,2000,1280000,788,0.481,124177.66,149766.13,149766.13
2,1000,10,64,20,21736.86,20000,12800000,920,0.562,1080766.46,1141947.78,1141947.78|
@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)