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] 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