From 0e6f08b68be43441bb8249fed35d3b1e5d33014f Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Sun, 14 Jan 2018 19:49:13 -0800 Subject: [PATCH] Implement function to stringify query --- server/filter-parser.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/server/filter-parser.js b/server/filter-parser.js index 2b38e19..13a77a5 100644 --- a/server/filter-parser.js +++ b/server/filter-parser.js @@ -174,4 +174,34 @@ function parse(filter) { return lang.Expression.tryParse(filter); } +function stringify(filter) { + function value(v) { + if (Array.isArray(v) && v[0].toUpperCase() === "FUNC") + return `${v[1]}(${v + .slice(2) + .map(e => value(e)) + .join(", ")})`; + return JSON.stringify(v); + } + + function expressions(v) { + return v.map(e => { + let str = stringify(e); + if (e[0] === "AND" || e[0] === "OR") return `(${str})`; + else return str; + }); + } + + const op = filter[0].toUpperCase(); + + if (["AND", "OR"].includes(op)) + return expressions(filter.slice(1)).join(` ${op} `); + else if (op === "NOT") return `NOT ${expressions(filter.slice(1))[0]}`; + else if ([">=", "<>", "<=", "=", ">", "<"].includes(op)) + return `${filter[1]} ${op} ${value(filter[2])}`; + else if (["IS NULL", "IS NOT NULL"].includes(op)) return `${filter[1]} ${op}`; + else throw new Error("Unrecognized operator"); +} + exports.parse = parse; +exports.stringify = stringify;