UNPKG

@grandlinex/bundle-sqlight

Version:

> SQLight support GrandlineX using better-sqlite3

63 lines (62 loc) 2.08 kB
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; }