Skip to content

feat(workflow-operator): volcano plot hover column - #9042

Open
eugenegujing wants to merge 3 commits into
apache:mainfrom
eugenegujing:feat/volcano-plot-hover-column
Open

eugenegujing wants to merge 3 commits into
apache:mainfrom
eugenegujing:feat/volcano-plot-hover-column

Conversation

@eugenegujing

@eugenegujing eugenegujing commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

What changes were proposed in this PR?

The Volcano Plot uses hover_name=table.columns[0], so the tooltip label is whatever column comes first in the input. That is fine for a DESeq2 table starting with gene and useless for one starting with a composite id or a number, and there is no way to change it. This PR copies Scatter Plot's Hover column property over, one column only.

Hover column Result
empty or whitespace-only (default) hover_name=table.columns[0], unchanged for saved workflows
set, present in the input hover_name=<that column>
set, missing from the input the operator's error page Missing hover column in table., like the existing check for the two required columns (Scatter Plot lets plotly raise a ValueError here)

Since #8504 merged, the operator also exports a standalone script through generateStandaloneCode(), which had hover_name=table.columns[0] hard-coded. This PR mirrors the property there: the hover column goes in as an escaped Python literal, and a set column that the input lacks adds one more elif to the script's column checks, writing the same error page. Whether the field counts as empty is decided by one helper for both paths, so the exported figure and the engine's cannot disagree.

