merge_links.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #!/bin/bash
  2. set -e
  3. source env.sh
  4. echo "🔗 Ühendan ja puhastan kõik links_* tabelid skeemist ${destination_schema}"
  5. psql ${CONNECTION_NAME} -d ${destination_dbname} <<EOF
  6. -- 1. Ühendame kõik maakondlikud links_* tabelid ühiseks tabeliks
  7. DO \$\$
  8. DECLARE
  9. schema_name text := '${destination_schema}';
  10. template_name text := (
  11. SELECT 'links_' || relation_id
  12. FROM ${destination_schema}.administrative
  13. WHERE admin_level = '6'
  14. LIMIT 1
  15. );
  16. r record;
  17. BEGIN
  18. RAISE NOTICE 'Loon %', schema_name || '.links';
  19. EXECUTE format('DROP TABLE IF EXISTS %I.links CASCADE', schema_name);
  20. EXECUTE format('CREATE TABLE %I.links (LIKE %I.%I INCLUDING ALL)', schema_name, schema_name, template_name);
  21. FOR r IN
  22. SELECT tablename
  23. FROM pg_tables
  24. WHERE schemaname = schema_name AND tablename LIKE 'links_%'
  25. AND tablename NOT IN ('links', 'links_vertices')
  26. LOOP
  27. EXECUTE format('INSERT INTO %I.links SELECT * FROM %I.%I', schema_name, schema_name, r.tablename);
  28. END LOOP;
  29. END
  30. \$\$;
  31. -- 2. Eemalda täpselt kattuvad geomeetriad (maakondade piiride tõttu)
  32. DO \$\$
  33. DECLARE
  34. schema_name text := '${destination_schema}';
  35. BEGIN
  36. EXECUTE format(
  37. 'DELETE FROM %I.links a
  38. USING (
  39. SELECT geom, MIN(ctid) AS keep_ctid
  40. FROM %I.links
  41. GROUP BY geom
  42. HAVING COUNT(*) > 1
  43. ) b
  44. WHERE a.geom = b.geom AND a.ctid <> b.keep_ctid',
  45. schema_name, schema_name
  46. );
  47. END
  48. \$\$;
  49. -- 3. Eemalda isoleeritud lõigud
  50. DO \$\$
  51. DECLARE
  52. schema_name text := '${destination_schema}';
  53. BEGIN
  54. -- Loo optimeeritud tiputabel
  55. EXECUTE format('
  56. DROP TABLE IF EXISTS %I.links_vertices;
  57. CREATE UNLOGGED TABLE %I.links_vertices AS
  58. WITH endpoints AS (
  59. SELECT ST_SnapToGrid(ST_StartPoint(geom), 0.00001) AS pt FROM %I.links
  60. UNION ALL
  61. SELECT ST_SnapToGrid(ST_EndPoint(geom), 0.00001) FROM %I.links
  62. )
  63. SELECT pt FROM endpoints;
  64. CREATE INDEX links_vertices_geom_idx ON %I.links_vertices USING GIST (pt);',
  65. schema_name, schema_name, schema_name, schema_name, schema_name
  66. );
  67. -- Eemalda need lõigud, millel ei ole ühendusi teise punktiga
  68. EXECUTE format('
  69. DELETE FROM %I.links l
  70. WHERE NOT EXISTS (
  71. SELECT 1 FROM %I.links_vertices v
  72. WHERE ST_DWithin(ST_SnapToGrid(ST_StartPoint(l.geom), 0.00001), v.pt, 0.001)
  73. AND EXISTS (
  74. SELECT 1 FROM %I.links_vertices vv
  75. WHERE NOT ST_Equals(vv.pt, v.pt)
  76. AND ST_DWithin(ST_SnapToGrid(ST_EndPoint(l.geom), 0.00001), vv.pt, 0.001)
  77. )
  78. );',
  79. schema_name, schema_name, schema_name
  80. );
  81. END
  82. \$\$;
  83. -- 4. Lisa järjestikune ID veerg ja indeks
  84. DO \$\$
  85. DECLARE
  86. schema_name text := '${destination_schema}';
  87. column_exists boolean;
  88. BEGIN
  89. SELECT EXISTS (
  90. SELECT 1
  91. FROM information_schema.columns
  92. WHERE table_schema = schema_name
  93. AND table_name = 'links'
  94. AND column_name = 'id'
  95. ) INTO column_exists;
  96. IF column_exists THEN
  97. EXECUTE format('ALTER TABLE %I.links DROP COLUMN id;', schema_name);
  98. END IF;
  99. EXECUTE format('ALTER TABLE %I.links ADD COLUMN id SERIAL PRIMARY KEY;', schema_name);
  100. EXECUTE format('CREATE INDEX links_geom_idx ON %I.links USING GIST (geom);', schema_name);
  101. END
  102. \$\$;
  103. EOF