Files
klz-cables.com/.pnpm-store/v10/files/5d/88680c64b5acea93b094b2870c57a9ff5929e5f065ca5fcf7c0876bf5719c823b9cfff9fd0d1d04571f5bfed07827312cc275e66e522bc441d8727fad0eec1
Marc Mintel 5397309103
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
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

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