Skip to content

Commit 3702e71

Browse files
committed
fixing queries
1 parent 47add77 commit 3702e71

File tree

1 file changed

+34
-22
lines changed
  • services/catalog/src/simcore_service_catalog/db/repositories

1 file changed

+34
-22
lines changed

services/catalog/src/simcore_service_catalog/db/repositories/services.py

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from models_library.users import UserID
1717
from psycopg2.errors import ForeignKeyViolation
1818
from pydantic import PositiveInt, TypeAdapter, ValidationError
19+
from simcore_postgres_database.utils import as_postgres_sql_query_str
1920
from simcore_postgres_database.utils_repos import pass_or_acquire_connection
2021
from simcore_postgres_database.utils_services import create_select_latest_services_query
2122
from sqlalchemy import sql
@@ -478,55 +479,66 @@ async def get_service_history_page(
478479
offset: int | None = None,
479480
) -> tuple[PositiveInt, list[ReleaseDBGet]]:
480481

481-
base_query = (
482+
base_subquery = (
483+
# Search on service (key, *) for (product_name, user_id w/ access)
482484
sql.select(
483485
services_meta_data.c.key,
484486
services_meta_data.c.version,
485-
services_meta_data.c.version_display,
486-
services_meta_data.c.deprecated,
487-
services_meta_data.c.created,
488-
services_compatibility.c.custom_policy.label(
489-
"compatibility_policy"
490-
), # CompatiblePolicyDict | None
491487
)
492488
.select_from(
493-
# joins because access-rights might change per version
494489
services_meta_data.join(
495490
services_access_rights,
496491
(services_meta_data.c.key == services_access_rights.c.key)
497492
& (
498493
services_meta_data.c.version == services_access_rights.c.version
499494
),
500-
)
501-
.join(
495+
).join(
502496
user_to_groups,
503497
(user_to_groups.c.gid == services_access_rights.c.gid),
504498
)
505-
.outerjoin(
506-
services_compatibility,
507-
(services_meta_data.c.key == services_compatibility.c.key)
508-
& (
509-
services_meta_data.c.version == services_compatibility.c.version
510-
),
511-
)
512499
)
513500
.where(
514501
(services_meta_data.c.key == key)
515502
& (services_access_rights.c.product_name == product_name)
516503
& (user_to_groups.c.uid == user_id)
517504
& AccessRightsClauses.can_read
518505
)
519-
.distinct()
520-
)
506+
).subquery()
521507

522-
subquery = base_query.subquery()
523-
count_query = sql.select(sql.func.count()).select_from(subquery)
508+
# Query to count the TOTAL number of rows
509+
count_query = sql.select(sql.func.count()).select_from(base_subquery)
510+
_logger.debug("count_query=\n%s", as_postgres_sql_query_str(count_query))
524511

512+
# Query to retrieve page with additional columns, ordering, offset, and limit
525513
page_query = (
526-
base_query.order_by(sql.desc(by_version(base_query.c.version)))
514+
sql.select(
515+
services_meta_data.c.key,
516+
services_meta_data.c.version,
517+
services_meta_data.c.version_display,
518+
services_meta_data.c.deprecated,
519+
services_meta_data.c.created,
520+
# CompatiblePolicyDict | None
521+
services_compatibility.c.custom_policy.label("compatibility_policy"),
522+
)
523+
.select_from(
524+
# NOTE: these joins are avoided in count_query
525+
base_subquery.join(
526+
services_meta_data,
527+
(base_subquery.c.key == services_meta_data.c.key)
528+
& (base_subquery.c.version == services_meta_data.c.version),
529+
).outerjoin(
530+
services_compatibility,
531+
(services_meta_data.c.key == services_compatibility.c.key)
532+
& (
533+
services_meta_data.c.version == services_compatibility.c.version
534+
),
535+
)
536+
)
537+
.order_by(sql.desc(by_version(services_meta_data.c.version)))
527538
.offset(offset)
528539
.limit(limit)
529540
)
541+
_logger.debug("page_query=\n%s", as_postgres_sql_query_str(page_query))
530542

531543
async with pass_or_acquire_connection(self.db_engine) as conn:
532544
total_count: PositiveInt = await conn.scalar(count_query) or 0

0 commit comments

Comments
 (0)