From a5f4e683c87314db5de650c7978a30e4e257681d Mon Sep 17 00:00:00 2001 From: prabinoid <38830224+prabinoid@users.noreply.github.com> Date: Wed, 9 Jul 2025 16:33:11 +0545 Subject: [PATCH 1/2] Ordering made deterministic to avoid redundancies during pagination --- backend/services/project_search_service.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/services/project_search_service.py b/backend/services/project_search_service.py index 9a37ece8eb..06380c6bbb 100644 --- a/backend/services/project_search_service.py +++ b/backend/services/project_search_service.py @@ -721,6 +721,10 @@ async def _filter_projects( order_by += " DESC" order_by_clause = f" ORDER BY {order_by}" + # For deterministic ordering and pagination consistency. + if order_by not in ("id", "p.id"): + order_by_clause += ", p.id DESC" + if filters: sql_query = base_query + " AND " + " AND ".join(filters) else: @@ -732,11 +736,8 @@ async def _filter_projects( page = search_dto.page per_page = 14 offset = (page - 1) * per_page - sql_query_paginated = sql_query + f" LIMIT {per_page} OFFSET {offset}" - # Get total count - count_query = f"SELECT COUNT(*) FROM ({sql_query}) AS count_subquery" - total_count = await db.fetch_val(count_query, values=params) - paginated_results = await db.fetch_all(sql_query_paginated, values=params) + total_count = len(all_results) + paginated_results = all_results[offset : offset + per_page] pagination_dto = Pagination.from_total_count(page, per_page, total_count) return all_results, paginated_results, pagination_dto From 87809b5a101b5291b8862de2922e8a9e6a32bdbd Mon Sep 17 00:00:00 2001 From: prabinoid <38830224+prabinoid@users.noreply.github.com> Date: Wed, 9 Jul 2025 17:42:13 +0545 Subject: [PATCH 2/2] Project list all results fetched only during csv generation and while displaying mapresults --- backend/services/project_search_service.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/backend/services/project_search_service.py b/backend/services/project_search_service.py index 06380c6bbb..299a4506a7 100644 --- a/backend/services/project_search_service.py +++ b/backend/services/project_search_service.py @@ -730,14 +730,25 @@ async def _filter_projects( else: sql_query = base_query sql_query += order_by_clause - all_results = await db.fetch_all(sql_query, values=params) - if as_csv: - return all_results + page = search_dto.page per_page = 14 offset = (page - 1) * per_page - total_count = len(all_results) - paginated_results = all_results[offset : offset + per_page] + all_results = [] + + if as_csv or not search_dto.omit_map_results: + all_results = await db.fetch_all(sql_query, values=params) + total_count = len(all_results) + paginated_results = all_results[offset : offset + per_page] + else: + count_query = f"SELECT COUNT(*) FROM ({sql_query}) as counted" + total_count = await db.fetch_val(count_query, values=params) + paginated_query = f"{sql_query} LIMIT {per_page} OFFSET {offset}" + paginated_results = await db.fetch_all(paginated_query, values=params) + + if as_csv: + return all_results + pagination_dto = Pagination.from_total_count(page, per_page, total_count) return all_results, paginated_results, pagination_dto