diff --git a/src/storage/ReadOnlyTabularStorage.ts b/src/storage/ReadOnlyTabularStorage.ts index 74cc67ba..036b679e 100644 --- a/src/storage/ReadOnlyTabularStorage.ts +++ b/src/storage/ReadOnlyTabularStorage.ts @@ -6,6 +6,9 @@ import type { FromSchema, InsertEntity, ITabularStorage, + JoinedRow, + JoinSpec, + JoinType, Page, PageRequest, QueryOptions, @@ -121,6 +124,17 @@ export class ReadOnlyTabularStorage< return this.inner.queryIndex(criteria, options); } + /** + * A join is a read, so it forwards like every other read here. The write + * guard this wrapper exists for is unaffected: nothing in a join mutates. + */ + join( + spec: JoinSpec, + right: ITabularStorage + ): Promise[]> { + return this.inner.join(spec, right); + } + // ── transactions (no-op wrapper) ─────────────────────────────────── // Run `fn` against this read-only wrapper so writes inside continue to // no-op; reads still hit the underlying storage. No real DB transaction