mirror of
https://github.com/xbgmsharp/postgsail.git
synced 2025-09-17 11:17:46 +00:00
Update api.metrics status to enum type and allow vessel to switch from sailing to motoring
This commit is contained in:
@@ -109,6 +109,9 @@ CREATE INDEX metadata_name_idx ON api.metadata (name);
|
|||||||
|
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
-- Metrics from signalk
|
-- Metrics from signalk
|
||||||
|
-- Create vessel status enum
|
||||||
|
CREATE TYPE status AS ENUM ('sailing', 'motoring', 'moored', 'anchored');
|
||||||
|
-- Table api.metrics
|
||||||
CREATE TABLE IF NOT EXISTS api.metrics (
|
CREATE TABLE IF NOT EXISTS api.metrics (
|
||||||
time TIMESTAMP WITHOUT TIME ZONE NOT NULL,
|
time TIMESTAMP WITHOUT TIME ZONE NOT NULL,
|
||||||
client_id VARCHAR(255) NOT NULL REFERENCES api.metadata(client_id) ON DELETE RESTRICT,
|
client_id VARCHAR(255) NOT NULL REFERENCES api.metadata(client_id) ON DELETE RESTRICT,
|
||||||
@@ -118,7 +121,7 @@ CREATE TABLE IF NOT EXISTS api.metrics (
|
|||||||
courseOverGroundTrue DOUBLE PRECISION NULL,
|
courseOverGroundTrue DOUBLE PRECISION NULL,
|
||||||
windSpeedApparent DOUBLE PRECISION NULL,
|
windSpeedApparent DOUBLE PRECISION NULL,
|
||||||
angleSpeedApparent DOUBLE PRECISION NULL,
|
angleSpeedApparent DOUBLE PRECISION NULL,
|
||||||
status VARCHAR(100) NULL,
|
status status NULL,
|
||||||
metrics jsonb NULL,
|
metrics jsonb NULL,
|
||||||
CONSTRAINT valid_client_id CHECK (length(client_id) > 10),
|
CONSTRAINT valid_client_id CHECK (length(client_id) > 10),
|
||||||
CONSTRAINT valid_latitude CHECK (latitude >= -90 and latitude <= 90),
|
CONSTRAINT valid_latitude CHECK (latitude >= -90 and latitude <= 90),
|
||||||
@@ -388,6 +391,7 @@ CREATE FUNCTION metrics_trigger_fn() RETURNS trigger AS $metrics$
|
|||||||
stay_code integer;
|
stay_code integer;
|
||||||
logbook_id integer;
|
logbook_id integer;
|
||||||
stay_id integer;
|
stay_id integer;
|
||||||
|
valid_status BOOLEAN;
|
||||||
BEGIN
|
BEGIN
|
||||||
-- Set client_id to new value to allow RLS
|
-- Set client_id to new value to allow RLS
|
||||||
PERFORM set_config('vessel.client_id', NEW.client_id, false);
|
PERFORM set_config('vessel.client_id', NEW.client_id, false);
|
||||||
@@ -405,18 +409,25 @@ CREATE FUNCTION metrics_trigger_fn() RETURNS trigger AS $metrics$
|
|||||||
RAISE WARNING 'Metrics Ignoring metric, duplicate time [%] = [%]', previous_time, NEW.time;
|
RAISE WARNING 'Metrics Ignoring metric, duplicate time [%] = [%]', previous_time, NEW.time;
|
||||||
RETURN NULL;
|
RETURN NULL;
|
||||||
END IF;
|
END IF;
|
||||||
|
-- Check if latitude or longitude are null
|
||||||
IF NEW.latitude IS NULL OR NEW.longitude IS NULL THEN
|
IF NEW.latitude IS NULL OR NEW.longitude IS NULL THEN
|
||||||
-- Ignore entry if null latitude,longitude
|
-- Ignore entry if null latitude,longitude
|
||||||
RAISE WARNING 'Metrics Ignoring metric, null latitude,longitude [%] [%]', NEW.latitude, NEW.longitude;
|
RAISE WARNING 'Metrics Ignoring metric, null latitude,longitude [%] [%]', NEW.latitude, NEW.longitude;
|
||||||
RETURN NULL;
|
RETURN NULL;
|
||||||
END IF;
|
END IF;
|
||||||
|
-- Check if status is null
|
||||||
IF NEW.status IS NULL THEN
|
IF NEW.status IS NULL THEN
|
||||||
RAISE WARNING 'Metrics Unknow NEW.status from vessel [%], set to default moored', NEW.status;
|
RAISE WARNING 'Metrics Unknow NEW.status from vessel [%], set to default moored', NEW.status;
|
||||||
NEW.status := 'moored';
|
NEW.status := 'moored';
|
||||||
END IF;
|
END IF;
|
||||||
IF previous_status IS NULL THEN
|
IF previous_status IS NULL THEN
|
||||||
RAISE WARNING 'Metrics Unknow previous_status from vessel [%], set to default moored', previous_status;
|
IF NEW.status = 'anchored' THEN
|
||||||
previous_status := 'moored';
|
RAISE WARNING 'Metrics Unknow previous_status from vessel [%], set to default current status [%]', previous_status, NEW.status;
|
||||||
|
previous_status := NEW.status;
|
||||||
|
ELSE
|
||||||
|
RAISE WARNING 'Metrics Unknow previous_status from vessel [%], set to default status moored vs [%]', previous_status, NEW.status;
|
||||||
|
previous_status := 'moored';
|
||||||
|
END IF;
|
||||||
-- Add new stay as no previous entry exist
|
-- Add new stay as no previous entry exist
|
||||||
INSERT INTO api.stays
|
INSERT INTO api.stays
|
||||||
(client_id, active, arrived, latitude, longitude, stay_code)
|
(client_id, active, arrived, latitude, longitude, stay_code)
|
||||||
@@ -426,10 +437,19 @@ CREATE FUNCTION metrics_trigger_fn() RETURNS trigger AS $metrics$
|
|||||||
INSERT INTO process_queue (channel, payload, stored) values ('new_stay', stay_id, now());
|
INSERT INTO process_queue (channel, payload, stored) values ('new_stay', stay_id, now());
|
||||||
RAISE WARNING 'Metrics Insert first stay as no previous metrics exist, stay_id %', stay_id;
|
RAISE WARNING 'Metrics Insert first stay as no previous metrics exist, stay_id %', stay_id;
|
||||||
END IF;
|
END IF;
|
||||||
|
-- Check if status is valid enum
|
||||||
|
SELECT NEW.status::name = any(enum_range(null::status)::name[]) INTO valid_status;
|
||||||
|
IF valid_status IS False THEN
|
||||||
|
-- Ignore entry if status is invalid
|
||||||
|
RAISE WARNING 'Metrics Ignoring metric, invalid status [%]', NEW.status;
|
||||||
|
RETURN NULL;
|
||||||
|
END IF;
|
||||||
|
|
||||||
-- Check the state and if any previous/current entry
|
-- Check the state and if any previous/current entry
|
||||||
-- If new status is sailing or motoring
|
-- If new status is sailing or motoring
|
||||||
IF previous_status <> NEW.status AND (NEW.status = 'sailing' OR NEW.status = 'motoring') THEN
|
IF previous_status::TEXT <> NEW.status::TEXT AND
|
||||||
|
( (NEW.status::TEXT = 'sailing' AND previous_status::TEXT <> 'motoring')
|
||||||
|
OR (NEW.status::TEXT = 'motoring' AND previous_status::TEXT <> 'sailing') ) THEN
|
||||||
RAISE WARNING 'Metrics Update status, try new logbook, New:[%] Previous:[%]', NEW.status, previous_status;
|
RAISE WARNING 'Metrics Update status, try new logbook, New:[%] Previous:[%]', NEW.status, previous_status;
|
||||||
-- Start new log
|
-- Start new log
|
||||||
logbook_id := public.trip_in_progress_fn(NEW.client_id::TEXT);
|
logbook_id := public.trip_in_progress_fn(NEW.client_id::TEXT);
|
||||||
@@ -466,9 +486,11 @@ CREATE FUNCTION metrics_trigger_fn() RETURNS trigger AS $metrics$
|
|||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- If new status is moored or anchored
|
-- If new status is moored or anchored
|
||||||
ELSIF previous_status <> NEW.status AND (NEW.status = 'moored' OR NEW.status = 'anchored') THEN
|
ELSIF previous_status::TEXT <> NEW.status::TEXT AND
|
||||||
|
( (NEW.status::TEXT = 'moored' AND previous_status::TEXT <> 'anchored')
|
||||||
|
OR (NEW.status::TEXT = 'anchored' AND previous_status::TEXT <> 'moored') ) THEN
|
||||||
-- Start new stays
|
-- Start new stays
|
||||||
RAISE WARNING 'Metrics Update status, try new stay, New:[%] Previous:[%]', NEW.status, previous_status;
|
RAISE WARNING 'Metrics Update status, try new stay, New:[%] Previous:[%]', NEW.status, previous_status;
|
||||||
stay_id := public.stay_in_progress_fn(NEW.client_id::TEXT);
|
stay_id := public.stay_in_progress_fn(NEW.client_id::TEXT);
|
||||||
IF stay_id IS NULL THEN
|
IF stay_id IS NULL THEN
|
||||||
RAISE WARNING 'Metrics Inserting new stay [%]', NEW.status;
|
RAISE WARNING 'Metrics Inserting new stay [%]', NEW.status;
|
||||||
|
Reference in New Issue
Block a user