diff --git a/dist/package-shared/functions/dsql/sql/sql-generator.js b/dist/package-shared/functions/dsql/sql/sql-generator.js index c5f46ca..1fba24b 100644 --- a/dist/package-shared/functions/dsql/sql/sql-generator.js +++ b/dist/package-shared/functions/dsql/sql/sql-generator.js @@ -11,7 +11,6 @@ const sql_gen_operator_gen_1 = __importDefault(require("./sql-gen-operator-gen") * @description Generates an SQL Query for node module `mysql` or `serverless-mysql` */ function sqlGenerator({ tableName, genObject, dbFullName, count }) { - var _a; const finalQuery = (genObject === null || genObject === void 0 ? void 0 : genObject.query) ? genObject.query : undefined; const queryKeys = finalQuery ? Object.keys(finalQuery) : undefined; const sqlSearhValues = []; @@ -300,10 +299,37 @@ function sqlGenerator({ tableName, genObject, dbFullName, count }) { queryString += `${isSearchStr ? " AND" : " 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.group) { + let group_by_txt = ``; + if (typeof genObject.group == "string") { + group_by_txt = genObject.group; + } + else if (Array.isArray(genObject.group)) { + for (let i = 0; i < genObject.group.length; i++) { + const group = genObject.group[i]; + if (typeof group == "string") { + group_by_txt += `\`${group.toString()}\``; + } + else if (typeof group == "object" && group.table) { + group_by_txt += `${group.table}.${String(group.field)}`; + } + else if (typeof group == "object") { + group_by_txt += `${String(group.field)}`; + } + if (i < genObject.group.length - 1) { + group_by_txt += ","; + } + } + } + else if (typeof genObject.group == "object") { + if (genObject.group.table) { + group_by_txt = `${genObject.group.table}.${String(genObject.group.field)}`; + } + else { + group_by_txt = `${String(genObject.group.field)}`; + } + } + queryString += ` GROUP BY ${group_by_txt}`; } function grabOrderString(order) { let orderFields = []; diff --git a/dist/package-shared/types/index.d.ts b/dist/package-shared/types/index.d.ts index 4465f50..9d77e03 100644 --- a/dist/package-shared/types/index.d.ts +++ b/dist/package-shared/types/index.d.ts @@ -909,18 +909,26 @@ export type ServerQueryParam | ServerQueryParamOrder[]; searchOperator?: (typeof ServerQueryOperators)[number]; searchEquality?: (typeof ServerQueryEqualities)[number]; addUserId?: { fieldName: keyof T; }; join?: (ServerQueryParamsJoin | ServerQueryParamsJoin[] | undefined)[]; - group?: (keyof T)[]; + group?: keyof T | ServerQueryParamGroupBy | (keyof T | ServerQueryParamGroupBy)[]; countSubQueries?: ServerQueryParamsCount[]; fullTextSearch?: ServerQueryParamFullTextSearch; [key: string]: any; }; +export type ServerQueryParamGroupBy = { + field: keyof T; + table?: string; +}; export type ServerQueryParamOrder({ tableName, genObject, dbFullName, count }: Param): Return { const finalQuery = genObject?.query ? genObject.query : undefined; @@ -69,10 +69,10 @@ export default function sqlGenerator< typeof valueParsed == "string" ? valueParsed : valueParsed - ? valueParsed.fieldName && valueParsed.tableName - ? `${valueParsed.tableName}.${valueParsed.fieldName}` - : valueParsed.value?.toString() - : undefined; + ? valueParsed.fieldName && valueParsed.tableName + ? `${valueParsed.tableName}.${valueParsed.fieldName}` + : valueParsed.value?.toString() + : undefined; const valueEquality = typeof valueParsed == "object" @@ -86,8 +86,8 @@ export default function sqlGenerator< value: valueString?.toString() || "", isValueFieldValue: Boolean( typeof valueParsed == "object" && - valueParsed.fieldName && - valueParsed.tableName + valueParsed.fieldName && + valueParsed.tableName, ), }); @@ -144,7 +144,7 @@ export default function sqlGenerator< function generateJoinStr( mtch: ServerQueryParamsJoinMatchObject, - join: ServerQueryParamsJoin + join: ServerQueryParamsJoin, ) { return `${finalDbName}${ typeof mtch.source == "object" ? mtch.source.tableName : tableName @@ -182,7 +182,7 @@ export default function sqlGenerator< let fullTextMatchStr = genObject?.fullTextSearch ? ` MATCH(${genObject.fullTextSearch.fields .map((f) => - genObject.join ? `${tableName}.${String(f)}` : `${String(f)}` + genObject.join ? `${tableName}.${String(f)}` : `${String(f)}`, ) .join(",")}) AGAINST (? IN BOOLEAN MODE)` : undefined; @@ -206,7 +206,7 @@ export default function sqlGenerator< typeof fld == "object" ? `${finalDbName}${tableName}.${fld.fieldName.toString()}` + (fld.alias ? ` as ${fld.alias}` : ``) - : `${finalDbName}${tableName}.${String(fld)}` + : `${finalDbName}${tableName}.${String(fld)}`, ) .join(",")}`; } else { @@ -215,7 +215,7 @@ export default function sqlGenerator< typeof fld == "object" ? `${fld.fieldName.toString()}` + (fld.alias ? ` as ${fld.alias}` : ``) - : fld + : fld, ) .join(",")}`; } @@ -340,12 +340,12 @@ export default function sqlGenerator< "(" + join.match .map((mtch) => - generateJoinStr(mtch, join) + generateJoinStr(mtch, join), ) .join( join.operator ? ` ${join.operator} ` - : " AND " + : " AND ", ) + ")" ); @@ -394,7 +394,7 @@ export default function sqlGenerator< }); const cleanedUpSearchStr = sqlSearhString?.filter( - (str) => typeof str == "string" + (str) => typeof str == "string", ); const isSearchStr = @@ -403,7 +403,7 @@ export default function sqlGenerator< if (isSearchStr) { const stringOperator = genObject?.searchOperator || "AND"; queryString += ` WHERE ${cleanedUpSearchStr.join( - ` ${stringOperator} ` + ` ${stringOperator} `, )}`; } @@ -412,10 +412,36 @@ export default function sqlGenerator< sqlSearhValues.push(fullTextSearchStr); } - if (genObject?.group?.[0]) { - queryString += ` GROUP BY ${genObject.group - .map((g) => `\`${g.toString()}\``) - .join(",")}`; + if (genObject?.group) { + let group_by_txt = ``; + + if (typeof genObject.group == "string") { + group_by_txt = genObject.group; + } else if (Array.isArray(genObject.group)) { + for (let i = 0; i < genObject.group.length; i++) { + const group = genObject.group[i]; + + if (typeof group == "string") { + group_by_txt += `\`${group.toString()}\``; + } else if (typeof group == "object" && group.table) { + group_by_txt += `${group.table}.${String(group.field)}`; + } else if (typeof group == "object") { + group_by_txt += `${String(group.field)}`; + } + + if (i < genObject.group.length - 1) { + group_by_txt += ","; + } + } + } else if (typeof genObject.group == "object") { + if (genObject.group.table) { + group_by_txt = `${genObject.group.table}.${String(genObject.group.field)}`; + } else { + group_by_txt = `${String(genObject.group.field)}`; + } + } + + queryString += ` GROUP BY ${group_by_txt}`; } function grabOrderString(order: ServerQueryParamOrder) { @@ -426,7 +452,7 @@ export default function sqlGenerator< orderFields.push(genObject.fullTextSearch.scoreAlias); } else if (genObject?.join) { orderFields.push( - `${finalDbName}${tableName}.${String(order.field)}` + `${finalDbName}${tableName}.${String(order.field)}`, ); } else { orderFields.push(order.field); diff --git a/package-shared/types/index.ts b/package-shared/types/index.ts index e731839..afae03e 100644 --- a/package-shared/types/index.ts +++ b/package-shared/types/index.ts @@ -1101,7 +1101,7 @@ export type ServerQueryParam< limit?: number; page?: number; offset?: number; - order?: ServerQueryParamOrder | ServerQueryParamOrder[]; + order?: ServerQueryParamOrder | ServerQueryParamOrder[]; searchOperator?: (typeof ServerQueryOperators)[number]; searchEquality?: (typeof ServerQueryEqualities)[number]; addUserId?: { @@ -1112,12 +1112,22 @@ export type ServerQueryParam< | ServerQueryParamsJoin[] | undefined )[]; - group?: (keyof T)[]; + group?: + | keyof T + | ServerQueryParamGroupBy + | (keyof T | ServerQueryParamGroupBy)[]; countSubQueries?: ServerQueryParamsCount[]; fullTextSearch?: ServerQueryParamFullTextSearch; [key: string]: any; }; +export type ServerQueryParamGroupBy< + T extends { [k: string]: any } = { [k: string]: any }, +> = { + field: keyof T; + table?: string; +}; + export type ServerQueryParamOrder< T extends { [k: string]: any } = { [k: string]: any }, > = { diff --git a/package.json b/package.json index bf71719..d3564c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@moduletrace/datasquirel", - "version": "5.7.52", + "version": "5.7.53", "description": "Cloud-based SQL data management tool", "main": "dist/index.js", "bin": {