The GitHub Actions job "Required Checks" on 
texera.git/backport/6805-splice-metric-list-verbatim-instead-of-d-v1.2 has 
succeeded.
Run started by GitHub user Yicong-Huang (triggered by Yicong-Huang).

Head commit for run:
b4ce5a081dc7d38086a6582914e8a8539fb3d36c / Kary Zheng 
<[email protected]>
fix(MachineLearningScorer): splice metric_list verbatim instead of 
double-encoding (#6805)

### What changes were proposed in this PR?

Fixes a double-encoding bug in `MachineLearningScorerOpDesc` where the
selected metrics collapse into a single malformed `metric_list` element.

`getSelectedMetrics()` returns the chosen metric names as one
comma-separated, already-quoted fragment (e.g. `'Accuracy','F1 Score'`)
and is spliced into the generated Python as a list:

```
metric_list = [${getSelectedMetrics()}]
```

Its return type was **`EncodableString`**, so the Python template
builder **re-encoded the whole fragment as one Python string value**
instead of splicing it verbatim. The emitted code became:

```python
metric_list = [self.decode_python_template('J0FjY3VyYWN5JywnRjEgU2NvcmUn')]
```

where the base64 `J0FjY3VyYWN5JywnRjEgU2NvcmUn` decodes to
`'Accuracy','F1 Score'` — i.e. the entire quoted list collapses into
**one** decoded string element:

```python
metric_list = ["'Accuracy','F1 Score'"]   # ONE element, incl. inner quotes
```

instead of the intended:

```python
metric_list = ['Accuracy', 'F1 Score']
```

So every downstream `if 'X' in metric_list` and `for metric in
metric_list` / `metrics_func[metric]` operates on that single malformed
element — the selected metrics are never matched, and the classification
path hits a `KeyError` on the bogus key. The Scorer produces wrong/empty
output for both the classification and regression paths.

**Fix:** change `getSelectedMetrics()`'s return type from
`EncodableString` to plain `String`, so the builder splices it verbatim
into `metric_list = ['Accuracy','F1 Score']`. The method body is
unchanged.

```diff
-  private def getSelectedMetrics(): EncodableString = {
+  private def getSelectedMetrics(): String = {
     val metric = if (isRegression) regressionMetrics else classificationMetrics
     metric.map(metric => getMetricName(metric)).mkString("'", "','", "'")
   }
```

### Any related issues, documentation, discussions?

Closes #6790

### How was this PR tested?

Added a regression test to `MachineLearningScorerOpDescSpec` that
constructs the descriptor with `classificationMetrics = List(accuracy,
f1Score)`, calls `generatePythonCode()`, and asserts:
- the emitted code contains `metric_list = ['Accuracy','F1 Score']`
(verbatim), and
- the metric names are **not** base64-re-encoded through the template
builder.

Both assertions fail on `main` (the line is emitted as `metric_list =
[self.decode_python_template('J0FjY3VyYWN5JywnRjEgU2NvcmUn')]`) and pass
with this change.

Ran the full suite locally:

```
sbt "WorkflowOperator/testOnly 
org.apache.texera.amber.operator.machineLearning.Scorer.MachineLearningScorerOpDescSpec"
...
Tests: succeeded 7, failed 0, canceled 0, ignored 0, pending 0
All tests passed.
```

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

Generated-by: Claude Code (Claude Opus 4.8)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

(backported from commit 3a51bfb8761e96d10460f097b0e1803e27c2c5d0)

Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>

Report URL: https://github.com/apache/texera/actions/runs/30431368711

With regards,
GitHub Actions via GitBox

Reply via email to