Skip to content

Commit bdde7b8

Browse files
committed
Switched non-rqb queries to JIT-generated mappers
1 parent 5a4d786 commit bdde7b8

File tree

33 files changed

+350
-122
lines changed

33 files changed

+350
-122
lines changed

drizzle-orm/src/aws-data-api/pg/session.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.type
1717
import type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';
1818
import type { AnyRelations } from '~/relations.ts';
1919
import { fillPlaceholders, type QueryTypingsValue, type QueryWithTypings, type SQL, sql } from '~/sql/sql.ts';
20-
import { mapResultRow } from '~/utils.ts';
20+
import { type JitMapper, makeJitQueryMapper } from '~/utils.ts';
2121
import { getValueFromDataApi, toValueParam } from '../common/index.ts';
2222

2323
export type AwsDataApiClient = RDSDataClient;
@@ -29,6 +29,7 @@ export class AwsDataApiPreparedQuery<
2929
static override readonly [entityKind]: string = 'AwsDataApiPreparedQuery';
3030

3131
private rawQuery: ExecuteStatementCommand;
32+
private jitMapper?: JitMapper<T['execute']>;
3233

3334
constructor(
3435
private client: AwsDataApiClient,
@@ -95,9 +96,15 @@ export class AwsDataApiPreparedQuery<
9596
return Object.assign(result, { rows: mappedRows });
9697
}
9798

98-
return customResultMapper
99-
? (customResultMapper as (rows: unknown[][]) => T['execute'])(result.rows!)
100-
: result.rows!.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));
99+
if (customResultMapper) {
100+
return (customResultMapper as (rows: unknown[][]) => unknown)(result.rows);
101+
}
102+
103+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
104+
result.rows,
105+
fields!,
106+
joinsNotNullableMap,
107+
);
101108
}
102109

103110
private async executeRqbV2(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {

drizzle-orm/src/better-sqlite3/session.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
SQLiteSession,
1818
type SQLiteTransactionConfig,
1919
} from '~/sqlite-core/session.ts';
20-
import { type DrizzleTypeError, mapResultRow } from '~/utils.ts';
20+
import { type DrizzleTypeError, type JitMapper, makeJitQueryMapper } from '~/utils.ts';
2121

2222
export interface BetterSQLiteSessionOptions {
2323
logger?: Logger;
@@ -147,6 +147,7 @@ export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig,
147147
>
148148
{
149149
static override readonly [entityKind]: string = 'BetterSQLitePreparedQuery';
150+
private jitMapper?: JitMapper<unknown[]>;
150151

151152
constructor(
152153
private stmt: Statement,
@@ -189,7 +190,12 @@ export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig,
189190
if (customResultMapper) {
190191
return (customResultMapper as (rows: unknown[][]) => unknown)(rows) as T['all'];
191192
}
192-
return rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));
193+
194+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
195+
rows,
196+
fields!,
197+
joinsNotNullableMap,
198+
);
193199
}
194200

195201
get(placeholderValues?: Record<string, unknown>): T['get'] {
@@ -213,7 +219,11 @@ export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig,
213219
return (customResultMapper as (rows: unknown[][]) => unknown)([row]) as T['get'];
214220
}
215221

216-
return mapResultRow(fields!, row, joinsNotNullableMap);
222+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
223+
[row],
224+
fields!,
225+
joinsNotNullableMap,
226+
)[0];
217227
}
218228

219229
private allRqbV2(placeholderValues?: Record<string, unknown>): T['all'] {

drizzle-orm/src/bun-sql/mysql/session.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ import {
2424
import type { AnyRelations } from '~/relations.ts';
2525
import { fillPlaceholders } from '~/sql/sql.ts';
2626
import type { Query, SQL } from '~/sql/sql.ts';
27-
import { type Assume, mapResultRow } from '~/utils.ts';
27+
import { type Assume, type JitMapper, makeJitQueryMapper } from '~/utils.ts';
2828

2929
export class BunMySqlPreparedQuery<T extends MySqlPreparedQueryConfig, TIsRqbV2 extends boolean = false>
3030
extends MySqlPreparedQuery<T>
3131
{
3232
static override readonly [entityKind]: string = 'BunMySqlPreparedQuery';
33+
private jitMapper?: JitMapper<(T['execute'] extends any[] ? T['execute'][number] : T['execute'])[]>;
3334

3435
constructor(
3536
private client: BunSQL,
@@ -115,7 +116,11 @@ export class BunMySqlPreparedQuery<T extends MySqlPreparedQueryConfig, TIsRqbV2
115116
return customResultMapper(rows);
116117
}
117118

118-
return rows.map((row: unknown[]) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));
119+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
120+
rows,
121+
fields!,
122+
joinsNotNullableMap,
123+
);
119124
}
120125

