distinct
Some checks failed
Deploy on push / deploy (push) Failing after 8s

This commit is contained in:
Untone 2024-08-07 14:49:15 +03:00
parent 50f2c9d161
commit 1524f141b8

View File

@ -23,9 +23,6 @@ from utils.logger import root_logger as logger
from services.schema import query from services.schema import query
from services.search import search_text from services.search import search_text
from services.viewed import ViewedStorage from services.viewed import ViewedStorage
def query_shouts(): def query_shouts():
""" """
Базовый запрос для получения публикаций с подзапросами статистики, авторов и тем. Базовый запрос для получения публикаций с подзапросами статистики, авторов и тем.
@ -34,45 +31,47 @@ def query_shouts():
""" """
# Создаем алиасы для таблиц для избежания конфликтов имен # Создаем алиасы для таблиц для избежания конфликтов имен
aliased_reaction = aliased(Reaction) aliased_reaction = aliased(Reaction)
shout_author = aliased(ShoutAuthor)
shout_topic = aliased(ShoutTopic)
# Подзапросы для уникальных авторов и тем # Используем чистый SQL-запрос для подзапросов с уникальными значениями
authors_subquery = ( authors_subquery = text("""
select( SELECT
Shout.id.label("shout_id"), shout.id AS shout_id,
func.json_agg( json_agg(distinct json_build_object(
func.json_build_object( 'id', author.id,
"id", Author.id, 'name', author.name,
"name", Author.name, 'slug', author.slug,
"slug", Author.slug, 'pic', author.pic
"pic", Author.pic )) AS authors
) FROM
).label("authors") author
) JOIN
.join(shout_author, shout_author.author == Author.id) shout_author ON shout_author.author = author.id
.group_by(Shout.id) JOIN
.subquery() shout ON shout.id = shout_author.shout
) GROUP BY
shout.id
""")
topics_subquery = ( topics_subquery = text("""
select( SELECT
Shout.id.label("shout_id"), shout.id AS shout_id,
func.json_agg( json_agg(distinct json_build_object(
func.json_build_object( 'id', topic.id,
"id", Topic.id, 'title', topic.title,
"title", Topic.title, 'body', topic.body,
"body", Topic.body, 'slug', topic.slug
"slug", Topic.slug )) AS topics
) FROM
).label("topics") topic
) JOIN
.join(shout_topic, shout_topic.topic == Topic.id) shout_topic ON shout_topic.topic = topic.id
.group_by(Shout.id) JOIN
.subquery() shout ON shout.id = shout_topic.shout
) GROUP BY
shout.id
""")
# Основной запрос с подзапросами для получения статистики, авторов и тем # Основной запрос с использованием подзапросов
q = ( q = (
select( select(
Shout, Shout,
@ -97,7 +96,6 @@ def query_shouts():
return q, aliased_reaction return q, aliased_reaction
def get_shouts_with_stats(q, limit, offset=0, author_id=None): def get_shouts_with_stats(q, limit, offset=0, author_id=None):
""" """
Получение публикаций со статистикой, и подзапросами авторов и тем. Получение публикаций со статистикой, и подзапросами авторов и тем.