This commit is contained in:
parent
50f2c9d161
commit
1524f141b8
|
@ -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):
|
||||||
"""
|
"""
|
||||||
Получение публикаций со статистикой, и подзапросами авторов и тем.
|
Получение публикаций со статистикой, и подзапросами авторов и тем.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user