From a57a063f679cc21ad6207cb6ff2a825fedd605f7 Mon Sep 17 00:00:00 2001 From: Benjamin Toby Date: Sun, 12 Apr 2026 10:36:32 +0100 Subject: [PATCH] Refactor select count strategy. Run the count query together with the normal query --- dist/lib/sqlite/db-select.js | 16 +++++++++++----- dist/utils/sql-generator.js | 11 ++++------- package.json | 2 +- src/lib/sqlite/db-select.ts | 24 ++++++++++++++++++------ src/utils/sql-generator.ts | 10 ++++------ 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/dist/lib/sqlite/db-select.js b/dist/lib/sqlite/db-select.js index 2280fbf..8b1674f 100644 --- a/dist/lib/sqlite/db-select.js +++ b/dist/lib/sqlite/db-select.js @@ -18,9 +18,8 @@ export default async function DbSelect({ table, query, count, targetId, }) { sqlObj = sqlGenerator({ tableName: table, genObject: finalQuery, - count, }); - const sql = mysql.format(sqlObj.string, sqlObj.values); + let sql = mysql.format(sqlObj.string, sqlObj.values); const res = DbClient.query(sql); const batchRes = res.all(); let resp = { @@ -33,10 +32,17 @@ export default async function DbSelect({ table, query, count, targetId, }) { }, }; if (count) { - const count_val = count ? batchRes[0]?.["COUNT(*)"] : undefined; + let count_sql_object = sqlGenerator({ + tableName: table, + genObject: finalQuery, + count, + }); + let count_sql = mysql.format(count_sql_object.string, count_sql_object.values); + count_sql = `SELECT COUNT(*) FROM (${count_sql}) as c`; + const count_res = DbClient.query(count_sql).all(); + const count_val = count_res[0]?.["COUNT(*)"]; resp["count"] = Number(count_val); - delete resp.payload; - delete resp.singleRes; + resp["debug"]["count_sql"] = count_sql; } return resp; } diff --git a/dist/utils/sql-generator.js b/dist/utils/sql-generator.js index f99bdf0..0fa04e9 100644 --- a/dist/utils/sql-generator.js +++ b/dist/utils/sql-generator.js @@ -141,10 +141,7 @@ export default function sqlGenerator({ tableName, genObject, dbFullName, count } : undefined; let queryString = (() => { let str = "SELECT"; - if (count) { - str += ` COUNT(*)`; - } - else if (genObject?.selectFields?.[0]) { + if (genObject?.selectFields?.[0]) { if (genObject.join) { str += ` ${genObject.selectFields ?.map((fld) => typeof fld == "object" @@ -201,7 +198,7 @@ export default function sqlGenerator({ tableName, genObject, dbFullName, count } } str += `, ${countSqls.join(",")}`; } - if (genObject?.join && !count) { + if (genObject?.join) { const existingJoinTableNames = [tableName]; str += "," + @@ -364,7 +361,7 @@ export default function sqlGenerator({ tableName, genObject, dbFullName, count } orderSrt += ` ${orderFields.join(", ")} ${order.strategy}`; return orderSrt; } - if (genObject?.order && !count) { + if (genObject?.order) { let orderSrt = ` ORDER BY`; if (Array.isArray(genObject.order)) { for (let i = 0; i < genObject.order.length; i++) { @@ -383,7 +380,7 @@ export default function sqlGenerator({ tableName, genObject, dbFullName, count } } if (genObject?.limit && !count) queryString += ` LIMIT ${genObject.limit}`; - if (genObject?.offset && !count) { + if (genObject?.offset) { queryString += ` OFFSET ${genObject.offset}`; } else if (genObject?.page && genObject.limit && !count) { diff --git a/package.json b/package.json index f2130dc..79797a7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moduletrace/bun-sqlite", - "version": "1.0.33", + "version": "1.0.34", "description": "SQLite manager for Bun", "author": "Benjamin Toby", "main": "dist/index.js", diff --git a/src/lib/sqlite/db-select.ts b/src/lib/sqlite/db-select.ts index 2eaa96f..86c3ca4 100644 --- a/src/lib/sqlite/db-select.ts +++ b/src/lib/sqlite/db-select.ts @@ -44,10 +44,9 @@ export default async function DbSelect< sqlObj = sqlGenerator({ tableName: table, genObject: finalQuery, - count, }); - const sql = mysql.format(sqlObj.string, sqlObj.values); + let sql = mysql.format(sqlObj.string, sqlObj.values); const res = DbClient.query(sql); const batchRes = res.all(); @@ -63,11 +62,24 @@ export default async function DbSelect< }; if (count) { - const count_val = count ? batchRes[0]?.["COUNT(*)"] : undefined; - resp["count"] = Number(count_val); + let count_sql_object = sqlGenerator({ + tableName: table, + genObject: finalQuery, + count, + }); - delete resp.payload; - delete resp.singleRes; + let count_sql = mysql.format( + count_sql_object.string, + count_sql_object.values, + ); + + count_sql = `SELECT COUNT(*) FROM (${count_sql}) as c`; + + const count_res = DbClient.query(count_sql).all(); + + const count_val = count_res[0]?.["COUNT(*)"]; + resp["count"] = Number(count_val); + resp["debug"]["count_sql"] = count_sql; } return resp; diff --git a/src/utils/sql-generator.ts b/src/utils/sql-generator.ts index 80a0050..f60082e 100644 --- a/src/utils/sql-generator.ts +++ b/src/utils/sql-generator.ts @@ -221,9 +221,7 @@ export default function sqlGenerator< let queryString = (() => { let str = "SELECT"; - if (count) { - str += ` COUNT(*)`; - } else if (genObject?.selectFields?.[0]) { + if (genObject?.selectFields?.[0]) { if (genObject.join) { str += ` ${genObject.selectFields ?.map((fld) => @@ -295,7 +293,7 @@ export default function sqlGenerator< str += `, ${countSqls.join(",")}`; } - if (genObject?.join && !count) { + if (genObject?.join) { const existingJoinTableNames: string[] = [tableName]; str += @@ -493,7 +491,7 @@ export default function sqlGenerator< return orderSrt; } - if (genObject?.order && !count) { + if (genObject?.order) { let orderSrt = ` ORDER BY`; if (Array.isArray(genObject.order)) { @@ -514,7 +512,7 @@ export default function sqlGenerator< if (genObject?.limit && !count) queryString += ` LIMIT ${genObject.limit}`; - if (genObject?.offset && !count) { + if (genObject?.offset) { queryString += ` OFFSET ${genObject.offset}`; } else if (genObject?.page && genObject.limit && !count) { queryString += ` OFFSET ${(genObject.page - 1) * genObject.limit}`;