shawon_majid

flow_nodes_backfill.sql

Jan 12th, 2026
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PostgreSQL 3.43 KB | Source Code | 0 0
  1. BEGIN;
  2.  
  3. -- Ensure unique mapping per flow/external node
  4. CREATE UNIQUE INDEX IF NOT EXISTS flow_nodes_flow_external_idx
  5.   ON flow_nodes(flow_id, external_id);
  6.  
  7. -- Temp columns
  8. ALTER TABLE flow_filters  ADD COLUMN IF NOT EXISTS node_id_new UUID;
  9. ALTER TABLE flow_messages ADD COLUMN IF NOT EXISTS node_id_new UUID;
  10. ALTER TABLE flow_kbs      ADD COLUMN IF NOT EXISTS node_id_new UUID;
  11.  
  12. -- Seed flow_nodes from existing data (idempotent)
  13. INSERT INTO flow_nodes (flow_id, external_id, name, type)
  14. SELECT DISTINCT flow_id, node_id, node_id AS name,
  15.        COALESCE(NULLIF(ff.type::text,''), 'action')::t_flow_nodes_type
  16. FROM flow_filters ff
  17. WHERE node_id IS NOT NULL
  18. ON CONFLICT DO NOTHING;
  19.  
  20. INSERT INTO flow_nodes (flow_id, external_id, name, type)
  21. SELECT DISTINCT flow_id, node_id, node_id AS name, 'action'::t_flow_nodes_type
  22. FROM flow_messages fm
  23. WHERE node_id IS NOT NULL
  24. ON CONFLICT DO NOTHING;
  25.  
  26. INSERT INTO flow_nodes (flow_id, external_id, name, type)
  27. SELECT DISTINCT flow_id, node_id, node_id AS name, 'action'::t_flow_nodes_type
  28. FROM flow_kbs fk
  29. WHERE node_id IS NOT NULL
  30. ON CONFLICT DO NOTHING;
  31.  
  32. -- Backfill new UUID columns
  33. UPDATE flow_filters ff
  34. SET node_id_new = fn.id
  35. FROM flow_nodes fn
  36. WHERE fn.flow_id = ff.flow_id AND fn.external_id = ff.node_id;
  37.  
  38. UPDATE flow_messages fm
  39. SET node_id_new = fn.id
  40. FROM flow_nodes fn
  41. WHERE fn.flow_id = fm.flow_id AND fn.external_id = fm.node_id;
  42.  
  43. UPDATE flow_kbs fk
  44. SET node_id_new = fn.id
  45. FROM flow_nodes fn
  46. WHERE fn.flow_id = fk.flow_id AND fn.external_id = fk.node_id;
  47.  
  48. -- Safety check: halt if anything failed to resolve
  49. DO $$
  50. DECLARE v_missing int;
  51. BEGIN
  52.   SELECT count(*) INTO v_missing FROM flow_filters  WHERE node_id_new IS NULL;
  53.   IF v_missing > 0 THEN RAISE EXCEPTION 'Unresolved flow_filters.node_id_new: %', v_missing; END IF;
  54.  
  55.   SELECT count(*) INTO v_missing FROM flow_messages WHERE node_id_new IS NULL;
  56.   IF v_missing > 0 THEN RAISE EXCEPTION 'Unresolved flow_messages.node_id_new: %', v_missing; END IF;
  57.  
  58.   SELECT count(*) INTO v_missing FROM flow_kbs      WHERE node_id_new IS NULL;
  59.   IF v_missing > 0 THEN RAISE EXCEPTION 'Unresolved flow_kbs.node_id_new: %', v_missing; END IF;
  60. END $$;
  61.  
  62. -- Enforce NOT NULL + FKs
  63. ALTER TABLE flow_filters  ALTER COLUMN node_id_new SET NOT NULL;
  64. ALTER TABLE flow_messages ALTER COLUMN node_id_new SET NOT NULL;
  65. ALTER TABLE flow_kbs      ALTER COLUMN node_id_new SET NOT NULL;
  66.  
  67. ALTER TABLE flow_filters  ADD CONSTRAINT flow_filters_node_id_new_fkey
  68.   FOREIGN KEY (node_id_new) REFERENCES flow_nodes(id) ON DELETE CASCADE;
  69. ALTER TABLE flow_messages ADD CONSTRAINT flow_messages_node_id_new_fkey
  70.   FOREIGN KEY (node_id_new) REFERENCES flow_nodes(id) ON DELETE CASCADE;
  71. ALTER TABLE flow_kbs      ADD CONSTRAINT flow_kbs_node_id_new_fkey
  72.   FOREIGN KEY (node_id_new) REFERENCES flow_nodes(id) ON DELETE CASCADE;
  73.  
  74. -- Swap columns
  75. ALTER TABLE flow_filters  DROP COLUMN node_id;
  76. ALTER TABLE flow_messages DROP COLUMN node_id;
  77. ALTER TABLE flow_kbs      DROP COLUMN node_id;
  78.  
  79. ALTER TABLE flow_filters  RENAME COLUMN node_id_new TO node_id;
  80. ALTER TABLE flow_messages RENAME COLUMN node_id_new TO node_id;
  81. ALTER TABLE flow_kbs      RENAME COLUMN node_id_new TO node_id;
  82.  
  83. -- Indexes on new columns
  84. CREATE INDEX IF NOT EXISTS flow_filters_node_id_idx  ON flow_filters(node_id);
  85. CREATE INDEX IF NOT EXISTS flow_messages_node_id_idx ON flow_messages(node_id);
  86. CREATE INDEX IF NOT EXISTS flow_kbs_node_id_idx      ON flow_kbs(node_id);
  87.  
  88. COMMIT;
Advertisement
Add Comment
Please, Sign In to add comment