Skip to content

Commit f4fd950

Browse files
fix: extract workbench
1 parent a2a8a27 commit f4fd950

File tree

1 file changed

+55
-3
lines changed

1 file changed

+55
-3
lines changed

services/web/server/src/simcore_service_webserver/projects/_jobs_repository.py

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from simcore_postgres_database.models.project_to_groups import project_to_groups
1010
from simcore_postgres_database.models.projects import projects
1111
from simcore_postgres_database.models.projects_metadata import projects_metadata
12+
from simcore_postgres_database.models.projects_nodes import projects_nodes
1213
from simcore_postgres_database.models.projects_to_jobs import projects_to_jobs
1314
from simcore_postgres_database.models.projects_to_products import projects_to_products
1415
from 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

Comments
 (0)