From 672e011cd8e5feb7ea6c22accce0d582ac82a037 Mon Sep 17 00:00:00 2001 From: Benjamin Toby Date: Wed, 3 Dec 2025 09:46:11 +0100 Subject: [PATCH] Updates --- .../functions/dsql/sql/sql-generator.js | 32 +++++++++++++++-- dist/package-shared/types/index.d.ts | 7 ++++ .../functions/dsql/sql/sql-generator.ts | 34 ++++++++++++++++++- package-shared/types/index.ts | 8 +++++ package.json | 2 +- 5 files changed, 78 insertions(+), 5 deletions(-) diff --git a/dist/package-shared/functions/dsql/sql/sql-generator.js b/dist/package-shared/functions/dsql/sql/sql-generator.js index 619b5c3..655bc51 100644 --- a/dist/package-shared/functions/dsql/sql/sql-generator.js +++ b/dist/package-shared/functions/dsql/sql/sql-generator.js @@ -99,6 +99,17 @@ function sqlGenerator({ tableName, genObject, dbFullName, count }) { : mtch.target}`; })()}`; } + let fullTextMatchStr = (genObject === null || genObject === void 0 ? void 0 : genObject.fullTextSearch) + ? ` MATCH(${genObject.fullTextSearch.fields + .map((f) => (genObject.join ? `${tableName}.${f}` : `${f}`)) + .join(",")}) AGAINST (?)` + : undefined; + const fullTextSearchStr = (genObject === null || genObject === void 0 ? void 0 : genObject.fullTextSearch) + ? genObject.fullTextSearch.searchTerm + .split(` `) + .map((t) => `${t}`) + .join(" ") + : undefined; let queryString = (() => { var _a, _b, _c; let str = "SELECT"; @@ -189,6 +200,12 @@ function sqlGenerator({ tableName, genObject, dbFullName, count }) { .filter((_) => Boolean(_)) .join(","); } + if ((genObject === null || genObject === void 0 ? void 0 : genObject.fullTextSearch) && + fullTextMatchStr && + fullTextSearchStr) { + str += `, ${fullTextMatchStr} AS ${genObject.fullTextSearch.scoreAlias}`; + sqlSearhValues.push(fullTextSearchStr); + } str += ` FROM ${finalDbName}${tableName}`; if (genObject === null || genObject === void 0 ? void 0 : genObject.join) { str += @@ -247,15 +264,24 @@ function sqlGenerator({ tableName, genObject, dbFullName, count }) { const stringOperator = (genObject === null || genObject === void 0 ? void 0 : genObject.searchOperator) || "AND"; queryString += ` WHERE ${sqlSearhString.join(` ${stringOperator} `)}`; } + else if ((genObject === null || genObject === void 0 ? void 0 : genObject.fullTextSearch) && + fullTextSearchStr && + fullTextMatchStr) { + queryString += ` WHERE ${fullTextMatchStr}`; + sqlSearhValues.push(fullTextSearchStr); + } if ((_a = genObject === null || genObject === void 0 ? void 0 : genObject.group) === null || _a === void 0 ? void 0 : _a[0]) { queryString += ` GROUP BY ${genObject.group .map((g) => `\`${g.toString()}\``) .join(",")}`; } if ((genObject === null || genObject === void 0 ? void 0 : genObject.order) && !count) { - queryString += ` ORDER BY ${genObject.join - ? `${finalDbName}${tableName}.${String(genObject.order.field)}` - : String(genObject.order.field)} ${genObject.order.strategy}`; + queryString += ` ORDER BY ${(genObject === null || genObject === void 0 ? void 0 : genObject.fullTextSearch) && + genObject.fullTextSearch.scoreAlias == genObject.order.field + ? `${genObject.fullTextSearch.scoreAlias}` + : genObject.join + ? `${finalDbName}${tableName}.${String(genObject.order.field)}` + : String(genObject.order.field)} ${genObject.order.strategy}`; } if ((genObject === null || genObject === void 0 ? void 0 : genObject.limit) && !count) queryString += ` LIMIT ${genObject.limit}`; diff --git a/dist/package-shared/types/index.d.ts b/dist/package-shared/types/index.d.ts index d1c9f33..691f5f3 100644 --- a/dist/package-shared/types/index.d.ts +++ b/dist/package-shared/types/index.d.ts @@ -828,8 +828,15 @@ export type ServerQueryParam[]; group?: (keyof T)[]; countSubQueries?: ServerQueryParamsCount[]; + fullTextSearch?: ServerQueryParamFullTextSearch; [key: string]: any; }; +export type ServerQueryParamFullTextSearch = { + fields: string[]; + searchTerm: string; + /** Field Name to user to Rank the Score of Search Results */ + scoreAlias: string; +}; export type ServerQueryParamsCount = { table: string; srcTrgMap: { diff --git a/package-shared/functions/dsql/sql/sql-generator.ts b/package-shared/functions/dsql/sql/sql-generator.ts index 1a641a0..ae749eb 100644 --- a/package-shared/functions/dsql/sql/sql-generator.ts +++ b/package-shared/functions/dsql/sql/sql-generator.ts @@ -152,6 +152,19 @@ export default function sqlGenerator< })()}`; } + let fullTextMatchStr = genObject?.fullTextSearch + ? ` MATCH(${genObject.fullTextSearch.fields + .map((f) => (genObject.join ? `${tableName}.${f}` : `${f}`)) + .join(",")}) AGAINST (?)` + : undefined; + + const fullTextSearchStr = genObject?.fullTextSearch + ? genObject.fullTextSearch.searchTerm + .split(` `) + .map((t) => `${t}`) + .join(" ") + : undefined; + let queryString = (() => { let str = "SELECT"; @@ -255,6 +268,15 @@ export default function sqlGenerator< .join(","); } + if ( + genObject?.fullTextSearch && + fullTextMatchStr && + fullTextSearchStr + ) { + str += `, ${fullTextMatchStr} AS ${genObject.fullTextSearch.scoreAlias}`; + sqlSearhValues.push(fullTextSearchStr); + } + str += ` FROM ${finalDbName}${tableName}`; if (genObject?.join) { @@ -329,6 +351,13 @@ export default function sqlGenerator< if (sqlSearhString?.[0] && sqlSearhString.find((str) => str)) { const stringOperator = genObject?.searchOperator || "AND"; queryString += ` WHERE ${sqlSearhString.join(` ${stringOperator} `)}`; + } else if ( + genObject?.fullTextSearch && + fullTextSearchStr && + fullTextMatchStr + ) { + queryString += ` WHERE ${fullTextMatchStr}`; + sqlSearhValues.push(fullTextSearchStr); } if (genObject?.group?.[0]) { @@ -339,7 +368,10 @@ export default function sqlGenerator< if (genObject?.order && !count) { queryString += ` ORDER BY ${ - genObject.join + genObject?.fullTextSearch && + genObject.fullTextSearch.scoreAlias == genObject.order.field + ? `${genObject.fullTextSearch.scoreAlias}` + : genObject.join ? `${finalDbName}${tableName}.${String(genObject.order.field)}` : String(genObject.order.field) } ${genObject.order.strategy}`; diff --git a/package-shared/types/index.ts b/package-shared/types/index.ts index ffb7530..4f161d4 100644 --- a/package-shared/types/index.ts +++ b/package-shared/types/index.ts @@ -1013,9 +1013,17 @@ export type ServerQueryParam< join?: ServerQueryParamsJoin[]; group?: (keyof T)[]; countSubQueries?: ServerQueryParamsCount[]; + fullTextSearch?: ServerQueryParamFullTextSearch; [key: string]: any; }; +export type ServerQueryParamFullTextSearch = { + fields: string[]; + searchTerm: string; + /** Field Name to user to Rank the Score of Search Results */ + scoreAlias: string; +}; + export type ServerQueryParamsCount = { table: string; srcTrgMap: { diff --git a/package.json b/package.json index 22bc50f..d62549c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moduletrace/datasquirel", - "version": "5.4.4", + "version": "5.4.5", "description": "Cloud-based SQL data management tool", "main": "dist/index.js", "bin": {