@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
28 lines (26 loc) • 1.01 kB
JavaScript
import { applyFilter } from "../lib/apply-query/filter/index.js";
//#region src/database/run-ast/utils/apply-case-when.ts
function applyCaseWhen({ columnCases, table, aliasMap, cases, column, alias, permissions }, { knex, schema }) {
const caseQuery = knex.queryBuilder();
applyFilter(knex, schema, caseQuery, { _or: columnCases }, table, aliasMap, cases, permissions);
const compiler = knex.client.queryCompiler(caseQuery);
const sqlParts = [];
if (!compiler.grouped.where) return column;
for (const statement of compiler.grouped.where) {
const val = compiler[statement.type](statement);
if (val) {
if (sqlParts.length > 0) sqlParts.push(statement.bool);
sqlParts.push(val);
}
}
const sql = sqlParts.length > 0 ? sqlParts.join(" ") : "1";
const bindings = [...caseQuery.toSQL().bindings, column];
let rawCase = `(CASE WHEN ${sql} THEN ?? END)`;
if (alias) {
rawCase += " AS ??";
bindings.push(alias);
}
return knex.raw(rawCase, bindings);
}
//#endregion
export { applyCaseWhen };