@@ -387,24 +387,61 @@ async def list_all_services(
387387 pagination_offset : int | None = None ,
388388 filters : ServiceDBFilters | None = None ,
389389 ) -> tuple [PositiveInt , list [ServiceMetaDataDBGet ]]:
390- # get page count
391- stmt_total = _services_sql .all_services_total_count_stmt (
392- product_name = product_name ,
393- user_id = user_id ,
394- access_rights = AccessRightsClauses .can_read ,
395- filters = filters ,
390+ # Create base query that's common to both count and content queries
391+ base_query = (
392+ sa .select (services_meta_data .c .key , services_meta_data .c .version )
393+ .select_from (
394+ services_meta_data .join (
395+ services_access_rights ,
396+ (services_meta_data .c .key == services_access_rights .c .key )
397+ & (
398+ services_meta_data .c .version == services_access_rights .c .version
399+ ),
400+ ).join (
401+ user_to_groups ,
402+ (user_to_groups .c .gid == services_access_rights .c .gid ),
403+ )
404+ )
405+ .where (
406+ (services_access_rights .c .product_name == product_name )
407+ & (user_to_groups .c .uid == user_id )
408+ & AccessRightsClauses .can_read
409+ )
410+ .distinct ()
396411 )
397412
398- # get page content
399- stmt_page = _services_sql .list_all_services_stmt (
400- product_name = product_name ,
401- user_id = user_id ,
402- access_rights = AccessRightsClauses .can_read ,
403- limit = pagination_limit ,
404- offset = pagination_offset ,
405- filters = filters ,
413+ if filters :
414+ base_query = _services_sql .apply_services_filters (base_query , filters )
415+
416+ # Subquery for efficient counting and further joins
417+ subquery = base_query .subquery ()
418+
419+ # Count query - only counts distinct key/version pairs
420+ stmt_total = sa .select (sa .func .count ()).select_from (subquery )
421+
422+ # Content query - gets all details with pagination
423+ stmt_page = (
424+ sa .select (* SERVICES_META_DATA_COLS )
425+ .select_from (
426+ subquery .join (
427+ services_meta_data ,
428+ (subquery .c .key == services_meta_data .c .key )
429+ & (subquery .c .version == services_meta_data .c .version ),
430+ )
431+ )
432+ .order_by (
433+ services_meta_data .c .key ,
434+ sa .desc (_services_sql .by_version (services_meta_data .c .version )),
435+ )
406436 )
407437
438+ # Apply pagination to content query
439+ if pagination_offset is not None :
440+ stmt_page = stmt_page .offset (pagination_offset )
441+ if pagination_limit is not None :
442+ stmt_page = stmt_page .limit (pagination_limit )
443+
444+ # Execute both queries
408445 async with self .db_engine .connect () as conn :
409446 result = await conn .execute (stmt_total )
410447 total_count = result .scalar () or 0
0 commit comments