Skip to content

Commit 0da66e3

Browse files
committed
draft implementation
1 parent 48e3781 commit 0da66e3

File tree

2 files changed

+52
-14
lines changed

2 files changed

+52
-14
lines changed

services/catalog/src/simcore_service_catalog/repository/services.py

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

services/catalog/tests/unit/with_dbs/test_repositories.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,7 @@ async def test_compare_list_all_and_latest_services(
10521052

10531053
# Verify pagination
10541054
assert total_all_page1 == 6 # Total count should still be total
1055+
assert total_all_page2 == 6
10551056
assert len(all_services_page1) == 2 # But only 2 items on first page
10561057
assert len(all_services_page2) == 2 # And 2 items on second page
10571058

0 commit comments

Comments
 (0)