Conversation
A source reads a file rather than an upstream port, so it is configured from a file the runner writes rather than from a table, and the variants follow the configuration: a CSV with a header and without, an encoding per charset. Two reports come with it. One prints which operators run and which are withheld and why, so the state of the set is a command rather than a claim. The other parses every generated script and fails on one that a hostile column name would break, which is a whole class of defect a comparison cannot see. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Automated Reviewer SuggestionsBased on the
|
…ady are It routes a source to the source runner and asks the escaping check for its findings, and the coverage report in turn reads the operators it discovered. Split across two changes those references point both ways, and neither compiles until both land whatever order they land in. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The spec printed a tier per operator, a per-kind tally, and every withheld run with its reason. That is a progress report: it read the same dispositions the run itself reads and asserted nothing about them, so it could only ever say what the run had already decided. What it did assert stays: a small set of operators that must not become unrunnable. They take the shared table as it is and nothing about them is hard to run, so one turning up flagged means something upstream of the disposition broke. 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 #8364 +/- ##
============================================
- Coverage 93.62% 93.27% -0.36%
- Complexity 4842 4846 +4
============================================
Files 1211 1213 +2
Lines 49991 50269 +278
Branches 6125 6150 +25
============================================
+ Hits 46805 46887 +82
- Misses 1675 1870 +195
- Partials 1511 1512 +1
*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:
|
Two comments here restated what the code beside them shows: the three tiers a source dispatches through, which `canRun` and `flagReason` already spell out, and this spec's own repetition of the runner's dispatch, which belongs to the runner. What replaces them says what each file is for, once. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
carloea2
left a comment
There was a problem hiding this comment.
The source verification and coverage checks look good.
The translator names a variable per output PORT, not per reader, so a workflow that draws two charts from one upstream hands both the same name. An operator that drops rows into it, or assigns a column through it, changes what the other branch reads. Ten operators did, and every one of them passed: a fixture with a single branch has nothing to notice it with. `StandaloneInputCheck` reads the generated code instead of waiting for a run to disagree, and reports all three spellings: the assignment, the `inplace=True`, and the rebinding that looks local but renames the shared variable. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`in1df.loc[:, "c"] = v` writes to the input exactly as `in1df["c"] = v` does, and the pattern read only the plain subscript, so an operator would have passed for choosing the accessor. What it still cannot see is a mutation through another name: bind the frame to something else first and the writes below are invisible to anything reading the code. The scaladoc says so rather than leaving the check looking airtight. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
carloea2
left a comment
There was a problem hiding this comment.
The new check catches direct changes to input frames. Looks good.
A hostile-column run now exists, and the two look alike enough that a reader could take one for a duplicate of the other. What this end cannot do is run the script; what the run cannot do is make every knob hostile at once, since a table holds one hostile column per type and the first knob takes it. The rest is length. StandaloneInputCheck kept a paragraph on what it cannot see, which rested on no operator doing that today, and the dispatcher stated the verdict-in-the-test-name rule in four places where one will do. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
65bda18 to
f66d6e5
Compare
OperatorBehaviorSpec forks a Python subprocess per operator, and at core-count concurrency the contention caused rare flakes. A fixed 4 is deterministic across machines and still runs about three times faster than serial; it also matches PythonWorkerPool's own default cap, so the two bounds agree rather than multiply. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This reverts commit 1ee3dd2.
It restated its own signature and listed a codec table that lives in TupleIO. The reasons a reader cannot derive stay. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Four more --add-opens. Kryo recurses into a timestamp's internals when it serializes one, and reaches them only in a JVM that has already forked a Python worker, which is what running this module's tests without WCS_TEST_FILTER does. The two CI jobs each take half, so CI never gets there; a local full-module run does, and reports an InaccessibleObjectException that looks like a defect in the diff. They arrive with the spec that makes the combination possible. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A scan source is fixtured by the format it declares, so registering an encoder for "Parquet" is the whole of what the new source needs from this runner: no handler, and no mention of the operator anywhere here. The writer is the inverse of ParquetSchemaMapping, which is what the operator reads the file back with. Every column is written optional, since Parquet has no null value and only a field that repeats zero times can carry a hole. A timestamp is written as the wall clock counted from the epoch, the reading both paths agree on. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
carloea2
left a comment
There was a problem hiding this comment.
The source coverage and mutation checks look good on the current fixture.
carloea2
left a comment
There was a problem hiding this comment.
Source output order matters because offset, limit, and downstream first row behavior use it. This comparison ignores order, so an exported source can reverse every row and still pass. Please compare source outputs in order.
|
The source comparison is already positional. |
The epilogue writes a declared-integral column as an integer, the way the engine's writer does, and a source's declared columns are what the Texera path already read back here. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
carloea2
left a comment
There was a problem hiding this comment.
The source checks now compare the schema and row order. The earlier finding is addressed. Looks good.
What changes were proposed in this PR?
A source reads a file rather than an upstream port, so it is configured from a
file the runner writes rather than from a table, and the variants follow the
configuration: a CSV with a header and without, an encoding per charset.
Two reports come with it. One prints which operators run and which are
withheld and why, so the state of the set is a command rather than a claim.
The other parses every generated script and fails on one that a hostile column
name would break, which is a whole class of defect a comparison cannot see.
Any related issues, documentation, discussions?
Part of #8325, 24 of 27; that issue lists the set in order.
Closes #8426, 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)