Commit 62a51639 authored by Ignacio's avatar Ignacio
Browse files

Añade evento para añadir trigger de geom

Se crea un evento cuando se crea una tabla,
este evento añade los triggers a la tabla
creadas, para generar la geometría
parent ffe0888f
Loading
Loading
Loading
Loading
+73 −39
Original line number Diff line number Diff line
@@ -19,8 +19,7 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E

	-- Importante callSign y navStat en camelcase para coincidir con el esquema

	CREATE TABLE ais.location
	(
	CREATE TABLE ais.location (
		uuid uuid NOT NULL DEFAULT uuid_generate_v4(),
		mmsi integer NOT NULL,
		shape geometry(Point,4326),
@@ -28,6 +27,7 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E
		latitude double precision NOT NULL,
		tstamp timestamp without time zone NOT NULL,
		inserted timestamp with time zone NOT NULL DEFAULT now(),
		updated timestamp with time zone NOT NULL DEFAULT now(),
		cog double precision,
		sog double precision,
		draught double precision,
@@ -61,26 +61,60 @@ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-E
		BEGIN
			-- Make geometry
			IF NEW.longitude IS NOT NULL AND NEW.latitude IS NOT NULL THEN
				UPDATE ais.location
				SET shape = (SELECT public.ST_SetSRID(public.ST_MakePoint(NEW.longitude, NEW.latitude), 4326))
				WHERE uuid = NEW.uuid;
				SELECT ST_SetSRID(ST_MakePoint(NEW.longitude, NEW.latitude), 4326) INTO NEW.shape;
			END IF;

			-- Generate UUID and initialize insert date
			IF TG_OP = 'INSERT' THEN
				NEW.inserted := now();
				NEW.uuid := uuid_generate_v4();
			END IF;

			NEW.updated := now();

			RETURN NEW;
		END;
	\$\$;

	CREATE TRIGGER location_create_shape_location
		AFTER INSERT
		ON ais.location
		FOR EACH ROW EXECUTE PROCEDURE ais.create_shape();
	CREATE OR REPLACE PROCEDURE ais.append_trigger(table_name text)
	LANGUAGE plpgsql
	AS \$\$
		DECLARE
			trigger_name text;
		BEGIN
			trigger_name := 'create_' || replace(table_name, '.', '_');

			EXECUTE format('CREATE TRIGGER %I '
			   'BEFORE INSERT OR UPDATE '
			   'ON %s '
			   'FOR EACH ROW EXECUTE PROCEDURE ais.create_shape()', trigger_name, table_name);
		END;
	\$\$;

	CREATE OR REPLACE FUNCTION on_create_table_create_trigger()
	RETURNS event_trigger
	LANGUAGE plpgsql
	AS \$\$
		DECLARE
			obj RECORD;
		BEGIN
			FOR obj IN SELECT object_identity
						FROM pg_event_trigger_ddl_commands()
						WHERE object_type = 'table'
							AND object_identity LIKE 'ais.location_p%'
			LOOP
				CALL ais.append_trigger(obj.object_identity);
				RAISE NOTICE 'Created trigger: %', obj.object_identity;
			END LOOP;
		END;
	\$\$;

	CREATE EVENT TRIGGER on_create_table ON ddl_command_end
	WHEN TAG IN ('CREATE TABLE')
	EXECUTE PROCEDURE on_create_table_create_trigger();

	SELECT partman.create_parent('ais.location', 'tstamp', 'native', '${INTERVAL}');
	UPDATE partman.part_config SET infinite_time_partitions = true;
	SELECT cron.schedule('@${INTERVAL}', \$\$CALL partman.run_maintenance_proc(p_analyze := false)\$\$)

	CREATE VIEW ais.last_20m AS SELECT DISTINCT ON (mmsi) *
	FROM ais.location
	WHERE tstamp > current_timestamp - interval '20 minutes'
	ORDER BY mmsi, tstamp DESC;

EOSQL
 No newline at end of file