Files
byre/internal/store/migrations/069-add-input-send-ids.sql
T

34 lines
1.7 KiB
SQL

ALTER TABLE task_inputs ADD COLUMN send_id TEXT NOT NULL DEFAULT '';
ALTER TABLE lead_inputs ADD COLUMN send_id TEXT NOT NULL DEFAULT '';
UPDATE task_inputs SET send_id = 'queued-' || id;
UPDATE events SET payload = json_set(payload, '$.send_id', 'queued-' || json_extract(payload, '$.id'))
WHERE kind = 'user.queued';
-- The n-th delivered queue entry of a task, sender and text pairs with the n-th later user.message of the same.
WITH q AS (
SELECT e.seq, e.task_id, e.actor, json_extract(e.payload, '$.text') AS text, json_extract(e.payload, '$.send_id') AS send_id,
row_number() OVER (PARTITION BY e.task_id, e.actor, json_extract(e.payload, '$.text') ORDER BY e.seq) AS n
FROM events AS e
WHERE e.kind = 'user.queued'
AND json_extract(e.payload, '$.id') NOT IN (SELECT id FROM task_inputs)
AND NOT EXISTS (
SELECT 1 FROM events AS u
WHERE u.kind = 'user.unqueued' AND u.task_id = e.task_id AND json_extract(u.payload, '$.id') = json_extract(e.payload, '$.id')
)
), first AS (
SELECT task_id, actor, text, min(seq) AS seq FROM q GROUP BY task_id, actor, text
), m AS (
SELECT e.seq, e.task_id, e.actor, json_extract(e.payload, '$.text') AS text,
row_number() OVER (PARTITION BY e.task_id, e.actor, json_extract(e.payload, '$.text') ORDER BY e.seq) AS n
FROM events AS e
JOIN first AS f ON f.task_id = e.task_id AND f.actor = e.actor AND f.text = json_extract(e.payload, '$.text') AND e.seq > f.seq
WHERE e.kind = 'user.message'
), pairs AS (
SELECT m.seq, q.send_id FROM m
JOIN q ON q.task_id = m.task_id AND q.actor = m.actor AND q.text = m.text AND q.n = m.n AND q.seq < m.seq
)
UPDATE events SET payload = json_set(payload, '$.send_id', (SELECT send_id FROM pairs WHERE pairs.seq = events.seq))
WHERE seq IN (SELECT seq FROM pairs);