This commit is contained in:
Benjamin Toby 2026-02-21 02:34:48 +01:00
parent 0da68e30b8
commit ac489ce443
5 changed files with 100 additions and 30 deletions

View File

@ -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 = [];

View File

@ -909,18 +909,26 @@ export type ServerQueryParam<T extends {
limit?: number;
page?: number;
offset?: number;
order?: ServerQueryParamOrder | ServerQueryParamOrder[];
order?: ServerQueryParamOrder<T> | ServerQueryParamOrder<T>[];
searchOperator?: (typeof ServerQueryOperators)[number];
searchEquality?: (typeof ServerQueryEqualities)[number];
addUserId?: {
fieldName: keyof T;
};
join?: (ServerQueryParamsJoin<K> | ServerQueryParamsJoin<K>[] | undefined)[];
group?: (keyof T)[];
group?: keyof T | ServerQueryParamGroupBy<T> | (keyof T | ServerQueryParamGroupBy<T>)[];
countSubQueries?: ServerQueryParamsCount[];
fullTextSearch?: ServerQueryParamFullTextSearch<T>;
[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;
} = {

View File

@ -26,7 +26,7 @@ type Return = {
* @description Generates an SQL Query for node module `mysql` or `serverless-mysql`
*/
export default function sqlGenerator<
T extends { [key: string]: any } = { [key: string]: any }
T extends { [key: string]: any } = { [key: string]: any },
>({ tableName, genObject, dbFullName, count }: Param<T>): Return {
const finalQuery = genObject?.query ? genObject.query : undefined;
@ -87,7 +87,7 @@ export default function sqlGenerator<
isValueFieldValue: Boolean(
typeof valueParsed == "object" &&
valueParsed.fieldName &&
valueParsed.tableName
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<T>) {
@ -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);

View File

@ -1101,7 +1101,7 @@ export type ServerQueryParam<
limit?: number;
page?: number;
offset?: number;
order?: ServerQueryParamOrder | ServerQueryParamOrder[];
order?: ServerQueryParamOrder<T> | ServerQueryParamOrder<T>[];
searchOperator?: (typeof ServerQueryOperators)[number];
searchEquality?: (typeof ServerQueryEqualities)[number];
addUserId?: {
@ -1112,12 +1112,22 @@ export type ServerQueryParam<
| ServerQueryParamsJoin<K>[]
| undefined
)[];
group?: (keyof T)[];
group?:
| keyof T
| ServerQueryParamGroupBy<T>
| (keyof T | ServerQueryParamGroupBy<T>)[];
countSubQueries?: ServerQueryParamsCount[];
fullTextSearch?: ServerQueryParamFullTextSearch<T>;
[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 },
> = {

View File

@ -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": {