@@ -28,4 +28,51 @@ CREATE TABlE jobs_fqn
2828 parent_job_name varchar ,
2929 aliases varchar [],
3030 job_fqn varchar NOT NULL
31- );
31+ );
32+
33+ WITH RECURSIVE
34+ jobs_symlink AS (SELECT uuid, uuid AS link_target_uuid, symlink_target_uuid
35+ FROM jobs j
36+ WHERE symlink_target_uuid IS NULL
37+ UNION
38+ SELECT j .uuid , jn .link_target_uuid , j .symlink_target_uuid
39+ FROM jobs j
40+ INNER JOIN jobs_symlink jn ON j .symlink_target_uuid = jn .uuid ),
41+ fqn AS (SELECT j .uuid ,
42+ j .name AS name,
43+ j .namespace_uuid ,
44+ j .namespace_name ,
45+ NULL ::text AS parent_job_name,
46+ j .parent_job_uuid
47+ FROM jobs j
48+ WHERE parent_job_uuid IS NULL
49+ UNION
50+ SELECT j1 .uuid ,
51+ f .name || ' .' || j1 .name AS name,
52+ f .namespace_uuid AS namespace_uuid,
53+ f .namespace_name AS namespace_name,
54+ f .name AS parent_job_name,
55+ j1 .parent_job_uuid
56+ FROM jobs j1
57+ INNER JOIN fqn f ON j1 .parent_job_uuid = f .uuid ),
58+ aliases AS (SELECT s .link_target_uuid ,
59+ ARRAY_AGG(DISTINCT f .name ) FILTER (WHERE f .name IS NOT NULL ) AS aliases
60+ FROM jobs_symlink s
61+ INNER JOIN fqn f ON f .uuid = s .uuid
62+ WHERE s .link_target_uuid != s .uuid
63+ GROUP BY s .link_target_uuid )
64+ INSERT
65+ INTO jobs_fqn
66+ SELECT j .uuid ,
67+ jf .namespace_uuid ,
68+ jf .namespace_name ,
69+ jf .parent_job_name ,
70+ a .aliases ,
71+ jf .name AS job_fqn
72+ FROM jobs j
73+ LEFT JOIN jobs_symlink js ON j .uuid = js .uuid
74+ LEFT JOIN aliases a ON a .link_target_uuid = js .link_target_uuid
75+ INNER JOIN fqn jf ON jf .uuid = COALESCE(js .link_target_uuid , j .uuid )
76+ ON CONFLICT (uuid) DO UPDATE
77+ SET job_fqn= EXCLUDED .job_fqn ,
78+ aliases = jobs_fqn .aliases || EXCLUDED .aliases ;
0 commit comments