From c601fcc2a4aa8b0a6733da60a0d90eaa20574be2 Mon Sep 17 00:00:00 2001 From: Untone Date: Wed, 7 Aug 2024 14:54:13 +0300 Subject: [PATCH] alc --- resolvers/reader.py | 76 +++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/resolvers/reader.py b/resolvers/reader.py index 3eec54e7..3f04dde4 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -23,6 +23,8 @@ from utils.logger import root_logger as logger from services.schema import query from services.search import search_text from services.viewed import ViewedStorage + + def query_shouts(): """ Базовый запрос для получения публикаций с подзапросами статистики, авторов и тем. @@ -32,44 +34,44 @@ def query_shouts(): # Создаем алиасы для таблиц для избежания конфликтов имен aliased_reaction = aliased(Reaction) - # Используем чистый SQL-запрос для подзапросов с уникальными значениями - authors_subquery = text(""" - SELECT - shout.id AS shout_id, - json_agg(distinct json_build_object( - 'id', author.id, - 'name', author.name, - 'slug', author.slug, - 'pic', author.pic - )) AS authors - FROM - author - JOIN - shout_author ON shout_author.author = author.id - JOIN - shout ON shout.id = shout_author.shout - GROUP BY - shout.id - """) + # Используем SQLAlchemy для подзапросов с уникальными значениями + authors_subquery = ( + select( + Shout.id.label("shout_id"), + func.json_agg( + distinct( + func.json_build_object( + 'id', Author.id, + 'name', Author.name, + 'slug', Author.slug, + 'pic', Author.pic + ) + ) + ).label("authors") + ) + .join(ShoutAuthor, ShoutAuthor.author == Author.id) + .group_by(Shout.id) + .subquery() + ) - topics_subquery = text(""" - SELECT - shout.id AS shout_id, - json_agg(distinct json_build_object( - 'id', topic.id, - 'title', topic.title, - 'body', topic.body, - 'slug', topic.slug - )) AS topics - FROM - topic - JOIN - shout_topic ON shout_topic.topic = topic.id - JOIN - shout ON shout.id = shout_topic.shout - GROUP BY - shout.id - """) + topics_subquery = ( + select( + Shout.id.label("shout_id"), + func.json_agg( + distinct( + func.json_build_object( + 'id', Topic.id, + 'title', Topic.title, + 'body', Topic.body, + 'slug', Topic.slug + ) + ) + ).label("topics") + ) + .join(ShoutTopic, ShoutTopic.topic == Topic.id) + .group_by(Shout.id) + .subquery() + ) # Основной запрос с использованием подзапросов q = (