Skip to content

Resolve unique selections to null under a deny-all visibility Scope - #153

Merged
jtnelson merged 5 commits into
developfrom
feature/none-scope-unique-selection
Aug 22, 2026
Merged

Resolve unique selections to null under a deny-all visibility Scope#153
jtnelson merged 5 commits into
developfrom
feature/none-scope-unique-selection

Conversation

@jtnelson

@jtnelson jtnelson commented Aug 1, 2026

Copy link
Copy Markdown
Member

Summary

When an Audience's visibility scope for a Record class denies all access, a unique query (the findUnique path) resolved to an empty Set. The caller of findUnique expects a single Record or null, so the empty Set produced a ClassCastException at the call site.

Behavior

  • A unique query executed through an Audience with a deny-all visibility scope now returns null, consistent with the findUnique contract when no record is visible.
  • Set-valued queries, counts, and load-by-id queries under a deny-all scope behave as before.

Scope

  • The change is limited to result resolution under a deny-all visibility scope. A regression test in AudienceVisibilityScopeIntegrationTest covers the findUnique path.

A findUnique query executed through an Audience whose visibility
scope denies all access previously resolved to an empty Set, even
though the caller expects a single Record or null. The empty Set
produced a ClassCastException at the call site. A unique selection
now resolves to null, matching the findUnique contract.
Each DatabaseSelection declares the result it yields when no Record is
visible, so a deny-all visibility Scope reads that value instead of
matching on class names. A new Selection type cannot compile without
declaring it.

Adds the changelog entry and a regression test for the findFirst path.
@jtnelson
jtnelson force-pushed the feature/none-scope-unique-selection branch from 734cfdc to 061df0b Compare August 22, 2026 21:21
A deny-all visibility Scope asks the Selection to resolve itself to the
result that represents no matching Records. The result and the resolved
state are set together, so the two cannot diverge, and the constant each
Selection type declares carries no external caller.
A count resolves to zero and a load by id resolves to null when the
visibility Scope denies all access.

The first selection test no longer describes a result it never had: a
first selection resolved to null before this branch.
A first selection through a deny-all Scope already resolved to null, so
findFirst never failed and the entry no longer names it.
@jtnelson
jtnelson merged commit c8420c7 into develop Aug 22, 2026
2 of 3 checks passed
@jtnelson
jtnelson deleted the feature/none-scope-unique-selection branch August 22, 2026 21:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant