99from simcore_postgres_database .models .project_to_groups import project_to_groups
1010from simcore_postgres_database .models .projects import projects
1111from simcore_postgres_database .models .projects_metadata import projects_metadata
12+ from simcore_postgres_database .models .projects_nodes import projects_nodes
1213from simcore_postgres_database .models .projects_to_jobs import projects_to_jobs
1314from simcore_postgres_database .models .projects_to_products import projects_to_products
1415from simcore_postgres_database .utils_repos import (
@@ -169,17 +170,68 @@ async def list_projects_marked_as_jobs(
169170 # Step 5: Query to get the total count
170171 total_query = sa .select (sa .func .count ()).select_from (base_query )
171172
172- # Step 6: Query to get the paginated list with full selection
173+ # Step 6: Create subquery to aggregate project nodes into workbench structure
174+ workbench_subquery = (
175+ sa .select (
176+ projects_nodes .c .project_uuid ,
177+ sa .func .json_object_agg (
178+ projects_nodes .c .node_id ,
179+ sa .func .json_build_object (
180+ "key" ,
181+ projects_nodes .c .key ,
182+ "version" ,
183+ projects_nodes .c .version ,
184+ "label" ,
185+ projects_nodes .c .label ,
186+ "progress" ,
187+ projects_nodes .c .progress ,
188+ "thumbnail" ,
189+ projects_nodes .c .thumbnail ,
190+ "inputAccess" ,
191+ projects_nodes .c .input_access ,
192+ "inputNodes" ,
193+ projects_nodes .c .input_nodes ,
194+ "inputs" ,
195+ projects_nodes .c .inputs ,
196+ "inputsRequired" ,
197+ projects_nodes .c .inputs_required ,
198+ "inputsUnits" ,
199+ projects_nodes .c .inputs_units ,
200+ "outputNodes" ,
201+ projects_nodes .c .output_nodes ,
202+ "outputs" ,
203+ projects_nodes .c .outputs ,
204+ "runHash" ,
205+ projects_nodes .c .run_hash ,
206+ "state" ,
207+ projects_nodes .c .state ,
208+ "parent" ,
209+ projects_nodes .c .parent ,
210+ "bootOptions" ,
211+ projects_nodes .c .boot_options ,
212+ ),
213+ ).label ("workbench" ),
214+ )
215+ .group_by (projects_nodes .c .project_uuid )
216+ .subquery ()
217+ )
218+
219+ # Step 7: Query to get the paginated list with full selection
173220 list_query = (
174221 sa .select (
175222 * _PROJECT_DB_COLS ,
176- projects .c .workbench ,
223+ sa .func .coalesce (
224+ workbench_subquery .c .workbench , sa .text ("'{}'::json" )
225+ ).label ("workbench" ),
177226 base_query .c .job_parent_resource_name ,
178227 )
179228 .select_from (
180229 base_query .join (
181230 projects ,
182231 projects .c .uuid == base_query .c .project_uuid ,
232+ ).outerjoin (
233+ workbench_subquery ,
234+ projects .c .uuid == workbench_subquery .c .project_uuid ,
183235 )
184236 )
185237 .order_by (
@@ -190,7 +242,7 @@ async def list_projects_marked_as_jobs(
190242 .offset (pagination_offset )
191243 )
192244
193- # Step 7 : Execute queries
245+ # Step 8 : Execute queries
194246 async with pass_or_acquire_connection (self .engine , connection ) as conn :
195247 total_count = await conn .scalar (total_query )
196248 assert isinstance (total_count , int ) # nosec
0 commit comments