merge_links_fast.sh 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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}.ardok_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. LOOP
  26. EXECUTE format('INSERT INTO %I.links SELECT * FROM %I.%I', schema_name, schema_name, r.tablename);
  27. END LOOP;
  28. END
  29. \$\$;
  30. -- 2. Eemalda täpselt kattuvad geomeetriad (maakondade piiride tõttu)
  31. DO \$\$
  32. DECLARE
  33. schema_name text := '${destination_schema}';
  34. BEGIN
  35. EXECUTE format(
  36. 'DELETE FROM %I.links a
  37. USING (
  38. SELECT geom, MIN(ctid) AS keep_ctid
  39. FROM %I.links
  40. GROUP BY geom
  41. HAVING COUNT(*) > 1
  42. ) b
  43. WHERE a.geom = b.geom AND a.ctid <> b.keep_ctid',
  44. schema_name, schema_name
  45. );
  46. END
  47. \$\$;
  48. -- 3. Eemalda isoleeritud lõigud
  49. DO \$\$
  50. DECLARE
  51. schema_name text := '${destination_schema}';
  52. BEGIN
  53. -- Loo optimeeritud tiputabel
  54. EXECUTE format('
  55. DROP TABLE IF EXISTS %I.links_vertices;
  56. CREATE UNLOGGED TABLE %I.links_vertices AS
  57. WITH endpoints AS (
  58. SELECT ST_SnapToGrid(ST_StartPoint(geom), 0.00001) AS pt FROM %I.links
  59. UNION ALL
  60. SELECT ST_SnapToGrid(ST_EndPoint(geom), 0.00001) FROM %I.links
  61. )
  62. SELECT pt FROM endpoints;
  63. CREATE INDEX links_vertices_geom_idx ON %I.links_vertices USING GIST (pt);',
  64. schema_name, schema_name, schema_name, schema_name, schema_name
  65. );
  66. -- Eemalda need lõigud, millel ei ole ühendusi teise punktiga
  67. EXECUTE format('
  68. DELETE FROM %I.links l
  69. WHERE NOT EXISTS (
  70. SELECT 1 FROM %I.links_vertices v
  71. WHERE ST_DWithin(ST_SnapToGrid(ST_StartPoint(l.geom), 0.00001), v.pt, 0.001)
  72. AND EXISTS (
  73. SELECT 1 FROM %I.links_vertices vv
  74. WHERE NOT ST_Equals(vv.pt, v.pt)
  75. AND ST_DWithin(ST_SnapToGrid(ST_EndPoint(l.geom), 0.00001), vv.pt, 0.001)
  76. )
  77. );',
  78. schema_name, schema_name, schema_name
  79. );
  80. END
  81. \$\$;
  82. -- 4. Lisa järjestikune ID veerg ja indeks
  83. DO \$\$
  84. DECLARE
  85. schema_name text := '${destination_schema}';
  86. BEGIN
  87. EXECUTE format('ALTER TABLE %I.links DROP COLUMN IF EXISTS id;', schema_name);
  88. EXECUTE format('ALTER TABLE %I.links ADD COLUMN id SERIAL PRIMARY KEY;', schema_name);
  89. EXECUTE format('CREATE INDEX links_geom_idx ON %I.links USING GIST (geom);', schema_name);
  90. END
  91. \$\$;
  92. EOF