unrated-sort-fix
Some checks failed
Deploy on push / deploy (push) Failing after 9s

This commit is contained in:
Untone 2024-10-31 17:47:07 +03:00
parent eaa23134de
commit f437119711

View File

@ -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)