From 8755fe01b69871d5ffde66363927dc0d933ec017 Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Sat, 30 Sep 2023 01:37:22 +0200 Subject: [PATCH] Refactor events.list. The SQL has been simplified and the following changes made: - The `sequence` argument now can only take one individual sequence, not a list of sequences. - A new `sequences` argument is recognised. It takes a list of sequences (as a string). - A new `label` argument is recognised. It takes a label name and returns events containing that label. - A new `jpq` argument is recognised. It takes a JSONPath string which is applied to `meta` with jsonb_path_exists(), returning any events for which the JSON path expression matches. --- lib/www/server/lib/db/event/list.js | 31 ++++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/lib/www/server/lib/db/event/list.js b/lib/www/server/lib/db/event/list.js index 4881ed3..4c03039 100644 --- a/lib/www/server/lib/db/event/list.js +++ b/lib/www/server/lib/db/event/list.js @@ -10,25 +10,32 @@ async function list (projectId, opts = {}) { const offset = Math.abs((opts.page-1)*opts.itemsPerPage) || 0; const limit = Math.abs(Number(opts.itemsPerPage)) || null; - const filter = opts.sequence - ? String(opts.sequence).includes(";") - ? [ "sequence = ANY ( $1 )", [ opts.sequence.split(";") ] ] - : [ "sequence = $1", [ opts.sequence ] ] - : opts.date0 - ? opts.date1 - ? [ "date(tstamp) BETWEEN SYMMETRIC $1 AND $2", [ opts.date0, opts.date1 ] ] - : [ "date(tstamp) = $1", [ opts.date0 ] ] - : [ "true = true", [] ]; + const sequence = opts.sequence && Number(opts.sequence) || null; + const sequences = opts.sequences && opts.sequences.split(/[^0-9]+/).map(v => Number(v)) || null; + const date0 = opts.date0 ?? null; + const date1 = opts.date1 ?? null; + const jpq = opts.jpq || null; + const label = opts.label ?? null; const text = ` SELECT * FROM event_log e WHERE - ${filter[0]} - ORDER BY ${sortKey} ${sortDir}; + ($1::numeric IS NULL OR sequence = $1) AND + ($2::numeric[] IS NULL OR sequence = ANY( $2 )) AND + ($3::timestamptz IS NULL OR date(tstamp) = $3) AND + ($3::timestamptz IS NULL OR + (($4::timestamptz IS NULL AND date(tstamp) = $3) OR + date(tstamp) BETWEEN SYMMETRIC $3 AND $4)) AND + ($5::jsonpath IS NULL OR jsonb_path_exists(meta::jsonb, $5::jsonpath)) AND + ($6::text IS NULL OR $6 = ANY(labels)) + ORDER BY ${sortKey} ${sortDir} + LIMIT ${limit}; `; - const res = await client.query(text, filter[1]); + const values = [ sequence, sequences, date0, date1, jpq, label ]; + + const res = await client.query(text, values); client.release(); return res.rows.map(i => replaceMarkers(i)); }