Store datapoint values with the problems

This commit is contained in:
Magnus Åhall 2024-06-30 22:10:01 +02:00
parent 865f1ee184
commit aa368c0b0d
3 changed files with 26 additions and 22 deletions

View File

@ -10,18 +10,19 @@ import (
"time" "time"
) )
type Problem struct { type Problem struct {// {{{
ID int ID int
Start time.Time Start time.Time
End sql.NullTime End sql.NullTime
Acknowledged bool Acknowledged bool
Datapoints map[string]any
TriggerID int `json:"trigger_id"` TriggerID int `json:"trigger_id"`
TriggerName string `json:"trigger_name"` TriggerName string `json:"trigger_name"`
AreaName string `json:"area_name"` AreaName string `json:"area_name"`
SectionName string `json:"section_name"` SectionName string `json:"section_name"`
} }// }}}
func ProblemsRetrieve() (problems []Problem, err error) { func ProblemsRetrieve() (problems []Problem, err error) {// {{{
problems = []Problem{} problems = []Problem{}
row := service.Db.Conn.QueryRow(` row := service.Db.Conn.QueryRow(`
SELECT SELECT
@ -83,9 +84,8 @@ func ProblemsRetrieve() (problems []Problem, err error) {
err = we.Wrap(err) err = we.Wrap(err)
} }
return return
} }// }}}
func ProblemStart(trigger Trigger) (problemID int, err error) {// {{{
func ProblemStart(trigger Trigger) (problemID int, err error) {
row := service.Db.Conn.QueryRow(` row := service.Db.Conn.QueryRow(`
SELECT COUNT(id) SELECT COUNT(id)
FROM problem FROM problem
@ -105,16 +105,16 @@ func ProblemStart(trigger Trigger) (problemID int, err error) {
// Open up a new problem if no open exists. // Open up a new problem if no open exists.
if openProblems == 0 { if openProblems == 0 {
row = service.Db.Conn.QueryRow(`INSERT INTO problem(trigger_id) VALUES($1) RETURNING id`, trigger.ID) datapointValuesJson, _ := json.Marshal(trigger.DatapointValues)
row = service.Db.Conn.QueryRow(`INSERT INTO problem(trigger_id, datapoints) VALUES($1, $2) RETURNING id`, trigger.ID, datapointValuesJson)
err = row.Scan(&problemID) err = row.Scan(&problemID)
if err != nil { if err != nil {
err = we.Wrap(err).WithData(trigger) err = we.Wrap(err).WithData(trigger)
} }
} }
return return
} }// }}}
func ProblemClose(trigger Trigger) (problemID int, err error) {// {{{
func ProblemClose(trigger Trigger) (problemID int, err error) {
row := service.Db.Conn.QueryRow(`UPDATE problem SET "end"=NOW() WHERE trigger_id=$1 AND "end" IS NULL RETURNING id`, trigger.ID) row := service.Db.Conn.QueryRow(`UPDATE problem SET "end"=NOW() WHERE trigger_id=$1 AND "end" IS NULL RETURNING id`, trigger.ID)
err = row.Scan(&problemID) err = row.Scan(&problemID)
@ -128,13 +128,12 @@ func ProblemClose(trigger Trigger) (problemID int, err error) {
return return
} }
return return
} }// }}}
func ProblemAcknowledge(id int, state bool) (err error) {// {{{
func ProblemAcknowledge(id int, state bool) (err error) {
_, err = service.Db.Conn.Exec(`UPDATE problem SET "acknowledged"=$2 WHERE id=$1`, id, state) _, err = service.Db.Conn.Exec(`UPDATE problem SET "acknowledged"=$2 WHERE id=$1`, id, state)
if err != nil { if err != nil {
err = we.Wrap(err).WithData(id) err = we.Wrap(err).WithData(id)
return return
} }
return return
} }// }}}

4
sql/00022.sql Normal file
View File

@ -0,0 +1,4 @@
ALTER TABLE public.problem ALTER COLUMN trigger_id DROP NOT NULL;
ALTER TABLE public.problem ADD COLUMN datapoints JSONB NOT NULL DEFAULT '{}';
ALTER TABLE public.problem DROP CONSTRAINT problem_trigger_fk;
ALTER TABLE public.problem ADD CONSTRAINT problem_trigger_fk FOREIGN KEY (trigger_id) REFERENCES public."trigger"(id) ON DELETE SET NULL ON UPDATE CASCADE;

View File

@ -19,6 +19,7 @@ type Trigger struct {
SectionID int `db:"section_id"` SectionID int `db:"section_id"`
Expression string Expression string
Datapoints []string Datapoints []string
DatapointValues map[string]any
} }
func TriggerCreate(sectionID int, name string) (t Trigger, err error) { // {{{ func TriggerCreate(sectionID int, name string) (t Trigger, err error) { // {{{
@ -231,9 +232,9 @@ func (t *Trigger) Run() (output any, err error) { // {{{
datapoints[dpname] = dp datapoints[dpname] = dp
} }
env := make(map[string]any) t.DatapointValues = make(map[string]any)
for dpName, dp := range datapoints { for dpName, dp := range datapoints {
env[dpName] = dp.LastDatapointValue.Value() t.DatapointValues[dpName] = dp.LastDatapointValue.Value()
} }
program, err := expr.Compile(t.Expression) program, err := expr.Compile(t.Expression)
@ -241,7 +242,7 @@ func (t *Trigger) Run() (output any, err error) { // {{{
return return
} }
output, err = expr.Run(program, env) output, err = expr.Run(program, t.DatapointValues)
if err != nil { if err != nil {
return return
} }