From 38e4e705a4e10be1c12037d9dd9480eb5e3761cc Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Wed, 16 Mar 2022 21:08:42 +0100 Subject: [PATCH] Modify database upgrade file 12. Two function that were dependent on the `events` view were changed to work with `event_log` instead. --- .../upgrade12-v0.2.2-new-event-log-schema.sql | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/etc/db/upgrades/upgrade12-v0.2.2-new-event-log-schema.sql b/etc/db/upgrades/upgrade12-v0.2.2-new-event-log-schema.sql index 81271b7..1f98314 100644 --- a/etc/db/upgrades/upgrade12-v0.2.2-new-event-log-schema.sql +++ b/etc/db/upgrades/upgrade12-v0.2.2-new-event-log-schema.sql @@ -251,6 +251,75 @@ BEGIN UPDATE event_log_full SET meta = meta - 'geometry' WHERE meta->>'geometry' IS NULL; UPDATE event_log_full SET meta = meta - 'readonly' WHERE (meta->'readonly')::boolean IS false; + + -- This function used the superseded `events` view. + -- We need to drop it because we're changing the return type. + DROP FUNCTION IF EXISTS label_in_sequence (_sequence integer, _label text); + + CREATE OR REPLACE FUNCTION label_in_sequence (_sequence integer, _label text) + RETURNS event_log + LANGUAGE sql + AS $inner$ + SELECT * FROM event_log WHERE sequence = _sequence AND _label = ANY(labels); + $inner$; + + -- This function used the superseded `events` view (and a strange logic). + CREATE OR REPLACE PROCEDURE handle_final_line_events (_seq integer, _label text, _column text) + LANGUAGE plpgsql + AS $inner$ + + DECLARE + _line final_lines_summary%ROWTYPE; + _column_value integer; + _tg_name text := 'final_line'; + _event event_log%ROWTYPE; + event_id integer; + BEGIN + + SELECT * INTO _line FROM final_lines_summary WHERE sequence = _seq; + _event := label_in_sequence(_seq, _label); + _column_value := row_to_json(_line)->>_column; + + --RAISE NOTICE '% is %', _label, _event; + --RAISE NOTICE 'Line is %', _line; + --RAISE NOTICE '% is % (%)', _column, _column_value, _label; + + IF _event IS NULL THEN + --RAISE NOTICE 'We will populate the event log from the sequence data'; + + INSERT INTO event_log (sequence, point, remarks, labels, meta) + VALUES ( + -- The sequence + _seq, + -- The shotpoint + _column_value, + -- Remark. Something like "FSP " + format('%s %s', _label, (SELECT meta->>'lineName' FROM final_lines WHERE sequence = _seq)), + -- Label + ARRAY[_label], + -- Meta. Something like {"auto" : {"FSP" : "final_line"}} + json_build_object('auto', json_build_object(_label, _tg_name)) + ); + + ELSE + --RAISE NOTICE 'We may populate the sequence meta from the event log'; + --RAISE NOTICE 'Unless the event log was populated by us previously'; + --RAISE NOTICE 'Populated by us previously? %', _event.meta->'auto'->>_label = _tg_name; + + IF _event.meta->'auto'->>_label IS DISTINCT FROM _tg_name THEN + + --RAISE NOTICE 'Adding % found in events log to final_line meta', _label; + UPDATE final_lines + SET meta = jsonb_set(meta, ARRAY[_label], to_jsonb(_event.point)) + WHERE sequence = _seq; + + END IF; + + END IF; + END; + $inner$; + + END; $$ LANGUAGE plpgsql;