@@ -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 ]
0 commit comments