From d0b5c2d3f969229f780c487e89d9ed83bf805e82 Mon Sep 17 00:00:00 2001 From: Untone Date: Fri, 1 Nov 2024 22:01:41 +0300 Subject: [PATCH] psql5 --- resolvers/reader.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/resolvers/reader.py b/resolvers/reader.py index beae71b1..d0a1e9f7 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -65,9 +65,9 @@ def query_with_stat(info): # Основной запрос q = ( select(Shout) + .distinct(Shout.id) .where(and_(Shout.published_at.is_not(None), Shout.deleted_at.is_(None))) .join(Author, Author.id == Shout.created_by) - .group_by(Shout.id) ) # Создаем алиасы для всех таблиц @@ -319,23 +319,21 @@ async def get_shout(_, info, slug="", shout_id=0): def apply_sorting(q, options): """ - Применение сортировки к запросу. - - :param q: Исходный запрос. - :param options: Опции фильтрации и сортировки. - :return: Запрос с примененной сортировкой. + Применение сортировки к запросу с учетом DISTINCT ON. """ - # Определение поля для сортировки - order_str = options.get("order_by") + # Сначала создаем подзапрос с DISTINCT ON + subq = q.order_by(Shout.id).subquery() + + # Создаем новый запрос к подзапросу + q = select(subq) - # Проверка, требуется ли сортировка по одному из статистических полей + # Применяем нужную сортировку + order_str = options.get("order_by") if order_str in ["rating", "comments_count", "last_reacted_at"]: - # Сортировка по выбранному статистическому полю в указанном порядке query_order_by = desc(text(order_str)) if options.get("order_by_desc", True) else asc(text(order_str)) - # Применение сортировки с размещением NULL значений в конце q = q.order_by(nulls_last(query_order_by)) else: - q = q.order_by(Shout.published_at.desc()) + q = q.order_by(subq.c.published_at.desc()) return q