This commit is contained in:
parent
eaa23134de
commit
f437119711
|
@ -515,29 +515,41 @@ async def load_shouts_search(_, _info, text, limit=50, offset=0):
|
||||||
async def load_shouts_unrated(_, info, limit: int = 50, offset: int = 0):
|
async def load_shouts_unrated(_, info, limit: int = 50, offset: int = 0):
|
||||||
"""
|
"""
|
||||||
Загрузка публикаций с наименьшим количеством оценок.
|
Загрузка публикаций с наименьшим количеством оценок.
|
||||||
|
|
||||||
:param info: Информация о контексте GraphQL.
|
|
||||||
:param limit: Максимальное количество результатов.
|
|
||||||
:param offset: Смещение для пагинации.
|
|
||||||
:return: Список публикаций с минимальным количеством оценок.
|
|
||||||
"""
|
"""
|
||||||
q, aliased_reaction = query_shouts()
|
rating_reaction = aliased(Reaction, name="rating_reaction")
|
||||||
|
|
||||||
q = (
|
# Подзапрос для подсчета количества оценок (лайков и дизлайков)
|
||||||
q.outerjoin(
|
ratings_count = (
|
||||||
aliased_reaction,
|
select(func.count(distinct(rating_reaction.id)))
|
||||||
|
.select_from(rating_reaction)
|
||||||
|
.where(
|
||||||
and_(
|
and_(
|
||||||
aliased_reaction.shout == Shout.id,
|
rating_reaction.shout == Shout.id,
|
||||||
aliased_reaction.reply_to.is_(None),
|
rating_reaction.reply_to.is_(None),
|
||||||
aliased_reaction.kind.in_([ReactionKind.LIKE.value, ReactionKind.DISLIKE.value]),
|
rating_reaction.deleted_at.is_(None),
|
||||||
),
|
rating_reaction.kind.in_([ReactionKind.LIKE.value, ReactionKind.DISLIKE.value])
|
||||||
|
)
|
||||||
)
|
)
|
||||||
.filter(Shout.deleted_at.is_(None))
|
.correlate(Shout)
|
||||||
.filter(Shout.published_at.is_not(None))
|
.scalar_subquery()
|
||||||
|
.label("ratings_count")
|
||||||
)
|
)
|
||||||
|
|
||||||
q = q.having(func.count(distinct(aliased_reaction.id)) <= 4) # 3 или менее голосов
|
q, _ = query_shouts()
|
||||||
q = q.order_by(func.random())
|
|
||||||
|
# Добавляем подсчет рейтингов в основной запрос
|
||||||
|
q = q.add_columns(ratings_count)
|
||||||
|
|
||||||
|
# Фильтруем только опубликованные и не удаленные публикации
|
||||||
|
q = q.filter(
|
||||||
|
and_(
|
||||||
|
Shout.deleted_at.is_(None),
|
||||||
|
Shout.published_at.is_not(None)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Сортируем по количеству оценок (по возрастанию) и случайно среди равных
|
||||||
|
q = q.order_by(ratings_count.asc(), func.random())
|
||||||
|
|
||||||
return get_shouts_with_stats(q, limit, offset=offset)
|
return get_shouts_with_stats(q, limit, offset=offset)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user