Independent of the label-fix (#9037) and significance-threshold (#9039) PRs; all three touch neighbouring lines of VolcanoPlotOpDesc.scala, so whichever lands second needs a small rebase.

Figures below are the operator's generated Python from main and from this branch (Hover column = gene), run on the 430-gene example workflow from the issue whose first column is transcript|gene|chr|strand; the same point is hovered in both.

Before After (Hover column = gene)
hover-before-first-column hover-after-gene

Any related issues, documentation, discussions?

Closes #9038

PR #8504 (merged) added the generateStandaloneCode() export path with the same hover_name=table.columns[0]; the mirroring described above is the follow-up it needed.

How was this PR tested?

New tests in VolcanoPlotOpDescSpec, written before the source change:

  • empty or whitespace-only field keeps hover_name=table.columns[0] and emits no hover check
  • a set field emits the decoded column as hover_name plus the presence check, and no table.columns[0]
  • a column name with quotes and non-ASCII text reaches the code only as a decode site
  • a workflow JSON saved before this change generates byte-for-byte the same code as a default-constructed operator
  • generateStandaloneCode: an empty field keeps hover_name=table.columns[0] and adds no check; a set field is emitted as a literal plus an exact five-line elif branch between the required-column check and the drawing branch; a name with quotes, non-ASCII text or a backslash comes out escaped rather than decoded; whitespace-only equals empty; a saved workflow renders as a default-constructed operator
sbt -Dsbt.server.forcestart=true "WorkflowOperator/testOnly *VolcanoPlotOpDescSpec"
# Tests: succeeded 16, failed 0, canceled 0, ignored 0, pending 1   (the pending one is pre-existing)

sbt -Dsbt.server.forcestart=true "WorkflowOperator/scalafmtAll" "WorkflowOperator/Test/scalafmtAll"
sbt -Dsbt.server.forcestart=true "WorkflowOperator/scalafixAll --check"
# success

Smoke run outside Texera (pytexera stubbed, pandas + plotly 5.24.1) on the 430-gene mock table: defaults hover-label the first point as ENST00000000000|GENE_0000|chr2|+; Hover column = gene gives GENE_0000; Hover column = no_such_column yields <h1>Volcano Plot failed</h1><p>Missing hover column in table.</p>. The exported script for the default and the gene configuration parses with ast.parse.

Was this PR authored or co-authored using generative AI tooling?

Yes. Generated-by: Claude Code (claude-fable-5-1). Co-authored with Claude; the author reviewed the change before submission.

Add an optional Hover column property, as on Scatter Plot, used as the hover label of each point.
An empty or blank field keeps the first input column as before; a set column missing from the input yields the operator's error page.
@github-actions

Copy link
Copy Markdown
Contributor

Automated Reviewer Suggestions

Based on the git blame history of the changed files, we recommend the following reviewers:

  • Contributors with relevant context: @kz930, @Yicong-Huang
    You can notify them by mentioning @kz930, @Yicong-Huang in a comment.

@codecov-commenter

codecov-commenter commented Oct 24, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.88%. Comparing base (98c6337) to head (b2126f8).

Additional details and impacted files
@@             Coverage Diff              @@
##               main    #9042      +/-   ##
============================================
+ Coverage     91.87%   91.88%   +0.01%     
- Complexity     5049     5058       +9     
============================================
  Files          1265     1265              
  Lines         54915    54929      +14     
  Branches       6940     6940              
============================================
+ Hits          50453    50472      +19     
+ Misses         2769     2762       -7     
- Partials       1693     1695       +2     
Flag Coverage Δ *Carryforward flag
access-control-service 77.38% <ø> (ø)
agent-service 99.16% <ø> (ø) Carriedforward from 98c6337
amber 86.10% <100.00%> (+0.03%) ⬆️
computing-unit-managing-service 60.48% <ø> (ø)
config-service 87.37% <ø> (ø)
file-service 82.00% <ø> (ø)
frontend 96.50% <ø> (ø) Carriedforward from 98c6337
notebook-migration-service 83.73% <ø> (ø)
pyamber 98.54% <ø> (ø) Carriedforward from 98c6337
workflow-compiling-service 72.43% <ø> (ø)

*This pull request uses carry forward flags. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Benchmark changes need a look

🟢 0 better · 🔴 10 worse · ⚪ 5 noise (<±5%) · 0 without baseline

Compared against main 98c6337 benchmarked on this same runner, so the delta is largely free of cross-runner hardware noise. The "7d avg" column still reflects the gh-pages dashboard. Treat <±5% as noise unless repeated.

Dashboard · Run

config throughput MB/s latency max Δ latest / 7d
🔴 bs=10 sw=10 sl=64 376 0.229 25,270/35,503/35,503 us 🔴 +18.8% / 🔴 +149.4%
🔴 bs=100 sw=10 sl=64 805 0.491 122,481/157,747/157,747 us 🔴 +18.3% / 🔴 +63.5%
🔴 bs=1000 sw=10 sl=64 949 0.579 1,041,279/1,209,850/1,209,850 us 🔴 +10.0% / 🔴 +32.9%
Baseline details

Latest main 98c6337 from same runner

config metric PR latest main 7d avg Δ latest Δ 7d
bs=10 sw=10 sl=64 throughput 376 tuples/sec 432 tuples/sec 879.16 tuples/sec -13.0% -57.2%
bs=10 sw=10 sl=64 MB/s 0.229 MB/s 0.264 MB/s 0.537 MB/s -13.3% -57.3%
bs=10 sw=10 sl=64 p50 25,270 us 21,275 us 11,504 us +18.8% +119.7%
bs=10 sw=10 sl=64 p95 35,503 us 36,636 us 14,234 us -3.1% +149.4%
bs=10 sw=10 sl=64 p99 35,503 us 36,636 us 17,338 us -3.1% +104.8%
bs=100 sw=10 sl=64 throughput 805 tuples/sec 869 tuples/sec 1,147 tuples/sec -7.4% -29.8%
bs=100 sw=10 sl=64 MB/s 0.491 MB/s 0.531 MB/s 0.7 MB/s -7.5% -29.9%
bs=100 sw=10 sl=64 p50 122,481 us 113,972 us 88,987 us +7.5% +37.6%
bs=100 sw=10 sl=64 p95 157,747 us 133,363 us 96,473 us +18.3% +63.5%
bs=100 sw=10 sl=64 p99 157,747 us 133,363 us 102,791 us +18.3% +53.5%
bs=1000 sw=10 sl=64 throughput 949 tuples/sec 958 tuples/sec 1,182 tuples/sec -0.9% -19.7%
bs=1000 sw=10 sl=64 MB/s 0.579 MB/s 0.585 MB/s 0.721 MB/s -1.0% -19.7%
bs=1000 sw=10 sl=64 p50 1,041,279 us 1,047,839 us 872,751 us -0.6% +19.3%
bs=1000 sw=10 sl=64 p95 1,209,850 us 1,099,561 us 910,151 us +10.0% +32.9%
bs=1000 sw=10 sl=64 p99 1,209,850 us 1,099,561 us 941,479 us +10.0% +28.5%
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,532.01,200,128000,376,0.229,25270.45,35503.40,35503.40
1,100,10,64,20,2485.04,2000,1280000,805,0.491,122481.21,157747.16,157747.16
2,1000,10,64,20,21076.72,20000,12800000,949,0.579,1041279.29,1209849.70,1209849.70

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Volcano Plot: hover label is always the first input column; expose a Hover column property like Scatter Plot

2 participants