aglinxinyuan opened a new issue, #7898: URL: https://github.com/apache/texera/issues/7898
### Task Summary Four operator descriptors sit below 90% with the gap entirely in awkward branch arms: | File | Coverage | |---|---| | `source/sql/SQLSourceOpDesc.scala` | 88.9% — 11 missed arms | | `visualization/ecdfPlot/ECDFPlotOpDesc.scala` | 85.4% — 15 missed arms | | `udf/r/RUDFSourceOpDesc.scala` | 80.6% | | `machineLearning/Scorer/MachineLearningScorerOpDesc.scala` | 84.8% | All five specs already exist (952 lines between them) and are thorough, so this is an extension target — the easy assertions are taken and what remains is exactly the awkward arms. Budget accordingly. **`TimeSeriesOpDesc` looks like a fifth candidate and is worth exactly zero.** All five of its partials are Scala's null-safe comparison against a String *literal*, where one arm requires the constant itself to be null. Measured: a probe setting every field to null left it at 23/28, gaining arms and no lines. Worse, that null path is a crash rather than a behaviour — `dropnaCols.map(c => pyb"$c")` NPEs inside the `pyb` macro on Base64 of a null string. Pinning it would cement junk. Other structural limits, all verified in bytecode: 1. **The same String-literal pattern caps `ECDFPlotOpDesc` at 42/48.** `javap` on `createPlotlyFigure` shows the three-jump null-safe form (`ifnonnull` / `ifnull` / `ifeq`), and the `ifnull`-taken arm needs the literal `"sum"` to be null. A probe drove those lines from `cb=3` to `cb=5` with `mb` **unchanged** — 8 arms gained, zero lines. 2. **Two more ECDF lines need a hashCode collision** with `"count"` or `"sum"` that is not equal to it. Constructible in principle, pure padding in practice. 3. **`MachineLearningScorerOpDesc`'s last two lines are reachable only through an erasure violation.** The LUB of the two metric list types erases to `java.lang.Enum`, so the lambda bridge's checkcast admits any foreign enum — `List(java.time.DayOfWeek.MONDAY).asInstanceOf[List[classificationMetricsFnc]]` does reach the `case _` throw. But no production route exists, because Jackson rejects an unknown enum name first. Only take it with an explicit comment saying it is an erasure probe. 4. **The six `require` message strings are lifted to `$anonfun$querySchema$1..6`** and dropped by JaCoCo's `SyntheticFilter`. Their source lines already read as covered because the closure allocation is attributed to the enclosing method — they move nothing either way. Three repo conventions and traps: - **`PythonOperatorDescriptor` has a reflection meta-scan.** `PythonCodeRawInvalidTextSpec` instantiates every subclass, so defining a descriptor subtype inside a spec breaks that spec. - **Every LogicalOp-subtype spec in a bundle needs a JSON round-trip test.** This is enforced in review. - **`WorkflowOperator/jacoco` fails inside a git worktree.** `FileScanSourceOpExecSpec` aborts in `beforeAll` with `RepositoryNotFoundException` because a worktree's `.git` is a file, and since sbt-jacoco runs unforked the report comes out all-zero rather than partial. Exclude that suite by name in both runs. Its aborted teardown also leaks an untracked `test_large_binary.txt` into the source tree — delete it or it trips the license-header check. ### Task Type - [ ] Refactor / Cleanup - [ ] DevOps / Deployment / CI - [x] Testing / QA - [ ] Documentation - [ ] Performance - [ ] Other -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
