@grandlinex/bundle-sqlight
Version:
> SQLight support GrandlineX using better-sqlite3
63 lines (62 loc) • 2.08 kB
JavaScript
import { isQInterfaceSearchAdvanced, isQInterfaceSearchAdvancedArr, } from '@grandlinex/core';
import { convertSpecialFields } from './converter.js';
function aFilter(key, s) {
switch (s.mode) {
case 'equals':
if (s.value === null) {
return `${key} IS ?`;
}
return `${key} = ?`;
case 'not':
if (s.value === null) {
return `${key} IS NOT ?`;
}
return `${key} != ?`;
case 'like':
return `lower(${key}) like '%' || lower(?) || '%'`;
case 'smallerThan':
return `${key} < ?`;
case 'greaterThan':
return `${key} > ?`;
default:
throw new Error(`Unknown mode: ${s.mode}`);
}
}
export default function buildSearchQ(config, search, param, searchQ) {
let temp = searchQ;
const keys = Object.keys(search);
if (keys.length > 0) {
const filter = [];
for (const key of keys) {
const s = search[key];
const meta = config.meta.get(key);
if (!meta) {
throw new Error('Missing meta');
}
if (isQInterfaceSearchAdvanced(s)) {
filter.push(aFilter(String(key), s));
convertSpecialFields(meta, s.value, param);
}
else if (isQInterfaceSearchAdvancedArr(s)) {
filter.push(...s.map((e) => {
const ax = aFilter(String(key), e);
convertSpecialFields(meta, e.value, param);
return ax;
}));
}
else {
if (search[key] === null) {
filter.push(`${String(key)} is ?`);
}
else {
filter.push(`${String(key)} = ?`);
}
convertSpecialFields(meta, search[key], param);
}
}
if (filter.length > 0) {
temp = ` WHERE ${filter.join(' AND ')}`;
}
}
return temp;
}