This commit is contained in:
Benjamin Toby 2025-08-14 15:16:35 +01:00
parent e8269a8b5e
commit 82bea3efd0
8 changed files with 240 additions and 141 deletions

View File

@ -2,11 +2,15 @@ import { ServerQueryEqualities } from "../../../types";
type Params = { type Params = {
fieldName: string; fieldName: string;
value?: string; value?: string;
equality: (typeof ServerQueryEqualities)[number]; equality?: (typeof ServerQueryEqualities)[number];
};
type Return = {
str?: string;
param?: string;
}; };
/** /**
* # SQL Gen Operator Gen * # SQL Gen Operator Gen
* @description Generates an SQL operator for node module `mysql` or `serverless-mysql` * @description Generates an SQL operator for node module `mysql` or `serverless-mysql`
*/ */
export default function sqlGenOperatorGen({ fieldName, value, equality, }: Params): string; export default function sqlGenOperatorGen({ fieldName, value, equality, }: Params): Return;
export {}; export {};

View File

@ -12,45 +12,76 @@ const sql_equality_parser_1 = __importDefault(require("../../../utils/sql-equali
function sqlGenOperatorGen({ fieldName, value, equality, }) { function sqlGenOperatorGen({ fieldName, value, equality, }) {
if (value) { if (value) {
if (equality == "LIKE") { if (equality == "LIKE") {
return `LOWER(${fieldName}) LIKE LOWER('%${value}%')`; return {
str: `LOWER(${fieldName}) LIKE LOWER('%${value}%')`,
};
} }
else if (equality == "LIKE_RAW") { else if (equality == "LIKE_RAW") {
return `LOWER(${fieldName}) LIKE LOWER('${value}')`; return {
str: `LOWER(${fieldName}) LIKE LOWER(?)`,
param: value,
};
} }
else if (equality == "NOT LIKE") { else if (equality == "NOT LIKE") {
return `LOWER(${fieldName}) NOT LIKE LOWER('%${value}%')`; return {
str: `LOWER(${fieldName}) NOT LIKE LOWER('%${value}%')`,
};
} }
else if (equality == "NOT LIKE_RAW") { else if (equality == "NOT LIKE_RAW") {
return `LOWER(${fieldName}) NOT LIKE LOWER('${value}')`; return {
str: `LOWER(${fieldName}) NOT LIKE LOWER(?)`,
param: value,
};
} }
else if (equality == "REGEXP") { else if (equality == "REGEXP") {
return `LOWER(${fieldName}) REGEXP LOWER('${value}')`; return {
str: `LOWER(${fieldName}) REGEXP LOWER(?')`,
param: value,
};
} }
else if (equality == "FULLTEXT") { else if (equality == "FULLTEXT") {
return `MATCH(${fieldName}) AGAINST('${value}' IN BOOLEAN MODE)`; return {
str: `MATCH(${fieldName}) AGAINST(? IN BOOLEAN MODE)`,
param: value,
};
} }
else if (equality == "NOT EQUAL") { else if (equality == "NOT EQUAL") {
return `${fieldName} != ${value}`; return {
str: `${fieldName} != ?`,
param: value,
};
} }
else if (equality) { else if (equality) {
return `${fieldName} ${(0, sql_equality_parser_1.default)(equality)} ${value}`; return {
str: `${fieldName} ${(0, sql_equality_parser_1.default)(equality)} ?`,
param: value,
};
} }
else { else {
return `${fieldName} = ${value}`; return {
str: `${fieldName} = ?`,
param: value,
};
} }
} }
else { else {
if (equality == "IS NULL") { if (equality == "IS NULL") {
return `${fieldName} IS NULL`; return { str: `${fieldName} IS NULL` };
} }
else if (equality == "IS NOT NULL") { else if (equality == "IS NOT NULL") {
return `${fieldName} IS NOT NULL`; return { str: `${fieldName} IS NOT NULL` };
} }
else if (equality) { else if (equality) {
return `${fieldName} ${(0, sql_equality_parser_1.default)(equality)} ?`; return {
str: `${fieldName} ${(0, sql_equality_parser_1.default)(equality)} ?`,
param: value,
};
} }
else { else {
return `${fieldName} = ?`; return {
str: `${fieldName} = ?`,
param: value,
};
} }
} }
} }

View File

@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.default = sqlGenerator; exports.default = sqlGenerator;
const sql_equality_parser_1 = __importDefault(require("../../../utils/sql-equality-parser")); const sql_gen_operator_gen_1 = __importDefault(require("./sql-gen-operator-gen"));
/** /**
* # SQL Query Generator * # SQL Query Generator
* @description Generates an SQL Query for node module `mysql` or `serverless-mysql` * @description Generates an SQL Query for node module `mysql` or `serverless-mysql`
@ -29,68 +29,72 @@ function sqlGenerator({ tableName, genObject, dbFullName, count }) {
return field; return field;
})(); })();
let str = `${finalFieldName}=?`; let str = `${finalFieldName}=?`;
if (queryObj.nullValue) { if (Array.isArray(queryObj.value)) {
str = `${finalFieldName} IS NULL`;
}
else if (queryObj.notNullValue) {
str = `${finalFieldName} IS NOT NULL`;
}
else if (typeof queryObj.value == "string" ||
typeof queryObj.value == "number") {
const valueParsed = String(queryObj.value);
const operator = (0, sql_equality_parser_1.default)(queryObj.equality || "EQUAL");
if (queryObj.equality == "LIKE") {
str = `LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')`;
}
else if (queryObj.equality == "LIKE_RAW") {
str = `LOWER(${finalFieldName}) LIKE LOWER(?)`;
sqlSearhValues.push(valueParsed);
}
else if (queryObj.equality == "NOT LIKE") {
str = `LOWER(${finalFieldName}) NOT LIKE LOWER('%${valueParsed}%')`;
}
else if (queryObj.equality == "NOT LIKE_RAW") {
str = `LOWER(${finalFieldName}) NOT LIKE LOWER(?)`;
sqlSearhValues.push(valueParsed);
}
else if (queryObj.equality == "REGEXP") {
str = `LOWER(${finalFieldName}) REGEXP LOWER(?)`;
sqlSearhValues.push(valueParsed);
}
else if (queryObj.equality == "FULLTEXT") {
str = `MATCH(${finalFieldName}) AGAINST(? IN BOOLEAN MODE)`;
sqlSearhValues.push(valueParsed);
}
else if (queryObj.equality == "NOT EQUAL") {
str = `${finalFieldName} != ?`;
sqlSearhValues.push(valueParsed);
}
else if (queryObj.equality) {
str = `${finalFieldName} ${operator} ?`;
sqlSearhValues.push(valueParsed);
}
else {
sqlSearhValues.push(valueParsed);
}
}
else if (Array.isArray(queryObj.value)) {
const strArray = []; const strArray = [];
queryObj.value.forEach((val) => { queryObj.value.forEach((val) => {
var _a;
const valueParsed = val; const valueParsed = val;
if (queryObj.equality == "LIKE") { const valueString = typeof valueParsed == "string"
strArray.push(`LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')`); ? valueParsed
: (_a = valueParsed.value) === null || _a === void 0 ? void 0 : _a.toString();
const valueEquality = typeof valueParsed == "object"
? valueParsed.equality || queryObj.equality
: queryObj.equality;
const operatorStrParam = (0, sql_gen_operator_gen_1.default)({
equality: valueEquality,
fieldName: finalFieldName || "",
value: (valueString === null || valueString === void 0 ? void 0 : valueString.toString()) || "",
});
if (operatorStrParam.str && operatorStrParam.param) {
strArray.push(operatorStrParam.str);
sqlSearhValues.push(operatorStrParam.param);
} }
else if (queryObj.equality == "NOT EQUAL") { else if (operatorStrParam.str) {
strArray.push(`${finalFieldName} != ?`); strArray.push(operatorStrParam.str);
sqlSearhValues.push(valueParsed);
}
else {
strArray.push(`${finalFieldName} = ?`);
sqlSearhValues.push(valueParsed);
} }
}); });
str = "(" + strArray.join(` ${queryObj.operator || "AND"} `) + ")"; str = "(" + strArray.join(` ${queryObj.operator || "AND"} `) + ")";
} }
else {
const valueParsed = String(queryObj.value);
const operatorStrParam = (0, sql_gen_operator_gen_1.default)({
equality: queryObj.equality,
fieldName: finalFieldName || "",
value: valueParsed,
});
if (operatorStrParam.str && operatorStrParam.param) {
str = operatorStrParam.str;
sqlSearhValues.push(operatorStrParam.param);
}
else if (operatorStrParam.str) {
str = operatorStrParam.str;
}
// if (queryObj.equality == "LIKE") {
// str = `LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')`;
// } else if (queryObj.equality == "LIKE_RAW") {
// str = `LOWER(${finalFieldName}) LIKE LOWER(?)`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality == "NOT LIKE") {
// str = `LOWER(${finalFieldName}) NOT LIKE LOWER('%${valueParsed}%')`;
// } else if (queryObj.equality == "NOT LIKE_RAW") {
// str = `LOWER(${finalFieldName}) NOT LIKE LOWER(?)`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality == "REGEXP") {
// str = `LOWER(${finalFieldName}) REGEXP LOWER(?)`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality == "FULLTEXT") {
// str = `MATCH(${finalFieldName}) AGAINST(? IN BOOLEAN MODE)`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality == "NOT EQUAL") {
// str = `${finalFieldName} != ?`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality) {
// str = `${finalFieldName} ${operator} ?`;
// sqlSearhValues.push(valueParsed);
// } else {
// sqlSearhValues.push(valueParsed);
// }
}
return str; return str;
} }
const sqlSearhString = queryKeys === null || queryKeys === void 0 ? void 0 : queryKeys.map((field) => { const sqlSearhString = queryKeys === null || queryKeys === void 0 ? void 0 : queryKeys.map((field) => {
@ -114,9 +118,7 @@ function sqlGenerator({ tableName, genObject, dbFullName, count }) {
} }
return genSqlSrchStr({ queryObj, field, join: genObject === null || genObject === void 0 ? void 0 : genObject.join }); return genSqlSrchStr({ queryObj, field, join: genObject === null || genObject === void 0 ? void 0 : genObject.join });
}); });
function generateJoinStr( function generateJoinStr(mtch, join) {
/** @type {import("../../../types").ServerQueryParamsJoinMatchObject} */ mtch,
/** @type {import("../../../types").ServerQueryParamsJoin} */ join) {
return `${finalDbName}${typeof mtch.source == "object" ? mtch.source.tableName : tableName}.${typeof mtch.source == "object" ? mtch.source.fieldName : mtch.source}=${(() => { return `${finalDbName}${typeof mtch.source == "object" ? mtch.source.tableName : tableName}.${typeof mtch.source == "object" ? mtch.source.fieldName : mtch.source}=${(() => {
if (mtch.targetLiteral) { if (mtch.targetLiteral) {
return `'${mtch.targetLiteral}'`; return `'${mtch.targetLiteral}'`;

View File

@ -829,10 +829,14 @@ export type ServerQueryParam<T extends {
group?: (keyof T)[]; group?: (keyof T)[];
[key: string]: any; [key: string]: any;
}; };
export type ServerQueryValuesObject = {
value?: string | number;
equality?: (typeof ServerQueryEqualities)[number];
};
export type ServerQueryObject<T extends object = { export type ServerQueryObject<T extends object = {
[key: string]: any; [key: string]: any;
}, K extends string = string> = { }, K extends string = string> = {
value?: string | string[]; value?: string | (string | ServerQueryValuesObject)[];
nullValue?: boolean; nullValue?: boolean;
notNullValue?: boolean; notNullValue?: boolean;
operator?: (typeof ServerQueryOperators)[number]; operator?: (typeof ServerQueryOperators)[number];

View File

@ -4,7 +4,12 @@ import { ServerQueryEqualities } from "../../../types";
type Params = { type Params = {
fieldName: string; fieldName: string;
value?: string; value?: string;
equality: (typeof ServerQueryEqualities)[number]; equality?: (typeof ServerQueryEqualities)[number];
};
type Return = {
str?: string;
param?: string;
}; };
/** /**
@ -15,36 +20,67 @@ export default function sqlGenOperatorGen({
fieldName, fieldName,
value, value,
equality, equality,
}: Params): string { }: Params): Return {
if (value) { if (value) {
if (equality == "LIKE") { if (equality == "LIKE") {
return `LOWER(${fieldName}) LIKE LOWER('%${value}%')`; return {
str: `LOWER(${fieldName}) LIKE LOWER('%${value}%')`,
};
} else if (equality == "LIKE_RAW") { } else if (equality == "LIKE_RAW") {
return `LOWER(${fieldName}) LIKE LOWER('${value}')`; return {
str: `LOWER(${fieldName}) LIKE LOWER(?)`,
param: value,
};
} else if (equality == "NOT LIKE") { } else if (equality == "NOT LIKE") {
return `LOWER(${fieldName}) NOT LIKE LOWER('%${value}%')`; return {
str: `LOWER(${fieldName}) NOT LIKE LOWER('%${value}%')`,
};
} else if (equality == "NOT LIKE_RAW") { } else if (equality == "NOT LIKE_RAW") {
return `LOWER(${fieldName}) NOT LIKE LOWER('${value}')`; return {
str: `LOWER(${fieldName}) NOT LIKE LOWER(?)`,
param: value,
};
} else if (equality == "REGEXP") { } else if (equality == "REGEXP") {
return `LOWER(${fieldName}) REGEXP LOWER('${value}')`; return {
str: `LOWER(${fieldName}) REGEXP LOWER(?')`,
param: value,
};
} else if (equality == "FULLTEXT") { } else if (equality == "FULLTEXT") {
return `MATCH(${fieldName}) AGAINST('${value}' IN BOOLEAN MODE)`; return {
str: `MATCH(${fieldName}) AGAINST(? IN BOOLEAN MODE)`,
param: value,
};
} else if (equality == "NOT EQUAL") { } else if (equality == "NOT EQUAL") {
return `${fieldName} != ${value}`; return {
str: `${fieldName} != ?`,
param: value,
};
} else if (equality) { } else if (equality) {
return `${fieldName} ${sqlEqualityParser(equality)} ${value}`; return {
str: `${fieldName} ${sqlEqualityParser(equality)} ?`,
param: value,
};
} else { } else {
return `${fieldName} = ${value}`; return {
str: `${fieldName} = ?`,
param: value,
};
} }
} else { } else {
if (equality == "IS NULL") { if (equality == "IS NULL") {
return `${fieldName} IS NULL`; return { str: `${fieldName} IS NULL` };
} else if (equality == "IS NOT NULL") { } else if (equality == "IS NOT NULL") {
return `${fieldName} IS NOT NULL`; return { str: `${fieldName} IS NOT NULL` };
} else if (equality) { } else if (equality) {
return `${fieldName} ${sqlEqualityParser(equality)} ?`; return {
str: `${fieldName} ${sqlEqualityParser(equality)} ?`,
param: value,
};
} else { } else {
return `${fieldName} = ?`; return {
str: `${fieldName} = ?`,
param: value,
};
} }
} }
} }

View File

@ -1,9 +1,10 @@
import sqlEqualityParser from "../../../utils/sql-equality-parser";
import { import {
ServerQueryParam, ServerQueryParam,
ServerQueryParamsJoin, ServerQueryParamsJoin,
ServerQueryParamsJoinMatchObject,
ServerQueryQueryObject, ServerQueryQueryObject,
} from "../../../types"; } from "../../../types";
import sqlGenOperatorGen from "./sql-gen-operator-gen";
type Param<T extends { [key: string]: any } = { [key: string]: any }> = { type Param<T extends { [key: string]: any } = { [key: string]: any }> = {
genObject?: ServerQueryParam<T>; genObject?: ServerQueryParam<T>;
@ -56,60 +57,76 @@ export default function sqlGenerator<
let str = `${finalFieldName}=?`; let str = `${finalFieldName}=?`;
if (queryObj.nullValue) { if (Array.isArray(queryObj.value)) {
str = `${finalFieldName} IS NULL`;
} else if (queryObj.notNullValue) {
str = `${finalFieldName} IS NOT NULL`;
} else if (
typeof queryObj.value == "string" ||
typeof queryObj.value == "number"
) {
const valueParsed = String(queryObj.value);
const operator = sqlEqualityParser(queryObj.equality || "EQUAL");
if (queryObj.equality == "LIKE") {
str = `LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')`;
} else if (queryObj.equality == "LIKE_RAW") {
str = `LOWER(${finalFieldName}) LIKE LOWER(?)`;
sqlSearhValues.push(valueParsed);
} else if (queryObj.equality == "NOT LIKE") {
str = `LOWER(${finalFieldName}) NOT LIKE LOWER('%${valueParsed}%')`;
} else if (queryObj.equality == "NOT LIKE_RAW") {
str = `LOWER(${finalFieldName}) NOT LIKE LOWER(?)`;
sqlSearhValues.push(valueParsed);
} else if (queryObj.equality == "REGEXP") {
str = `LOWER(${finalFieldName}) REGEXP LOWER(?)`;
sqlSearhValues.push(valueParsed);
} else if (queryObj.equality == "FULLTEXT") {
str = `MATCH(${finalFieldName}) AGAINST(? IN BOOLEAN MODE)`;
sqlSearhValues.push(valueParsed);
} else if (queryObj.equality == "NOT EQUAL") {
str = `${finalFieldName} != ?`;
sqlSearhValues.push(valueParsed);
} else if (queryObj.equality) {
str = `${finalFieldName} ${operator} ?`;
sqlSearhValues.push(valueParsed);
} else {
sqlSearhValues.push(valueParsed);
}
} else if (Array.isArray(queryObj.value)) {
const strArray: string[] = []; const strArray: string[] = [];
queryObj.value.forEach((val) => { queryObj.value.forEach((val) => {
const valueParsed = val; const valueParsed = val;
if (queryObj.equality == "LIKE") { const valueString =
strArray.push( typeof valueParsed == "string"
`LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')` ? valueParsed
); : valueParsed.value?.toString();
} else if (queryObj.equality == "NOT EQUAL") {
strArray.push(`${finalFieldName} != ?`); const valueEquality =
sqlSearhValues.push(valueParsed); typeof valueParsed == "object"
} else { ? valueParsed.equality || queryObj.equality
strArray.push(`${finalFieldName} = ?`); : queryObj.equality;
sqlSearhValues.push(valueParsed);
const operatorStrParam = sqlGenOperatorGen({
equality: valueEquality,
fieldName: finalFieldName || "",
value: valueString?.toString() || "",
});
if (operatorStrParam.str && operatorStrParam.param) {
strArray.push(operatorStrParam.str);
sqlSearhValues.push(operatorStrParam.param);
} else if (operatorStrParam.str) {
strArray.push(operatorStrParam.str);
} }
}); });
str = "(" + strArray.join(` ${queryObj.operator || "AND"} `) + ")"; str = "(" + strArray.join(` ${queryObj.operator || "AND"} `) + ")";
} else {
const valueParsed = String(queryObj.value);
const operatorStrParam = sqlGenOperatorGen({
equality: queryObj.equality,
fieldName: finalFieldName || "",
value: valueParsed,
});
if (operatorStrParam.str && operatorStrParam.param) {
str = operatorStrParam.str;
sqlSearhValues.push(operatorStrParam.param);
} else if (operatorStrParam.str) {
str = operatorStrParam.str;
}
// if (queryObj.equality == "LIKE") {
// str = `LOWER(${finalFieldName}) LIKE LOWER('%${valueParsed}%')`;
// } else if (queryObj.equality == "LIKE_RAW") {
// str = `LOWER(${finalFieldName}) LIKE LOWER(?)`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality == "NOT LIKE") {
// str = `LOWER(${finalFieldName}) NOT LIKE LOWER('%${valueParsed}%')`;
// } else if (queryObj.equality == "NOT LIKE_RAW") {
// str = `LOWER(${finalFieldName}) NOT LIKE LOWER(?)`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality == "REGEXP") {
// str = `LOWER(${finalFieldName}) REGEXP LOWER(?)`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality == "FULLTEXT") {
// str = `MATCH(${finalFieldName}) AGAINST(? IN BOOLEAN MODE)`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality == "NOT EQUAL") {
// str = `${finalFieldName} != ?`;
// sqlSearhValues.push(valueParsed);
// } else if (queryObj.equality) {
// str = `${finalFieldName} ${operator} ?`;
// sqlSearhValues.push(valueParsed);
// } else {
// sqlSearhValues.push(valueParsed);
// }
} }
return str; return str;
@ -144,8 +161,8 @@ export default function sqlGenerator<
}); });
function generateJoinStr( function generateJoinStr(
/** @type {import("../../../types").ServerQueryParamsJoinMatchObject} */ mtch: import("../../../types").ServerQueryParamsJoinMatchObject, mtch: ServerQueryParamsJoinMatchObject,
/** @type {import("../../../types").ServerQueryParamsJoin} */ join: import("../../../types").ServerQueryParamsJoin join: ServerQueryParamsJoin
) { ) {
return `${finalDbName}${ return `${finalDbName}${
typeof mtch.source == "object" ? mtch.source.tableName : tableName typeof mtch.source == "object" ? mtch.source.tableName : tableName

View File

@ -1009,11 +1009,16 @@ export type ServerQueryParam<
[key: string]: any; [key: string]: any;
}; };
export type ServerQueryValuesObject = {
value?: string | number;
equality?: (typeof ServerQueryEqualities)[number];
};
export type ServerQueryObject< export type ServerQueryObject<
T extends object = { [key: string]: any }, T extends object = { [key: string]: any },
K extends string = string K extends string = string
> = { > = {
value?: string | string[]; value?: string | (string | ServerQueryValuesObject)[];
nullValue?: boolean; nullValue?: boolean;
notNullValue?: boolean; notNullValue?: boolean;
operator?: (typeof ServerQueryOperators)[number]; operator?: (typeof ServerQueryOperators)[number];

View File

@ -1,6 +1,6 @@
{ {
"name": "@moduletrace/datasquirel", "name": "@moduletrace/datasquirel",
"version": "5.2.1", "version": "5.2.2",
"description": "Cloud-based SQL data management tool", "description": "Cloud-based SQL data management tool",
"main": "dist/index.js", "main": "dist/index.js",
"bin": { "bin": {