From f8a64e4dfddefb3e51b1ea94ef844cd97e363b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20=C3=85hall?= Date: Wed, 24 Jul 2024 10:27:21 +0200 Subject: [PATCH 1/3] Added last values for table datapoint, update to current latest values and trigger for future values --- sql/00026.sql | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 sql/00026.sql diff --git a/sql/00026.sql b/sql/00026.sql new file mode 100644 index 0000000..719dccd --- /dev/null +++ b/sql/00026.sql @@ -0,0 +1,56 @@ +/* Adding last values to the datapoint table since they are a regularly used value. */ +ALTER TABLE public.datapoint ADD COLUMN last_value_int int8 NULL; +ALTER TABLE public.datapoint ADD COLUMN last_value_string varchar NULL; +ALTER TABLE public.datapoint ADD COLUMN last_value_datetime timestamptz NULL; + + + +/* Once-run query to update it to the latest, to avoid user having to wait for the next entry. */ +UPDATE public.datapoint AS dp +SET + last_value_int = dpv.value_int, + last_value_string = dpv.value_string, + last_value_datetime = dpv.value_datetime +FROM ( + SELECT + dp.id AS datapoint_id, + dpv.value_int, + dpv.value_string, + dpv.value_datetime + FROM public.datapoint dp + LEFT JOIN ( + SELECT + *, + row_number() OVER (PARTITION BY "datapoint_id" ORDER BY ts DESC) AS rn + FROM datapoint_value + ) dpv ON dpv.datapoint_id = dp.id AND rn = 1 +) AS dpv +WHERE + dpv.datapoint_id = dp.id; + + + +/* A trigger keeps the value current without bugs introduced in software missing the entry. */ +CREATE OR REPLACE FUNCTION datapoint_entry() + RETURNS TRIGGER + LANGUAGE PLPGSQL + AS +$$ +BEGIN + UPDATE public.datapoint + SET + last_value_int = NEW.value_int, + last_value_string = NEW.value_string, + last_value_datetime = NEW.value_datetime + WHERE + id = NEW.datapoint_id; + + RETURN NEW; +END; +$$; + +CREATE TRIGGER datapoint_entry + AFTER INSERT + ON public.datapoint_value + FOR EACH ROW + EXECUTE PROCEDURE datapoint_entry(); From 570ea064aa48c1a9f72aa98e021ecc80e71b24dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20=C3=85hall?= Date: Wed, 24 Jul 2024 15:39:04 +0200 Subject: [PATCH 2/3] Faster datapoint latest value display --- datapoint.go | 37 ++++++++++++------------------------- sql/00026.sql | 6 ++++++ 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/datapoint.go b/datapoint.go index 2d2286e..e5687c2 100644 --- a/datapoint.go +++ b/datapoint.go @@ -162,8 +162,6 @@ func DatapointAdd[T any](name string, value T) (err error) { // {{{ return } - service.Db.Conn.Exec(`UPDATE datapoint SET last_value = NOW(), nodata_is_problem = false WHERE id=$1`, dpID) - return } // }}} @@ -172,30 +170,19 @@ func DatapointsRetrieve() (dps []Datapoint, err error) { // {{{ var rows *sqlx.Rows rows, err = service.Db.Conn.Queryx(` SELECT - dp.id, - dp.name, - dp.datatype, - dp.last_value, - dp.group, - dp.comment, - dp.nodata_problem_seconds, - - dpv.id AS v_id, - dpv.ts, - dpv.value_int, - dpv.value_string, - dpv.value_datetime - - FROM public.datapoint dp - LEFT JOIN ( - SELECT - *, - row_number() OVER (PARTITION BY "datapoint_id" ORDER BY ts DESC) AS rn - FROM datapoint_value - ) dpv ON dpv.datapoint_id = dp.id AND rn = 1 + id, name, datatype, last_value, "group", comment, nodata_problem_seconds, + last_value_id AS v_id, + CASE + WHEN last_value_id IS NULL THEN null + ELSE last_value + END AS ts, + last_value_int AS value_int, + last_value_string AS value_string, + last_value_datetime AS value_datetime + FROM datapoint ORDER BY - dp.group ASC, - dp.name ASC + "group" ASC, + name ASC `) if err != nil { err = werr.Wrap(err) diff --git a/sql/00026.sql b/sql/00026.sql index 719dccd..364ccaa 100644 --- a/sql/00026.sql +++ b/sql/00026.sql @@ -1,4 +1,5 @@ /* Adding last values to the datapoint table since they are a regularly used value. */ +ALTER TABLE public.datapoint ADD COLUMN last_value_id int4 NULL; ALTER TABLE public.datapoint ADD COLUMN last_value_int int8 NULL; ALTER TABLE public.datapoint ADD COLUMN last_value_string varchar NULL; ALTER TABLE public.datapoint ADD COLUMN last_value_datetime timestamptz NULL; @@ -8,12 +9,14 @@ ALTER TABLE public.datapoint ADD COLUMN last_value_datetime timestamptz NULL; /* Once-run query to update it to the latest, to avoid user having to wait for the next entry. */ UPDATE public.datapoint AS dp SET + last_value_id = dpv.id, last_value_int = dpv.value_int, last_value_string = dpv.value_string, last_value_datetime = dpv.value_datetime FROM ( SELECT dp.id AS datapoint_id, + dpv.id, dpv.value_int, dpv.value_string, dpv.value_datetime @@ -39,6 +42,9 @@ $$ BEGIN UPDATE public.datapoint SET + nodata_is_problem = false, + last_value = NEW.ts, + last_value_id = NEW.id, last_value_int = NEW.value_int, last_value_string = NEW.value_string, last_value_datetime = NEW.value_datetime From 6909b223a781dfce246f9c1309c01a18640856a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20=C3=85hall?= Date: Wed, 24 Jul 2024 15:39:33 +0200 Subject: [PATCH 3/3] Bumped to v38 --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 76e4166..6eb559a 100644 --- a/main.go +++ b/main.go @@ -29,7 +29,7 @@ import ( "time" ) -const VERSION = "v37" +const VERSION = "v38" var ( logger *slog.Logger