34 lines
1.7 KiB
SQL
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);
|