121126
private async executeRqbV2(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {
@@ -149,7 +154,11 @@ export class BunMySqlPreparedQuery<T extends MySqlPreparedQueryConfig, TIsRqbV2
149154
const mappedRow = (customResultMapper as (rows: unknown[][]) => T['execute'])([row as unknown[]]);
150155
yield (Array.isArray(mappedRow) ? mappedRow[0] : mappedRow);
151156
} else {
152-
yield mapResultRow(fields!, row as unknown[], joinsNotNullableMap);
157+
yield (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
158+
[row as unknown[]],
159+
fields!,
160+
joinsNotNullableMap,
161+
)[0] as T['execute'];
153162
}
154163
} else {
155164
yield row as T['execute'];

drizzle-orm/src/bun-sql/postgres/session.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ import type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from
1414
import type { AnyRelations } from '~/relations.ts';
1515
import { fillPlaceholders, type Query } from '~/sql/sql.ts';
1616
import { tracer } from '~/tracing.ts';
17-
import { type Assume, mapResultRow } from '~/utils.ts';
17+
import { type Assume, type JitMapper, makeJitQueryMapper } from '~/utils.ts';
1818

1919
export class BunSQLPreparedQuery<T extends PreparedQueryConfig, TIsRqbV2 extends boolean = false>
2020
extends PgAsyncPreparedQuery<T>
2121
{
2222
static override readonly [entityKind]: string = 'BunSQLPreparedQuery';
23+
private jitMapper?: JitMapper<T['execute']>;
2324

2425
constructor(
2526
private client: SQL,
@@ -76,9 +77,15 @@ export class BunSQLPreparedQuery<T extends PreparedQueryConfig, TIsRqbV2 extends
7677
});
7778

7879
return tracer.startActiveSpan('drizzle.mapResponse', () => {
79-
return customResultMapper
80-
? customResultMapper(rows)
81-
: rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));
80+
if (customResultMapper) {
81+
return (customResultMapper as (rows: unknown[][]) => unknown)(rows);
82+
}
83+
84+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
85+
rows,
86+
fields!,
87+
joinsNotNullableMap,
88+
);
8289
});
8390
});
8491
}

drizzle-orm/src/bun-sql/sqlite/session.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import type {
2020
SQLiteTransactionConfig,
2121
} from '~/sqlite-core/session.ts';
2222
import { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';
23-
import { mapResultRow } from '~/utils.ts';
23+
import { type JitMapper, makeJitQueryMapper } from '~/utils.ts';
2424

2525
export interface BunSQLiteSessionOptions {
2626
logger?: Logger;
@@ -185,6 +185,7 @@ export class BunSQLitePreparedQuery<
185185
}
186186
> {
187187
static override readonly [entityKind]: string = 'BunSQLitePreparedQuery';
188+
private jitMapper?: JitMapper<unknown[]>;
188189

189190
constructor(
190191
private client: BunSQL,
@@ -240,7 +241,11 @@ export class BunSQLitePreparedQuery<
240241
) => unknown)(rows);
241242
}
242243

243-
return rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));
244+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
245+
rows,
246+
fields!,
247+
joinsNotNullableMap,
248+
);
244249
}
245250

246251
private async allRqbV2(placeholderValues: Record<string, unknown> = {}): Promise<T['all']> {
@@ -281,7 +286,11 @@ export class BunSQLitePreparedQuery<
281286
}
282287

283288
if (row === undefined) return row;
284-
return mapResultRow(fields!, row, joinsNotNullableMap);
289+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
290+
[row],
291+
fields!,
292+
joinsNotNullableMap,
293+
)[0];
285294
}
286295

287296
private async getRqbV2(placeholderValues: Record<string, unknown> = {}) {

drizzle-orm/src/bun-sqlite/session.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import type {
1616
SQLiteTransactionConfig,
1717
} from '~/sqlite-core/session.ts';
1818
import { SQLitePreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session.ts';
19-
import { type DrizzleTypeError, mapResultRow } from '~/utils.ts';
19+
import { type DrizzleTypeError, type JitMapper, makeJitQueryMapper } from '~/utils.ts';
2020

2121
export interface SQLiteBunSessionOptions {
2222
logger?: Logger;
@@ -141,6 +141,7 @@ export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig,
141141
>
142142
{
143143
static override readonly [entityKind]: string = 'SQLiteBunPreparedQuery';
144+
private jitMapper?: JitMapper<T['execute']>;
144145

145146
constructor(
146147
private stmt: Statement,
@@ -179,7 +180,11 @@ export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig,
179180
return (customResultMapper as (rows: unknown[][]) => unknown)(rows) as T['all'];
180181
}
181182

182-
return rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));
183+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
184+
rows,
185+
fields!,
186+
joinsNotNullableMap,
187+
);
183188
}
184189

185190
get(placeholderValues?: Record<string, unknown>): T['get'] {
@@ -205,7 +210,11 @@ export class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig,
205210
return (customResultMapper as (rows: unknown[][]) => unknown)([row]) as T['get'];
206211
}
207212

208-
return mapResultRow(fields!, row, joinsNotNullableMap);
213+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
214+
[row],
215+
fields!,
216+
joinsNotNullableMap,
217+
)[0];
209218
}
210219

211220
private allRqbV2(placeholderValues?: Record<string, unknown>): T['all'] {

drizzle-orm/src/cockroach/session.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { entityKind } from '~/entity.ts';
1414
import { type Logger, NoopLogger } from '~/logger.ts';
1515
import { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';
1616
import { tracer } from '~/tracing.ts';
17-
import { type Assume, mapResultRow } from '~/utils.ts';
17+
import { type Assume, type JitMapper, makeJitQueryMapper } from '~/utils.ts';
1818

1919
const { Pool, types } = pg;
2020

@@ -25,6 +25,7 @@ export class NodeCockroachPreparedQuery<T extends PreparedQueryConfig> extends C
2525

2626
private rawQueryConfig: QueryConfig;
2727
private queryConfig: QueryArrayConfig;
28+
private jitMapper?: JitMapper<T['execute']>;
2829

2930
constructor(
3031
private client: NodeCockroachClient,
@@ -155,9 +156,15 @@ export class NodeCockroachPreparedQuery<T extends PreparedQueryConfig> extends C
155156
});
156157

157158
return tracer.startActiveSpan('drizzle.mapResponse', () => {
158-
return customResultMapper
159-
? customResultMapper(result.rows)
160-
: result.rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));
159+
if (customResultMapper) {
160+
return (customResultMapper as (rows: unknown[][]) => unknown)(result.rows);
161+
}
162+
163+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
164+
result.rows,
165+
fields!,
166+
joinsNotNullableMap,
167+
);
161168
});
162169
});
163170
}

