Protected ReadonlycacheProtected ReadonlywithoutBalance-free pages: their own key space, reached by the same namespace tags.
Clear each customer's membership tag and each record tag wherever cached,
and always this namespace's collection tag. keys are exact deletes in this
instance's key space: the only bust a null client honours.
ProtectedinvalidateThe bust every ledger account write makes, whatever it changed: its record
tag in every namespace copying its columns, its customer's pages on both
surfaces, and the folded get keys, the one bust a null client honours.
A balance change is no account write and clears none of it.
ProtectedsearchTags for a page: the scope its query searched (each customer's membership
tag, else the collection tag), so an empty page is bustable too, plus the
records it projects and the fields that chose or ordered its rows.
StaticadminAs getCacheKey, for LedgerAccountAdminQueryService.get.
StaticgetThe search args LedgerAccountQueryService.get reads through, and so its cache key.
Root of the ledger-account class hierarchy: it owns the one
ledger-account-searchcache both surfaces share and the seam that busts it.Every reader and writer extends this class —
LedgerAccountQueryService/LedgerAccountServiceon the consumer side,LedgerAccountAdminQueryService/LedgerAccountAdminServiceon the admin side. That replaces a mutual cross-construction in which each service built a detachedServiceCacheover the other's namespace purely to bust it; see SearchCache for why a detached buster cannot keep read-after-write honest.