Skip to content

Commit 8731891

Browse files
Cache SDK table metadata in hot paths
1 parent cf06f8a commit 8731891

2 files changed

Lines changed: 22 additions & 15 deletions

File tree

crates/bindings-typescript/src/sdk/db_connection_impl.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
158158
#reducerCallInfo = new Map<number, { name: string; args: object }>();
159159
#procedureCallbacks = new Map<number, ProcedureCallback>();
160160
#rowDeserializers: Record<string, Deserializer<any>>;
161+
#rowIdMetadata: Record<
162+
string,
163+
{ primaryKeyColName?: string; primaryKeyColType?: AlgebraicType }
164+
>;
161165
#reducerArgsSerializers: Record<
162166
string,
163167
{ serialize: Serializer<any>; deserialize: Deserializer<any> }
@@ -205,6 +209,7 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
205209
this.#emitter = emitter;
206210

207211
this.#rowDeserializers = Object.create(null);
212+
this.#rowIdMetadata = Object.create(null);
208213
this.#sourceNameToTableDef = Object.create(null);
209214
for (const table of Object.values(remoteModule.tables)) {
210215
this.#rowDeserializers[table.sourceName] = ProductType.makeDeserializer(
@@ -213,6 +218,15 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
213218
this.#sourceNameToTableDef[table.sourceName] = table as Values<
214219
RemoteModule['tables']
215220
>;
221+
const primaryKeyColumn = Object.entries(table.columns).find(
222+
([, column]) => column.columnMetadata.isPrimaryKey
223+
);
224+
this.#rowIdMetadata[table.sourceName] = primaryKeyColumn
225+
? {
226+
primaryKeyColName: primaryKeyColumn[0],
227+
primaryKeyColType: primaryKeyColumn[1].typeBuilder.algebraicType,
228+
}
229+
: {};
216230
}
217231

218232
this.#reducerArgsSerializers = Object.create(null);
@@ -428,20 +442,13 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
428442
const rows: Operation[] = [];
429443

430444
const deserializeRow = this.#rowDeserializers[tableName];
431-
const table = this.#sourceNameToTableDef[tableName];
432-
// TODO: performance
433-
const columnsArray = Object.entries(table.columns);
434-
const primaryKeyColumnEntry = columnsArray.find(
435-
col => col[1].columnMetadata.isPrimaryKey
436-
);
445+
const { primaryKeyColName, primaryKeyColType } =
446+
this.#rowIdMetadata[tableName];
437447
let previousOffset = 0;
438448
while (reader.remaining > 0) {
439449
const row = deserializeRow(reader);
440450
let rowId: ComparablePrimitive | undefined = undefined;
441-
if (primaryKeyColumnEntry !== undefined) {
442-
const primaryKeyColName = primaryKeyColumnEntry[0];
443-
const primaryKeyColType =
444-
primaryKeyColumnEntry[1].typeBuilder.algebraicType;
451+
if (primaryKeyColName !== undefined && primaryKeyColType !== undefined) {
445452
rowId = AlgebraicType.intoMapKey(
446453
primaryKeyColType,
447454
row[primaryKeyColName]

crates/bindings-typescript/src/sdk/table_cache.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export class TableCacheImpl<
6666
TableName extends TableNamesOf<RemoteModule>,
6767
> implements ClientTableCoreImplementable<RemoteModule, TableName>
6868
{
69+
private readonly hasPrimaryKey: boolean;
6970
private rows: Map<
7071
ComparablePrimitive,
7172
[RowType<TableDefForTableName<RemoteModule, TableName>>, number]
@@ -83,6 +84,9 @@ export class TableCacheImpl<
8384
this.tableDef = tableDef;
8485
this.rows = new Map();
8586
this.emitter = new EventEmitter();
87+
this.hasPrimaryKey = Object.values(this.tableDef.columns).some(
88+
col => col.columnMetadata.isPrimaryKey === true
89+
);
8690
// Build index views from the resolved runtime index metadata.
8791
//
8892
// We intentionally use `resolvedIndexes` rather than `indexes`:
@@ -281,11 +285,7 @@ export class TableCacheImpl<
281285
return pendingCallbacks;
282286
}
283287

284-
// TODO: performance
285-
const hasPrimaryKey = Object.values(this.tableDef.columns).some(
286-
col => col.columnMetadata.isPrimaryKey === true
287-
);
288-
if (hasPrimaryKey) {
288+
if (this.hasPrimaryKey) {
289289
const insertMap = new Map<
290290
ComparablePrimitive,
291291
[

0 commit comments

Comments
 (0)