112112# NOTE: https://github.com/ITISFoundation/osparc-simcore/issues/3516
113113
114114
115+ def _make_workbench_subquery ():
116+ return (
117+ sa .select (
118+ projects_nodes .c .project_uuid ,
119+ sa .func .jsonb_object_agg (
120+ projects_nodes .c .node_id ,
121+ sa .func .jsonb_build_object (
122+ "key" ,
123+ projects_nodes .c .key ,
124+ "version" ,
125+ projects_nodes .c .version ,
126+ "label" ,
127+ projects_nodes .c .label ,
128+ "input_access" ,
129+ projects_nodes .c .input_access ,
130+ "input_nodes" ,
131+ projects_nodes .c .input_nodes ,
132+ "inputs" ,
133+ projects_nodes .c .inputs ,
134+ "inputs_required" ,
135+ projects_nodes .c .inputs_required ,
136+ "output_nodes" ,
137+ projects_nodes .c .output_nodes ,
138+ "outputs" ,
139+ projects_nodes .c .outputs ,
140+ "run_hash" ,
141+ projects_nodes .c .run_hash ,
142+ "state" ,
143+ projects_nodes .c .state ,
144+ "parent" ,
145+ projects_nodes .c .parent ,
146+ "boot_options" ,
147+ projects_nodes .c .boot_options ,
148+ ),
149+ ).label ("workbench" ),
150+ ).group_by (projects_nodes .c .project_uuid )
151+ ).subquery ("workbench_subquery" )
152+
153+
115154class ProjectDBAPI (BaseProjectDB ):
116155 def __init__ (self , app : web .Application ) -> None :
117156 self ._app = app
@@ -167,6 +206,7 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
167206 project_index = None
168207 project_uuid = ProjectID (f"{ insert_values ['uuid' ]} " )
169208
209+ workbench = insert_values .pop ("workbench" )
170210 try :
171211 result : ResultProxy = await conn .execute (
172212 projects .insert ()
@@ -183,6 +223,7 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
183223 assert row # nosec
184224
185225 selected_values = ProjectDict (row .items ())
226+ selected_values ["workbench" ] = workbench
186227 project_index = selected_values .pop ("id" )
187228
188229 except UniqueViolation as err :
@@ -222,9 +263,7 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
222263 NodeID (node_id ): ProjectNodeCreate (
223264 node_id = NodeID (node_id ),
224265 required_resources = {},
225- key = node_info .get ("key" ),
226- version = node_info .get ("version" ),
227- label = node_info .get ("label" ),
266+ ** node_info ,
228267 )
229268 for node_id , node_info in selected_values [
230269 "workbench"
@@ -237,9 +276,7 @@ def _reraise_if_not_unique_uuid_error(err: UniqueViolation):
237276 ProjectNodeCreate (
238277 node_id = NodeID (node_id ),
239278 required_resources = {},
240- key = node_info .get ("key" ),
241- version = node_info .get ("version" ),
242- label = node_info .get ("label" ),
279+ ** node_info ,
243280 ),
244281 )
245282 for node_id , node_info in selected_values [
@@ -390,7 +427,7 @@ def _create_private_workspace_query(
390427 private_workspace_query = (
391428 sa .select (
392429 * PROJECT_DB_COLS ,
393- projects .c .workbench ,
430+ _make_workbench_subquery () .c .workbench ,
394431 access_rights_subquery .c .access_rights ,
395432 projects_to_products .c .product_name ,
396433 projects_to_folders .c .folder_id ,
@@ -472,7 +509,7 @@ def _create_shared_workspace_query(
472509 shared_workspace_query = (
473510 sa .select (
474511 * PROJECT_DB_COLS ,
475- projects .c .workbench ,
512+ _make_workbench_subquery () .c .workbench ,
476513 workspace_access_rights_subquery .c .access_rights ,
477514 projects_to_products .c .product_name ,
478515 projects_to_folders .c .folder_id ,
@@ -770,7 +807,7 @@ async def get_project_db(self, project_uuid: ProjectID) -> ProjectDB:
770807 result = await conn .execute (
771808 sa .select (
772809 * PROJECT_DB_COLS ,
773- projects .c .workbench ,
810+ # projects.c.workbench, TODO GCR
774811 ).where (projects .c .uuid == f"{ project_uuid } " )
775812 )
776813 row = await result .fetchone ()
0 commit comments