Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 21 additions & 13 deletions crates/bindings-typescript/src/sdk/db_connection_impl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,10 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
#reducerCallInfo = new Map<number, { name: string; args: object }>();
#procedureCallbacks = new Map<number, ProcedureCallback>();
#rowDeserializers: Record<string, Deserializer<any>>;
#rowIdMetadata: Record<
string,
{ primaryKeyColName?: string; primaryKeyColType?: AlgebraicType }
>;
#reducerArgsSerializers: Record<
string,
{ serialize: Serializer<any>; deserialize: Deserializer<any> }
Expand Down Expand Up @@ -205,6 +209,7 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
this.#emitter = emitter;

this.#rowDeserializers = Object.create(null);
this.#rowIdMetadata = Object.create(null);
this.#sourceNameToTableDef = Object.create(null);
for (const table of Object.values(remoteModule.tables)) {
this.#rowDeserializers[table.sourceName] = ProductType.makeDeserializer(
Expand All @@ -213,6 +218,15 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
this.#sourceNameToTableDef[table.sourceName] = table as Values<
RemoteModule['tables']
>;
const primaryKeyColumn = Object.entries(table.columns).find(
([, column]) => column.columnMetadata.isPrimaryKey
);
this.#rowIdMetadata[table.sourceName] = primaryKeyColumn
? {
primaryKeyColName: primaryKeyColumn[0],
primaryKeyColType: primaryKeyColumn[1].typeBuilder.algebraicType,
}
: {};
}

this.#reducerArgsSerializers = Object.create(null);
Expand Down Expand Up @@ -302,8 +316,6 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
#makeReducers(def: RemoteModule): ReducersView<RemoteModule> {
const out: Record<string, unknown> = {};

const writer = new BinaryWriter(1024);

for (const reducer of def.reducers) {
const reducerName = reducer.name;
const key = reducer.accessorName;
Expand All @@ -312,6 +324,7 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
this.#reducerArgsSerializers[reducerName];

(out as any)[key] = (params: InferTypeOfRow<typeof reducer.params>) => {
const writer = this.#reducerArgsEncoder;
writer.clear();
serializeArgs(writer, params);
const argsBuffer = writer.getBuffer();
Expand Down Expand Up @@ -428,20 +441,13 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
const rows: Operation[] = [];

const deserializeRow = this.#rowDeserializers[tableName];
const table = this.#sourceNameToTableDef[tableName];
// TODO: performance
const columnsArray = Object.entries(table.columns);
const primaryKeyColumnEntry = columnsArray.find(
col => col[1].columnMetadata.isPrimaryKey
);
const { primaryKeyColName, primaryKeyColType } =
this.#rowIdMetadata[tableName];
let previousOffset = 0;
while (reader.remaining > 0) {
const row = deserializeRow(reader);
let rowId: ComparablePrimitive | undefined = undefined;
if (primaryKeyColumnEntry !== undefined) {
const primaryKeyColName = primaryKeyColumnEntry[0];
const primaryKeyColType =
primaryKeyColumnEntry[1].typeBuilder.algebraicType;
if (primaryKeyColName !== undefined && primaryKeyColType !== undefined) {
rowId = AlgebraicType.intoMapKey(
primaryKeyColType,
row[primaryKeyColName]
Expand Down Expand Up @@ -548,6 +554,7 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
}
}

#reducerArgsEncoder = new BinaryWriter(1024);
#clientMessageEncoder = new BinaryWriter(1024);
#sendMessage(message: ClientMessage): void {
const writer = this.#clientMessageEncoder;
Expand Down Expand Up @@ -906,7 +913,8 @@ export class DbConnectionImpl<RemoteModule extends UntypedRemoteModule>
_paramsType: ProductType,
params: object
): Promise<void> {
const writer = new BinaryWriter(1024);
const writer = this.#reducerArgsEncoder;
writer.clear();
this.#reducerArgsSerializers[reducerName].serialize(writer, params);
const argsBuffer = writer.getBuffer();
return this.callReducer(reducerName, argsBuffer, params);
Expand Down
10 changes: 5 additions & 5 deletions crates/bindings-typescript/src/sdk/table_cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ export class TableCacheImpl<
TableName extends TableNamesOf<RemoteModule>,
> implements ClientTableCoreImplementable<RemoteModule, TableName>
{
private readonly hasPrimaryKey: boolean;
private rows: Map<
ComparablePrimitive,
[RowType<TableDefForTableName<RemoteModule, TableName>>, number]
Expand All @@ -83,6 +84,9 @@ export class TableCacheImpl<
this.tableDef = tableDef;
this.rows = new Map();
this.emitter = new EventEmitter();
this.hasPrimaryKey = Object.values(this.tableDef.columns).some(
col => col.columnMetadata.isPrimaryKey === true
);
// Build index views from the resolved runtime index metadata.
//
// We intentionally use `resolvedIndexes` rather than `indexes`:
Expand Down Expand Up @@ -281,11 +285,7 @@ export class TableCacheImpl<
return pendingCallbacks;
}

// TODO: performance
const hasPrimaryKey = Object.values(this.tableDef.columns).some(
col => col.columnMetadata.isPrimaryKey === true
);
if (hasPrimaryKey) {
if (this.hasPrimaryKey) {
const insertMap = new Map<
ComparablePrimitive,
[
Expand Down
Loading