11import logging
2+ from collections .abc import Callable
23from datetime import datetime
3- from typing import Callable , cast
4+ from typing import cast
45
56import sqlalchemy as sa
67from aiohttp import web
3132from simcore_postgres_database .utils_workspaces_sql import (
3233 create_my_workspace_access_rights_subquery ,
3334)
34- from sqlalchemy import func
35+ from sqlalchemy import sql
3536from sqlalchemy .ext .asyncio import AsyncConnection
3637from sqlalchemy .orm import aliased
37- from sqlalchemy .sql import ColumnElement , CompoundSelect , Select , asc , desc , select
38+ from sqlalchemy .sql import ColumnElement , CompoundSelect , Select
3839from sqlalchemy .sql .selectable import GenerativeSelect
3940
4041from ..db .plugin import get_asyncpg_engine
@@ -71,8 +72,8 @@ async def create(
7172 user_id = user_id ,
7273 workspace_id = workspace_id ,
7374 created_by_gid = created_by_gid ,
74- created = func .now (),
75- modified = func .now (),
75+ created = sql . func .now (),
76+ modified = sql . func .now (),
7677 )
7778 .returning (* _FOLDER_DB_MODEL_COLS )
7879 )
@@ -91,9 +92,9 @@ def _create_private_workspace_query(
9192 WorkspaceScope .ALL ,
9293 )
9394 return (
94- select (
95+ sql . select (
9596 * _FOLDER_DB_MODEL_COLS ,
96- func .json_build_object (
97+ sql . func .json_build_object (
9798 "read" ,
9899 sa .text ("true" ),
99100 "write" ,
@@ -128,7 +129,7 @@ def _create_shared_workspace_query(
128129 )
129130
130131 shared_workspace_query = (
131- select (
132+ sql . select (
132133 * _FOLDER_DB_MODEL_COLS ,
133134 workspace_access_rights_subquery .c .my_access_rights ,
134135 )
@@ -160,7 +161,7 @@ def _set_ordering(
160161 base_query : GenerativeSelect ,
161162 order_by : OrderBy ,
162163) -> GenerativeSelect :
163- direction_func : Callable = {OrderDirection .ASC : asc , OrderDirection : desc }[
164+ direction_func : Callable = {OrderDirection .ASC : sql . asc , OrderDirection : sql . asc }[
164165 order_by .direction
165166 ]
166167 column = getattr (folders_v2 .c , order_by .field )
@@ -244,7 +245,7 @@ async def list_( # pylint: disable=too-many-arguments,too-many-branches
244245 raise ValueError (msg )
245246
246247 # Select total count from base_query
247- count_query = select (func .count ()).select_from (combined_query .subquery ())
248+ count_query = sql . select (sql . func .count ()).select_from (combined_query .subquery ())
248249
249250 # Ordering and pagination
250251 list_query = (
@@ -278,7 +279,9 @@ async def list_trashed_folders(
278279 NOTE: this is app-wide i.e. no product, user or workspace filtered
279280 TODO: check with MD about workspaces
280281 """
281- base_query = select (_FOLDER_DB_MODEL_COLS ).where (folders_v2 .c .trashed .is_not (None ))
282+ base_query = sql .select (_FOLDER_DB_MODEL_COLS ).where (
283+ folders_v2 .c .trashed .is_not (None )
284+ )
282285
283286 if is_set (trashed_explicitly ):
284287 assert isinstance (trashed_explicitly , bool ) # nosec
@@ -291,7 +294,7 @@ async def list_trashed_folders(
291294 base_query = base_query .where (folders_v2 .c .trashed < trashed_before )
292295
293296 # Select total count from base_query
294- count_query = select (func .count ()).select_from (base_query .subquery ())
297+ count_query = sql . select (sql . func .count ()).select_from (base_query .subquery ())
295298
296299 # Ordering and pagination
297300 list_query = _set_ordering (base_query , order_by ).offset (offset ).limit (limit )
@@ -305,7 +308,7 @@ async def list_trashed_folders(
305308
306309
307310def _create_base_select_query (folder_id : FolderID , product_name : ProductName ) -> Select :
308- return select (* _FOLDER_DB_MODEL_COLS ,).where (
311+ return sql . select (* _FOLDER_DB_MODEL_COLS ,).where (
309312 (folders_v2 .c .product_name == product_name )
310313 & (folders_v2 .c .folder_id == folder_id )
311314 )
@@ -392,7 +395,7 @@ async def update(
392395 )
393396
394397 query = (
395- (folders_v2 .update ().values (modified = func .now (), ** updated ))
398+ (folders_v2 .update ().values (modified = sql . func .now (), ** updated ))
396399 .where (folders_v2 .c .product_name == product_name )
397400 .returning (* _FOLDER_DB_MODEL_COLS )
398401 )
@@ -421,7 +424,7 @@ async def delete_recursively(
421424) -> None :
422425 async with transaction_context (get_asyncpg_engine (app ), connection ) as conn :
423426 # Step 1: Define the base case for the recursive CTE
424- base_query = select (
427+ base_query = sql . select (
425428 folders_v2 .c .folder_id , folders_v2 .c .parent_folder_id
426429 ).where (
427430 (folders_v2 .c .folder_id == folder_id ) # <-- specified folder id
@@ -431,7 +434,7 @@ async def delete_recursively(
431434
432435 # Step 2: Define the recursive case
433436 folder_alias = aliased (folders_v2 )
434- recursive_query = select (
437+ recursive_query = sql . select (
435438 folder_alias .c .folder_id , folder_alias .c .parent_folder_id
436439 ).select_from (
437440 folder_alias .join (
@@ -444,7 +447,7 @@ async def delete_recursively(
444447 folder_hierarchy_cte = folder_hierarchy_cte .union_all (recursive_query )
445448
446449 # Step 4: Execute the query to get all descendants
447- final_query = select (folder_hierarchy_cte )
450+ final_query = sql . select (folder_hierarchy_cte )
448451 result = await conn .stream (final_query )
449452 # list of tuples [(folder_id, parent_folder_id), ...] ex. [(1, None), (2, 1)]
450453 rows = [row async for row in result ]
@@ -479,7 +482,7 @@ async def get_projects_recursively_only_if_user_is_owner(
479482 async with pass_or_acquire_connection (get_asyncpg_engine (app ), connection ) as conn :
480483
481484 # Step 1: Define the base case for the recursive CTE
482- base_query = select (
485+ base_query = sql . select (
483486 folders_v2 .c .folder_id , folders_v2 .c .parent_folder_id
484487 ).where (
485488 (folders_v2 .c .folder_id == folder_id ) # <-- specified folder id
@@ -489,7 +492,7 @@ async def get_projects_recursively_only_if_user_is_owner(
489492
490493 # Step 2: Define the recursive case
491494 folder_alias = aliased (folders_v2 )
492- recursive_query = select (
495+ recursive_query = sql . select (
493496 folder_alias .c .folder_id , folder_alias .c .parent_folder_id
494497 ).select_from (
495498 folder_alias .join (
@@ -502,13 +505,13 @@ async def get_projects_recursively_only_if_user_is_owner(
502505 folder_hierarchy_cte = folder_hierarchy_cte .union_all (recursive_query )
503506
504507 # Step 4: Execute the query to get all descendants
505- final_query = select (folder_hierarchy_cte )
508+ final_query = sql . select (folder_hierarchy_cte )
506509 result = await conn .stream (final_query )
507510 # list of tuples [(folder_id, parent_folder_id), ...] ex. [(1, None), (2, 1)]
508511 folder_ids = [item [0 ] async for item in result ]
509512
510513 query = (
511- select (projects_to_folders .c .project_uuid )
514+ sql . select (projects_to_folders .c .project_uuid )
512515 .join (projects )
513516 .where (
514517 (projects_to_folders .c .folder_id .in_ (folder_ids ))
@@ -537,7 +540,7 @@ async def get_all_folders_and_projects_ids_recursively(
537540 async with pass_or_acquire_connection (get_asyncpg_engine (app ), connection ) as conn :
538541
539542 # Step 1: Define the base case for the recursive CTE
540- base_query = select (
543+ base_query = sql . select (
541544 folders_v2 .c .folder_id , folders_v2 .c .parent_folder_id
542545 ).where (
543546 (folders_v2 .c .folder_id == folder_id ) # <-- specified folder id
@@ -547,7 +550,7 @@ async def get_all_folders_and_projects_ids_recursively(
547550
548551 # Step 2: Define the recursive case
549552 folder_alias = aliased (folders_v2 )
550- recursive_query = select (
553+ recursive_query = sql . select (
551554 folder_alias .c .folder_id , folder_alias .c .parent_folder_id
552555 ).select_from (
553556 folder_alias .join (
@@ -560,12 +563,12 @@ async def get_all_folders_and_projects_ids_recursively(
560563 folder_hierarchy_cte = folder_hierarchy_cte .union_all (recursive_query )
561564
562565 # Step 4: Execute the query to get all descendants
563- final_query = select (folder_hierarchy_cte )
566+ final_query = sql . select (folder_hierarchy_cte )
564567 result = await conn .stream (final_query )
565568 # list of tuples [(folder_id, parent_folder_id), ...] ex. [(1, None), (2, 1)]
566569 folder_ids = [item .folder_id async for item in result ]
567570
568- query = select (projects_to_folders .c .project_uuid ).where (
571+ query = sql . select (projects_to_folders .c .project_uuid ).where (
569572 (projects_to_folders .c .folder_id .in_ (folder_ids ))
570573 & (projects_to_folders .c .user_id == private_workspace_user_id_or_none )
571574 )
@@ -586,7 +589,7 @@ async def get_folders_recursively(
586589 async with pass_or_acquire_connection (get_asyncpg_engine (app ), connection ) as conn :
587590
588591 # Step 1: Define the base case for the recursive CTE
589- base_query = select (
592+ base_query = sql . select (
590593 folders_v2 .c .folder_id , folders_v2 .c .parent_folder_id
591594 ).where (
592595 (folders_v2 .c .folder_id == folder_id ) # <-- specified folder id
@@ -596,7 +599,7 @@ async def get_folders_recursively(
596599
597600 # Step 2: Define the recursive case
598601 folder_alias = aliased (folders_v2 )
599- recursive_query = select (
602+ recursive_query = sql . select (
600603 folder_alias .c .folder_id , folder_alias .c .parent_folder_id
601604 ).select_from (
602605 folder_alias .join (
@@ -609,13 +612,13 @@ async def get_folders_recursively(
609612 folder_hierarchy_cte = folder_hierarchy_cte .union_all (recursive_query )
610613
611614 # Step 4: Execute the query to get all descendants
612- final_query = select (folder_hierarchy_cte )
615+ final_query = sql . select (folder_hierarchy_cte )
613616 result = await conn .stream (final_query )
614617 return cast (list [FolderID ], [row .folder_id async for row in result ])
615618
616619
617620def _select_trashed_by_primary_gid_query ():
618- return sa .select (
621+ return sa .sql . select (
619622 folders_v2 .c .folder_id ,
620623 users .c .primary_gid .label ("trashed_by_primary_gid" ),
621624 ).select_from (
0 commit comments