|
|
|
@ -270,7 +270,7 @@ const parseConditionV2 = async (
|
|
|
|
|
); |
|
|
|
|
const _val = customWhereClause ? customWhereClause : filter.value; |
|
|
|
|
|
|
|
|
|
return (qb) => { |
|
|
|
|
return (qb: Knex.QueryBuilder) => { |
|
|
|
|
let [field, val] = [_field, _val]; |
|
|
|
|
switch (filter.comparison_op) { |
|
|
|
|
case 'eq': |
|
|
|
@ -306,6 +306,46 @@ const parseConditionV2 = async (
|
|
|
|
|
val |
|
|
|
|
); |
|
|
|
|
break; |
|
|
|
|
case 'allof': |
|
|
|
|
case 'anyof': |
|
|
|
|
case 'nallof': |
|
|
|
|
case 'nanyof': |
|
|
|
|
// Condition for filter, without negation
|
|
|
|
|
const condition = (builder: Knex.QueryBuilder) => { |
|
|
|
|
const items = val.split(',').map((item) => item.trim()); |
|
|
|
|
for (let i = 0; i < items.length; i++) { |
|
|
|
|
let sql; |
|
|
|
|
const bindings = [field, `%,${items[i]},%`]; |
|
|
|
|
if (qb?.client?.config?.client === 'pg') { |
|
|
|
|
sql = "(',' || ??::text || ',') ilike ?"; |
|
|
|
|
} else if (qb?.client?.config?.client === 'sqlite3') { |
|
|
|
|
sql = "(',' || ?? || ',') like ?"; |
|
|
|
|
} else { |
|
|
|
|
sql = "CONCAT(',', ??, ',') like ?"; |
|
|
|
|
} |
|
|
|
|
if (i === 0) { |
|
|
|
|
builder = builder.whereRaw(sql, bindings); |
|
|
|
|
} else { |
|
|
|
|
if ( |
|
|
|
|
filter.comparison_op === 'allof' || |
|
|
|
|
filter.comparison_op === 'nallof' |
|
|
|
|
) { |
|
|
|
|
builder = builder.andWhereRaw(sql, bindings); |
|
|
|
|
} else { |
|
|
|
|
builder = builder.orWhereRaw(sql, bindings); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
if ( |
|
|
|
|
filter.comparison_op === 'allof' || |
|
|
|
|
filter.comparison_op === 'anyof' |
|
|
|
|
) { |
|
|
|
|
qb = qb.where(condition); |
|
|
|
|
} else { |
|
|
|
|
qb = qb.whereNot(condition).orWhereNull(field); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 'gt': |
|
|
|
|
qb = qb.where(field, customWhereClause ? '<' : '>', val); |
|
|
|
|
break; |
|
|
|
|