11CREATE OR REPLACE VIEW jobs_view
22AS
3- SELECT f .uuid ,
4- f . job_fqn AS name,
5- f .namespace_name ,
6- j .name AS simple_name,
3+ SELECT j .uuid ,
4+ j . name ,
5+ j .namespace_name ,
6+ j .simple_name AS simple_name,
77 j .parent_job_uuid ,
8- f . parent_job_name ::text ,
8+ p . name ::text AS parent_job_name ,
99 j .type ,
1010 j .created_at ,
1111 j .updated_at ,
12- f .namespace_uuid ,
12+ j .namespace_uuid ,
1313 j .description ,
1414 j .current_version_uuid ,
1515 j .current_job_context_uuid ,
1616 j .current_location ,
1717 j .current_inputs ,
1818 j .symlink_target_uuid ,
19- j .parent_job_uuid_string ,
20- f .aliases
21- FROM jobs_fqn f,
22- jobs j
23- WHERE j .uuid = f .uuid
24- AND j .is_hidden IS FALSE;
25-
19+ j .parent_job_uuid ::char (36 ) AS parent_job_uuid_string,
20+ j .aliases
21+ FROM jobs j
22+ LEFT JOIN jobs p ON j .parent_job_uuid = p .uuid
23+ WHERE j .is_hidden IS FALSE AND j .symlink_target_uuid IS NULL ;
2624
2725CREATE OR REPLACE FUNCTION rewrite_jobs_fqn_table () RETURNS TRIGGER AS
2826$$
@@ -32,16 +30,24 @@ DECLARE
3230 new_symlink_target_uuid uuid;
3331 old_symlink_target_uuid uuid;
3432 inserted_job jobs_view%rowtype;
33+ full_name varchar ;
3534BEGIN
36- INSERT INTO jobs (uuid, type, created_at, updated_at, namespace_uuid, name, description,
35+ full_name = NEW .name ;
36+ IF NEW .parent_job_uuid IS NOT NULL THEN
37+ SELECT p .name || ' .' || NEW .name INTO full_name
38+ FROM jobs p
39+ WHERE p .uuid = NEW .parent_job_uuid ;
40+ END IF;
41+ INSERT INTO jobs (uuid, type, created_at, updated_at, namespace_uuid, name, simple_name, description,
3742 current_version_uuid, namespace_name, current_job_context_uuid,
3843 current_location, current_inputs, symlink_target_uuid, parent_job_uuid,
39- parent_job_uuid_string, is_hidden)
44+ is_hidden)
4045 SELECT NEW .uuid ,
4146 NEW .type ,
4247 NEW .created_at ,
4348 NEW .updated_at ,
4449 NEW .namespace_uuid ,
50+ full_name,
4551 NEW .name ,
4652 NEW .description ,
4753 NEW .current_version_uuid ,
@@ -51,10 +57,14 @@ BEGIN
5157 NEW .current_inputs ,
5258 NEW .symlink_target_uuid ,
5359 NEW .parent_job_uuid ,
54- COALESCE(NEW .parent_job_uuid ::char (36 ), ' ' ),
5560 false
56- ON CONFLICT (name, namespace_uuid, parent_job_uuid_string )
61+ ON CONFLICT (namespace_uuid, name )
5762 DO UPDATE SET updated_at = now(),
63+ parent_job_uuid = COALESCE(jobs .parent_job_uuid , EXCLUDED .parent_job_uuid ),
64+ simple_name = CASE
65+ WHEN EXCLUDED .parent_job_uuid IS NOT NULL THEN EXCLUDED .name
66+ ELSE jobs .name
67+ END,
5868 type = EXCLUDED .type ,
5969 description = EXCLUDED .description ,
6070 current_job_context_uuid = EXCLUDED .current_job_context_uuid ,
@@ -73,94 +83,38 @@ BEGIN
7383 INTO job_uuid, job_updated_at, new_symlink_target_uuid, old_symlink_target_uuid;
7484
7585
76- -- update the jobs_fqn table when inserting a new record
77- -- (NEW.uuid will equal the job_uuid when inserting a new record)
78- -- AND if the symlink target is null
79- -- Avoid constructing the symlinks and aliases, as that is expensive
80- IF TG_OP= ' INSERT'
81- AND NEW .uuid = job_uuid
82- AND NEW .symlink_target_uuid IS NULL
83- AND NEW .updated_at = job_updated_at THEN
84- RAISE DEBUG ' Inserting into jobs_fqn for new job % (%)' , NEW .name , job_uuid;
85- WITH fqn AS (SELECT j .uuid ,
86- CASE
87- WHEN j .parent_job_uuid IS NULL THEN j .name
88- ELSE jf .job_fqn || ' .' || j .name
89- END AS name,
90- j .namespace_uuid ,
91- j .namespace_name ,
92- jf .job_fqn AS parent_job_name,
93- j .parent_job_uuid
94- FROM jobs j
95- LEFT JOIN jobs_fqn jf ON jf .uuid = j .parent_job_uuid
96- WHERE j .uuid = job_uuid)
97- INSERT
98- INTO jobs_fqn
99- SELECT j .uuid ,
100- jf .namespace_uuid ,
101- jf .namespace_name ,
102- jf .parent_job_name ,
103- ARRAY[jf .name ]::text [],
104- jf .name AS job_fqn
105- FROM jobs j
106- INNER JOIN fqn jf ON jf .uuid = j .uuid ;
107- -- or when the symlink_target_uuid is being updated.
108- ELSIF (new_symlink_target_uuid IS NOT NULL AND new_symlink_target_uuid IS DISTINCT FROM old_symlink_target_uuid) THEN
109- RAISE DEBUG ' Updating jobs_fqn due to % to job % (%)' , TG_OP, NEW .name , job_uuid;
86+ -- update the jobs table when updating a job's symlink target
87+ IF (new_symlink_target_uuid IS NOT NULL AND new_symlink_target_uuid IS DISTINCT FROM old_symlink_target_uuid) THEN
88+ RAISE INFO ' Updating jobs aliases and symlinks due to % to job % (%)' , TG_OP, NEW .name , job_uuid;
11089 WITH RECURSIVE
11190 jobs_symlink AS (SELECT j .uuid , j .uuid AS link_target_uuid, j .symlink_target_uuid
11291 FROM jobs j
113- -- include only jobs that have symlinks pointing to them to keep this table small
114- INNER JOIN jobs js ON js .symlink_target_uuid = j .uuid
92+ -- include only jobs that have symlinks pointing to them to keep this table small
93+ INNER JOIN jobs js ON js .symlink_target_uuid = j .uuid
11594 WHERE j .symlink_target_uuid IS NULL
11695 UNION
11796 SELECT j .uuid , jn .link_target_uuid , j .symlink_target_uuid
11897 FROM jobs j
119- INNER JOIN jobs_symlink jn ON j .symlink_target_uuid = jn .uuid ),
120- fqn AS (SELECT j .uuid ,
121- CASE
122- WHEN j .parent_job_uuid IS NULL THEN j .name
123- ELSE jf .job_fqn || ' .' || j .name
124- END AS name,
125- j .namespace_uuid ,
126- j .namespace_name ,
127- jf .job_fqn AS parent_job_name,
128- j .parent_job_uuid
129- FROM jobs j
130- LEFT JOIN jobs_fqn jf ON jf .uuid = j .parent_job_uuid
131- LEFT JOIN jobs_symlink js ON js .link_target_uuid = j .uuid
132- WHERE j .uuid = job_uuid OR j .symlink_target_uuid = job_uuid OR js .uuid = job_uuid
133- UNION
134- SELECT j1 .uuid ,
135- f .name || ' .' || j1 .name AS name,
136- f .namespace_uuid AS namespace_uuid,
137- f .namespace_name AS namespace_name,
138- f .name AS parent_job_name,
139- j1 .parent_job_uuid
140- FROM jobs j1
141- INNER JOIN fqn f ON f .uuid = j1 .parent_job_uuid ),
98+ INNER JOIN jobs_symlink jn ON j .symlink_target_uuid = jn .uuid ),
14299 aliases AS (SELECT s .link_target_uuid ,
143- ARRAY_AGG(DISTINCT f .job_fqn ) FILTER ( WHERE f . job_fqn IS NOT NULL ) AS aliases
100+ ARRAY_AGG(DISTINCT f .name ) AS aliases
144101 FROM jobs_symlink s
145- INNER JOIN jobs_fqn f ON f .uuid = s .uuid
102+ INNER JOIN jobs f ON f .uuid = s .uuid
146103 GROUP BY s .link_target_uuid )
147- INSERT
148- INTO jobs_fqn
149- SELECT j .uuid ,
150- jf .namespace_uuid ,
151- jf .namespace_name ,
152- jf .parent_job_name ,
153- a .aliases ,
154- jf .name AS job_fqn
155- FROM jobs j
156- LEFT JOIN jobs_symlink js ON j .uuid = js .uuid
157- LEFT JOIN aliases a ON a .link_target_uuid = js .link_target_uuid
158- INNER JOIN fqn jf ON jf .uuid = COALESCE(js .link_target_uuid , j .uuid )
159- ON CONFLICT (uuid) DO UPDATE
160- SET job_fqn= EXCLUDED .job_fqn ,
161- aliases = (SELECT array_agg(DISTINCT a) FROM (SELECT unnest(jobs_fqn .aliases ) AS a UNION SELECT unnest(EXCLUDED .aliases ) AS a) al);
104+ UPDATE jobs
105+ SET aliases = j .aliases , symlink_target_uuid= j .link_target_uuid
106+ FROM (
107+ SELECT j .uuid ,
108+ CASE WHEN j .uuid = s .link_target_uuid THEN NULL ELSE s .link_target_uuid END AS link_target_uuid,
109+ a .aliases
110+ FROM jobs j
111+ LEFT JOIN jobs_symlink s ON s .uuid = j .uuid
112+ LEFT JOIN aliases a ON a .link_target_uuid = j .uuid
113+ ) j
114+ WHERE jobs .uuid = j .uuid ;
162115 END IF;
163- SELECT * INTO inserted_job FROM jobs_view WHERE uuid= job_uuid;
116+ SELECT * INTO inserted_job FROM jobs_view
117+ WHERE uuid= job_uuid OR (new_symlink_target_uuid IS NOT NULL AND uuid= new_symlink_target_uuid);
164118 return inserted_job;
165119END;
166120$$ LANGUAGE plpgsql;
0 commit comments