Conversation
One table, thirty-four columns and fifteen rows, holding a column of every type an operator can ask for and the awkward values each type admits: an empty cell, a zero, a negative, a string that looks like a number, a date at a boundary. An operator that needs something the table cannot hold — a pair of tables sharing a key, a numeric projection — names a projection of it rather than a fixture of its own, so what every operator reads stays one thing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Automated Reviewer SuggestionsBased on the
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8360 +/- ##
============================================
+ Coverage 93.50% 95.74% +2.24%
+ Complexity 4882 477 -4405
============================================
Files 1220 590 -630
Lines 50788 33952 -16836
Branches 6262 4250 -2012
============================================
- Hits 47489 32508 -14981
+ Misses 1746 856 -890
+ Partials 1553 588 -965
*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:
|
carloea2
left a comment
There was a problem hiding this comment.
The shared fixture and its tests look good.
An operator writes a column name into the code it emits, and a name holding the characters that end a Python literal has to be escaped on the way. Renaming seven of this table's columns puts that question to a real run rather than to a reader. They are renamed rather than added, so the table keeps its width and the arrangements an operator needs: three components summing to 100, a label with a prediction over it. One of the seven carries a single quote and a newline too, the two that end a '...' literal and a # comment. HostileColumn indexes them by type, for the configuration generator to reach. A paragraph of scaladoc that sat above the wrong member moves back to the projection it describes, and the comments naming these columns now name them as what they are rather than as identifiers that no longer resolve. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
6d002e3 to
7eb6d7c
Compare
The table every operator reads carried doubles, strings, integers, a long and timestamps, and no boolean at all. An operator that renders a column as text answers differently for one: the engine writes the field's toString and gets "true", where Python's str() writes "True". Nothing in the shared table could ask the question. The column is `score >= 3.0` rather than free-standing, so the spec can state what it holds: six false and nine true, with both values inside either port's window. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A port can carry no rows at all: an upstream filter that matches nothing still ends its channel. That is a different table from one with holes in it, since a column with no values has no minimum, no quantile and no inferable type, so it needs a writer of its own. The shaping the gap variant already did moves behind that writer so both get the same sidecars. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
@carloea2 this moved after your approval: seven fixture columns were renamed to hostile spellings, the canonical table gained a boolean column, and a fixture can now write the same columns with no rows under them. Would you take another look when you have a moment? |
carloea2
left a comment
There was a problem hiding this comment.
The canonical table now covers empty data, booleans, and difficult column names. Looks good.
What changes were proposed in this PR?
One table, thirty-four columns and fifteen rows, holding a column of every
type an operator can ask for and the awkward values each type admits: an empty
cell, a zero, a negative, a string that looks like a number, a date at a
boundary.
An operator that needs something the table cannot hold — a pair of tables
sharing a key, a numeric projection — names a projection of it rather than a
fixture of its own, so what every operator reads stays one thing.
Any related issues, documentation, discussions?
Part of #8325, 8 of 27; that issue lists the set in order.
Closes #8412, the task this change is the whole of.
How was this PR tested?
The tests in this change cover it. The whole set is exercised together once the last piece lands: every operator run through the engine and through its generated script, and the two answers compared.
Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (Opus 5)