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