Skip to content

Translation-support inventory: every public query member classified as server, client-only or planned, and probed against EF Core #384

Closed

Description

@CaffeinatedCoder

Problem

test/oracles/postgres-surface.json inventories PostgreSQL's range, multirange and array surface and what the library does about each row. The other direction has no inventory: which public C# members a query can call, and what EF Core does with each. docs/efcore.md#what-runs-where lists both halves by hand, and ClientSideOnlyTranslationTests / ClientSideOnlyProjectionTests hold the in-memory rows by name. A member that is in neither table (a new overload, a generic family, a member the docs never mention) has no stated support, and a member whose translation disappears or appears is noticed only if a hand-written test happens to call it. The composition sweeps (#362, #375–#380) count such members as "untranslated" without saying whether that is intended; Clamp was the example.

Discovering from the registered translators would miss exactly the members without one, so the inventory starts from the public API.

Change

  • Discovery (QueryMembers, conventions project): every public method and instance property declared on a public, non-nested type of the core and NodaTime libraries whose receiver, a parameter or the result is a range, a multirange or a value set; one key per overload, generic families kept generic (RangeSet<TRange, T>.Union(TRange), StringSet<TElement>.Count). Converters, static constants and overloads an expression tree cannot hold (ReadOnlySpan<char>, out) are out by rule. 813 keys today.
  • test/oracles/translation-support.json: each key classified by the first entry whose pattern matches it: server (translates and executes with memory's answer), client (refused where the server is required, correct in a final projection; with the reason), or planned (as client, with the issue that adds it). A conventions test fails on an unclassified key and on an entry that matches nothing.
  • Probe (integration project): each key over every closed type it applies to, with a column operand, in a filter or a null test (where the server is required) and in a final projection, against memory over the rows as loaded. A server member that is refused or answers differently, and a client or planned member that now translates, end in Candidates.Verdict.

Defects it finds get their own issue under the release epic they ship in, with a candidate entry. Members the docs do not mention get a classification that says so, and a list in the PR for the user to decide on.

Done when

Registered in test/oracles/oracles.json, seeded (a removed translation is caught), every key classified, and the PR lists what the docs do not say.

Activity

  1. added
    testsAdds or changes tests only (oracles, harnesses); no library code
    area/rangesRange unions, variants and the shape engines
    area/range-setRangeSet and multirange algebra
    area/value-setsValue set families and wrapper arities
    package/efcoreAffects CodoMetis.ValueRanges.EFCore.PostgreSQL
    package/efcore-nodatimeAffects CodoMetis.ValueRanges.EFCore.PostgreSQL.NodaTime
    on Oct 24, 2026
  2. CaffeinatedCoder commented on Oct 25, 2026

    @CaffeinatedCoder
    OwnerAuthor

    Evaluation and 10.2.0 triage, 2026-10-25.

    Runs. PR #386's head (a1263b7) on main: EF Core 11 RC2, PostgreSQL 16. The same probe and classification ported unchanged to a scratch release/10.x checkout (03c04e4, not committed): EF Core 10.0.0, and 10.0.13 with Npgsql 10.0.3. I added a temporary tally of outcome by classification. All three runs give the same 2,256 cells:

    Classification / outcome Cells
    server / runs as SQL, agrees with memory 1,643
    client / refused, projection agrees with memory 598
    client / runs as SQL, answers differently (#385) 13
    client / unprobed (no operand) 2

    On 10.x the 10.x public API is fully classified by the same translation-support.json. The only failures are #385's 26 lines, which 10.x's candidates.json doesn't register (main's does).

    Triage for 10.2.0.

    Notes on the probe, for PR #386 (none of them hides a defect today):

    • unprobed cells fail only when the member is classified server. The two client cells, ToInstantRange(Interval) and ToLocalDateRange(DateInterval), are never run and nothing reports them. Npgsql's NodaTime plugin maps Interval and DateInterval columns, so a column operand could reach them.
    • observed is collected but never written or asserted. The table above needed a temporary tally.
    • Each call takes a column in its first operand only, with one fixed sample elsewhere. Each row's RangeSet holds one range. That's enough for translation support; shape and pair coverage stays with ShapeMatrixParityTests and the composition sweeps.
  3. CaffeinatedCoder commented on Oct 25, 2026

    @CaffeinatedCoder
    OwnerAuthor

    10.3.0 (#408) depends on this: its additions (#405, #406, #191) are done only when translation-support.json classifies them server, so each is now linked as blocked by this issue. The 10.x port is #430. Next on PR #386: bring it up to date with main, and make the reason texts follow #399 and #402 (the three notes on the PR).

  4. added 2 commits that reference this issue on Oct 25, 2026
  5. added a commit that references this issue on Oct 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/range-setRangeSet and multirange algebraarea/rangesRange unions, variants and the shape enginesarea/value-setsValue set families and wrapper aritiespackage/efcoreAffects CodoMetis.ValueRanges.EFCore.PostgreSQLpackage/efcore-nodatimeAffects CodoMetis.ValueRanges.EFCore.PostgreSQL.NodaTimetestsAdds or changes tests only (oracles, harnesses); no library code

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions