Skip to content

Commit 98fb1c3

Browse files
committed
perf(database): specialize single-predicate selects
1 parent b165598 commit 98fb1c3

1 file changed

Lines changed: 27 additions & 9 deletions

File tree

  • storage/framework/core/database/src

storage/framework/core/database/src/utils.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,7 +1294,10 @@ function hasActiveQueryBuilderHooks(): boolean {
12941294
*/
12951295
function createDeferredSqliteSelect(instance: RawQueryBuilder, table: string): unknown {
12961296
let columns: string[] | undefined
1297-
const predicates: Array<{ column: string, operator: string, value: unknown }> = []
1297+
let predicateColumn: string | undefined
1298+
let predicateOperator: string | undefined
1299+
let predicateValue: unknown
1300+
let additionalPredicates: Array<{ column: string, operator: string, value: unknown }> | undefined
12981301
let rowLimit: number | undefined
12991302
let materialized: ReturnType<RawQueryBuilder['selectFrom']> | undefined
13001303

@@ -1306,9 +1309,13 @@ function createDeferredSqliteSelect(instance: RawQueryBuilder, table: string): u
13061309
const apply = builder.select as unknown as (value: unknown) => typeof builder
13071310
builder = apply.call(builder, columns)
13081311
}
1309-
for (const predicate of predicates) {
1312+
if (predicateColumn !== undefined) {
13101313
const apply = builder.where as unknown as (column: unknown, operator: unknown, value: unknown) => typeof builder
1311-
builder = apply.call(builder, predicate.column, predicate.operator, predicate.value)
1314+
builder = apply.call(builder, predicateColumn, predicateOperator, predicateValue)
1315+
if (additionalPredicates) {
1316+
for (const predicate of additionalPredicates)
1317+
builder = apply.call(builder, predicate.column, predicate.operator, predicate.value)
1318+
}
13121319
}
13131320
if (rowLimit !== undefined) {
13141321
const apply = builder.limit as unknown as (value: unknown) => typeof builder
@@ -1336,7 +1343,14 @@ function createDeferredSqliteSelect(instance: RawQueryBuilder, table: string): u
13361343
const apply = builder.where as unknown as (column: unknown, operator: unknown, value: unknown) => typeof builder
13371344
return apply.call(builder, column, operator, value)
13381345
}
1339-
predicates.push({ column, operator, value })
1346+
if (predicateColumn === undefined) {
1347+
predicateColumn = column
1348+
predicateOperator = operator
1349+
predicateValue = value
1350+
}
1351+
else {
1352+
;(additionalPredicates ??= []).push({ column, operator, value })
1353+
}
13401354
return proxy
13411355
},
13421356
limit(value: unknown) {
@@ -1352,11 +1366,15 @@ function createDeferredSqliteSelect(instance: RawQueryBuilder, table: string): u
13521366
const selected = columns?.join(', ') ?? '*'
13531367
let query = `SELECT ${selected} FROM ${table}`
13541368
const params: unknown[] = []
1355-
if (predicates.length > 0) {
1356-
query += ` WHERE ${predicates.map((predicate) => {
1357-
params.push(predicate.value)
1358-
return `${predicate.column} ${predicate.operator} ?`
1359-
}).join(' AND ')}`
1369+
if (predicateColumn !== undefined) {
1370+
query += ` WHERE ${predicateColumn} ${predicateOperator} ?`
1371+
params.push(predicateValue)
1372+
if (additionalPredicates) {
1373+
query += ` AND ${additionalPredicates.map((predicate) => {
1374+
params.push(predicate.value)
1375+
return `${predicate.column} ${predicate.operator} ?`
1376+
}).join(' AND ')}`
1377+
}
13601378
}
13611379
if (rowLimit !== undefined)
13621380
query += ` LIMIT ${rowLimit}`

0 commit comments

Comments
 (0)