Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
107 lines
3.6 KiB
Plaintext
107 lines
3.6 KiB
Plaintext
import { escapeSQLValue } from '../../utilities/escapeSQLValue.js';
|
|
const fromArray = ({ isRoot, operator, pathSegments, table, treatAsArray, value })=>{
|
|
const newPathSegments = pathSegments.slice(1);
|
|
const alias = `${pathSegments[isRoot ? 0 : 1]}_alias_${newPathSegments.length}`;
|
|
return `EXISTS (
|
|
SELECT 1
|
|
FROM json_each(${table}.${pathSegments[0]}) AS ${alias}
|
|
WHERE ${createJSONQuery({
|
|
operator,
|
|
pathSegments: newPathSegments,
|
|
table: alias,
|
|
treatAsArray,
|
|
value
|
|
})}
|
|
)`;
|
|
};
|
|
const createConstraint = ({ alias, operator, pathSegments, value })=>{
|
|
const newAlias = `${pathSegments[0]}_alias_${pathSegments.length - 1}`;
|
|
if (operator === 'exists' && value === false) {
|
|
operator = 'not_exists';
|
|
value = true;
|
|
} else if (operator === 'not_exists' && value === false) {
|
|
operator = 'exists';
|
|
value = true;
|
|
}
|
|
if (operator === 'exists') {
|
|
if (pathSegments.length === 1) {
|
|
return `EXISTS (SELECT 1 FROM json_each("${pathSegments[0]}") AS ${newAlias})`;
|
|
}
|
|
return `EXISTS (
|
|
SELECT 1
|
|
FROM json_each(${alias}.value -> '${pathSegments[0]}') AS ${newAlias}
|
|
WHERE ${newAlias}.key = '${pathSegments[1]}'
|
|
)`;
|
|
}
|
|
if (operator === 'not_exists') {
|
|
if (pathSegments.length === 1) {
|
|
return `NOT EXISTS (SELECT 1 FROM json_each("${pathSegments[0]}") AS ${newAlias})`;
|
|
}
|
|
return `NOT EXISTS (
|
|
SELECT 1
|
|
FROM json_each(${alias}.value -> '${pathSegments[0]}') AS ${newAlias}
|
|
WHERE ${newAlias}.key = '${pathSegments[1]}'
|
|
)`;
|
|
}
|
|
let formattedValue = escapeSQLValue(value);
|
|
let formattedOperator = operator;
|
|
if ([
|
|
'contains',
|
|
'like'
|
|
].includes(operator)) {
|
|
formattedOperator = 'like';
|
|
formattedValue = `%${value}%`;
|
|
} else if ([
|
|
'not_like',
|
|
'notlike'
|
|
].includes(operator)) {
|
|
formattedOperator = 'not like';
|
|
formattedValue = `%${value}%`;
|
|
} else if (operator === 'equals') {
|
|
formattedOperator = '=';
|
|
}
|
|
if (pathSegments.length === 1) {
|
|
return `EXISTS (SELECT 1 FROM json_each("${pathSegments[0]}") AS ${newAlias} WHERE ${newAlias}.value ${formattedOperator} '${formattedValue}')`;
|
|
}
|
|
return `EXISTS (
|
|
SELECT 1
|
|
FROM json_each(${alias}.value -> '${pathSegments[0]}') AS ${newAlias}
|
|
WHERE COALESCE(${newAlias}.value ->> '${pathSegments[1]}', '') ${formattedOperator} '${formattedValue}'
|
|
)`;
|
|
};
|
|
export const createJSONQuery = ({ column, operator, pathSegments, rawColumn, table, treatAsArray, treatRootAsArray, value })=>{
|
|
if ((operator === 'in' || operator === 'not_in') && Array.isArray(value)) {
|
|
let sql = '';
|
|
for (const [i, v] of value.entries()){
|
|
sql = `${sql}${createJSONQuery({
|
|
column,
|
|
operator: operator === 'in' ? 'equals' : 'not_equals',
|
|
pathSegments,
|
|
rawColumn,
|
|
table,
|
|
treatAsArray,
|
|
treatRootAsArray,
|
|
value: v
|
|
})} ${i === value.length - 1 ? '' : ` ${operator === 'in' ? 'OR' : 'AND'} `}`;
|
|
}
|
|
return sql;
|
|
}
|
|
if (treatAsArray?.includes(pathSegments[1]) && table) {
|
|
return fromArray({
|
|
operator,
|
|
pathSegments,
|
|
table,
|
|
treatAsArray,
|
|
value: value
|
|
});
|
|
}
|
|
return createConstraint({
|
|
alias: table,
|
|
operator,
|
|
pathSegments,
|
|
treatAsArray,
|
|
value: value
|
|
});
|
|
};
|
|
|
|
//# sourceMappingURL=index.js.map |