drizzle-orm/src/d1/session.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import type {
1919
SQLiteTransactionConfig,
2020
} from '~/sqlite-core/session.ts';
2121
import { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';
22-
import { mapResultRow } from '~/utils.ts';
22+
import { type JitMapper, makeJitQueryMapper } from '~/utils.ts';
2323

2424
export interface SQLiteD1SessionOptions {
2525
logger?: Logger;
@@ -204,6 +204,7 @@ export class D1PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig
204204
>
205205
{
206206
static override readonly [entityKind]: string = 'D1PreparedQuery';
207+
private jitMapper?: JitMapper<unknown[]>;
207208

208209
/** @internal */
209210
fields?: SelectedFieldsOrdered;
@@ -282,13 +283,17 @@ export class D1PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig
282283
return (this.customResultMapper as (rows: unknown[][]) => unknown)(rows as unknown[][]);
283284
}
284285

285-
return (rows as unknown[][]).map((row) => mapResultRow(this.fields!, row, this.joinsNotNullableMap));
286+
return (this.jitMapper ??= makeJitQueryMapper(this.fields!, this.joinsNotNullableMap))(
287+
rows as unknown[][],
288+
this.fields!,
289+
this.joinsNotNullableMap,
290+
);
286291
}
287292

288293
async get(placeholderValues?: Record<string, unknown>): Promise<T['get']> {
289294
if (this.isRqbV2Query) return this.getRqbV2(placeholderValues);
290295

291-
const { fields, joinsNotNullableMap, query, logger, stmt, customResultMapper } = this;
296+
const { fields, query, logger, stmt, customResultMapper } = this;
292297
if (!fields && !customResultMapper) {
293298
const params = fillPlaceholders(query.params, placeholderValues ?? {});
294299
logger.logQuery(query.sql, params);
@@ -307,7 +312,7 @@ export class D1PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig
307312
return (customResultMapper as (rows: unknown[][]) => unknown)(rows) as T['all'];
308313
}
309314

310-
return mapResultRow(fields!, rows[0], joinsNotNullableMap);
315+
return this.mapGetResult(rows[0]);
311316
}
312317

313318
private async getRqbV2(placeholderValues?: Record<string, unknown>): Promise<T['get']> {
@@ -337,7 +342,11 @@ export class D1PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig
337342
return (this.customResultMapper as (rows: unknown[][]) => unknown)([result as unknown[]]) as T['all'];
338343
}
339344

340-
return mapResultRow(this.fields!, result as unknown[], this.joinsNotNullableMap);
345+
return (this.jitMapper ??= makeJitQueryMapper(this.fields!, this.joinsNotNullableMap))(
346+
[result as unknown[]],
347+
this.fields!,
348+
this.joinsNotNullableMap,
349+
)[0];
341350
}
342351

343352
async values<T extends any[] = unknown[]>(placeholderValues?: Record<string, unknown>): Promise<T[]> {

drizzle-orm/src/durable-sqlite/session.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
SQLiteSession,
1414
type SQLiteTransactionConfig,
1515
} from '~/sqlite-core/session.ts';
16-
import { type DrizzleTypeError, mapResultRow } from '~/utils.ts';
16+
import { type DrizzleTypeError, type JitMapper, makeJitQueryMapper } from '~/utils.ts';
1717

1818
export interface SQLiteDOSessionOptions {
1919
logger?: Logger;
@@ -145,6 +145,7 @@ export class SQLiteDOPreparedQuery<
145145
execute: T['execute'];
146146
}> {
147147
static override readonly [entityKind]: string = 'SQLiteDOPreparedQuery';
148+
private jitMapper?: JitMapper<unknown[]>;
148149

149150
constructor(
150151
private client: DurableObjectStorage,
@@ -189,7 +190,11 @@ export class SQLiteDOPreparedQuery<
189190
return (customResultMapper as (rows: unknown[][]) => unknown)(rows) as T['all'];
190191
}
191192

192-
return rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));
193+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
194+
rows,
195+
fields!,
196+
joinsNotNullableMap,
197+
);
193198
}
194199

195200
private allRqbV2(placeholderValues?: Record<string, unknown>): T['all'] {
@@ -227,7 +232,11 @@ export class SQLiteDOPreparedQuery<
227232
return (customResultMapper as (rows: unknown[][]) => unknown)(rows) as T['get'];
228233
}
229234

230-
return mapResultRow(fields!, row, joinsNotNullableMap);
235+
return (this.jitMapper ??= makeJitQueryMapper(fields!, joinsNotNullableMap))(
236+
[row],
237+
fields!,
238+
joinsNotNullableMap,
239+
)[0];
231240
}
232241

233242
private getRqbV2(placeholderValues?: Record<string, unknown>): T['get'] {

0 commit comments

Comments
 (0)