From e2a13c248c46244e90d8e1c88e00ba91aa98b9e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=BDdila?= Date: Wed, 24 Jul 2024 20:53:00 +0200 Subject: [PATCH] added triggers to update generalized routes which for some reason beak during the time --- sql/additional.sql | 105 +++++++++++++++++++++++++++++++++++ sql/route_gen_workaround.sql | 43 ++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 sql/route_gen_workaround.sql diff --git a/sql/additional.sql b/sql/additional.sql index 0f4fc08..9f29945 100644 --- a/sql/additional.sql +++ b/sql/additional.sql @@ -25,6 +25,111 @@ CREATE INDEX osm_route_members_idx1 ON osm_route_members (member); CREATE INDEX osm_route_members_idx2 ON osm_route_members (type); +create index osm_route_members_idx1_g1 on osm_route_members_gen1(member); + +create index osm_route_members_idx2_g1 on osm_route_members_gen1(type); + +create index osm_route_members_idx1_g0 on osm_route_members_gen0(member); + +create index osm_route_members_idx2_g0 on osm_route_members_gen0(type); + +-- There seems to be a bug in imposm3. Workaround by using a trigger. +-- https://github.com/omniscale/imposm3/issues/293 + +CREATE OR REPLACE FUNCTION osm_route_members_insert_trigger() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO osm_route_members_gen1 (osm_id, member, role, type, geometry) + VALUES (NEW.osm_id, NEW.member, NEW.role, NEW.type, ST_SimplifyPreserveTopology(NEW.geometry, 50)); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION osm_route_members_update_trigger() +RETURNS TRIGGER AS $$ +BEGIN + UPDATE osm_route_members_gen1 + SET member = NEW.member, + role = NEW.role, + type = NEW.type, + geometry = ST_SimplifyPreserveTopology(NEW.geometry, 50) + WHERE osm_id = NEW.osm_id AND type = NEW.type; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + + +CREATE OR REPLACE FUNCTION osm_route_members_delete_trigger() +RETURNS TRIGGER AS $$ +BEGIN + DELETE FROM osm_route_members_gen1 + WHERE osm_id = OLD.osm_id AND type = OLD.type; + RETURN OLD; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER osm_route_members_after_insert +AFTER INSERT ON osm_route_members +FOR EACH ROW +EXECUTE FUNCTION osm_route_members_insert_trigger(); + +CREATE TRIGGER osm_route_members_after_update +AFTER UPDATE ON osm_route_members +FOR EACH ROW +EXECUTE FUNCTION osm_route_members_update_trigger(); + +CREATE TRIGGER osm_route_members_after_delete +AFTER DELETE ON osm_route_members +FOR EACH ROW +EXECUTE FUNCTION osm_route_members_delete_trigger(); + + +CREATE OR REPLACE FUNCTION osm_route_members_gen0_insert_trigger() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO osm_route_members_gen0 (osm_id, member, role, type, geometry) + VALUES (NEW.osm_id, NEW.member, NEW.role, NEW.type, ST_SimplifyPreserveTopology(NEW.geometry, 200)); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION osm_route_members_gen0_update_trigger() +RETURNS TRIGGER AS $$ +BEGIN + UPDATE osm_route_members_gen0 + SET member = NEW.member, + role = NEW.role, + type = NEW.type, + geometry = ST_SimplifyPreserveTopology(NEW.geometry, 200) + WHERE osm_id = NEW.osm_id AND type = NEW.type; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION osm_route_members_gen0_delete_trigger() +RETURNS TRIGGER AS $$ +BEGIN + DELETE FROM osm_route_members_gen0 + WHERE osm_id = OLD.osm_id AND type = OLD.type; + RETURN OLD; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER osm_route_members_gen0_after_insert +AFTER INSERT ON osm_route_members +FOR EACH ROW +EXECUTE FUNCTION osm_route_members_gen0_insert_trigger(); + +CREATE TRIGGER osm_route_members_gen0_after_update +AFTER UPDATE ON osm_route_members +FOR EACH ROW +EXECUTE FUNCTION osm_route_members_gen0_update_trigger(); + +CREATE TRIGGER osm_route_members_gen0_after_delete +AFTER DELETE ON osm_route_members +FOR EACH ROW +EXECUTE FUNCTION osm_route_members_gen0_delete_trigger(); + -- z-order -- DROP TABLE IF EXISTS z_order_poi; diff --git a/sql/route_gen_workaround.sql b/sql/route_gen_workaround.sql new file mode 100644 index 0000000..7f34f36 --- /dev/null +++ b/sql/route_gen_workaround.sql @@ -0,0 +1,43 @@ +-- There seems to be a bug in imposm3. Simple workaround is to run this regulary, but for better one create a trigger. +-- https://github.com/omniscale/imposm3/issues/293 +INSERT INTO + osm_route_members_gen1 (osm_id, member, role, type, geometry) +SELECT + osm.osm_id, + osm.member, + osm.role, + osm.type, + ST_SimplifyPreserveTopology(osm.geometry, 50) AS geometry +FROM + osm_route_members osm +WHERE + NOT EXISTS ( + SELECT + 1 + FROM + osm_route_members_gen1 osm_gen1 + WHERE + osm_gen1.osm_id = osm.osm_id + AND osm_gen1.type = osm.type + ); + +INSERT INTO + osm_route_members_gen0 (osm_id, member, role, type, geometry) +SELECT + osm.osm_id, + osm.member, + osm.role, + osm.type, + ST_SimplifyPreserveTopology(osm.geometry, 200) AS geometry +FROM + osm_route_members osm +WHERE + NOT EXISTS ( + SELECT + 1 + FROM + osm_route_members_gen0 osm_gen0 + WHERE + osm_gen0.osm_id = osm.osm_id + AND osm_gen0.type = osm.type + );