author-stat-fix-8

This commit is contained in:
Untone 2024-03-28 23:59:26 +03:00
parent f8f3a32556
commit 4b5c101f2f

View File

@ -84,13 +84,11 @@ def add_author_stat_columns(q, with_rating=False):
) )
# Create a subquery for comments count # Create a subquery for comments count
select_list = [
Author.id,
func.coalesce(func.count(Reaction.id)).label('comments_count'),
]
sub_comments = ( sub_comments = (
select(*select_list) select(
Author.id,
func.coalesce(func.count(Reaction.id)).label('comments_count')
)
.outerjoin( .outerjoin(
Reaction, Reaction,
and_( and_(
@ -106,45 +104,28 @@ def add_author_stat_columns(q, with_rating=False):
q = q.outerjoin(sub_comments, Author.id == sub_comments.c.id) q = q.outerjoin(sub_comments, Author.id == sub_comments.c.id)
q = q.add_columns(sub_comments.c.comments_count) q = q.add_columns(sub_comments.c.comments_count)
if with_rating: q = q.outerjoin(AuthorRating, AuthorRating.author == Author.id)
# Create a subquery for ratings counters q = q.add_columns(
select_list = [
Author.id,
func.sum(case((AuthorRating.plus == true(), 1), else_=0)).label('likes_count'), func.sum(case((AuthorRating.plus == true(), 1), else_=0)).label('likes_count'),
func.sum(case((AuthorRating.plus != true(), 1), else_=0)).label('dislikes_count'), func.sum(case((AuthorRating.plus != true(), 1), else_=0)).label('dislikes_count'),
func.sum(case((and_(Reaction.kind == ReactionKind.LIKE.value, Shout.authors.any(id=Author.id)), 1), else_=0)).label('shouts_likes'), )
func.sum(case((and_(Reaction.kind == ReactionKind.DISLIKE.value, Shout.authors.any(id=Author.id)), 1), else_=0)).label('shouts_dislikes'),
]
sub_rating = ( if with_rating:
select(*select_list) subq = select(Reaction).where(
.outerjoin(
Reaction,
and_( and_(
Reaction.created_by == Author.id, Reaction.shout == Shout.id,
Shout.authors.any(id=Author.id),
Reaction.reply_to.is_(None), Reaction.reply_to.is_(None),
Reaction.deleted_at.is_(None), Reaction.deleted_at.is_(None)
),
) )
.group_by(Author.id) ).subquery()
.subquery()
) q = q.outerjoin(subq, subq.c.shout == Shout.id)
q = q.outerjoin(sub_rating, Author.id == sub_rating.c.id)
q = q.add_columns( q = q.add_columns(
sub_rating.c.likes_count, func.count(case((subq.c.kind == ReactionKind.LIKE.value, subq.c.id), else_=None)).label('shouts_likes'),
sub_rating.c.dislikes_count, func.count(case((subq.c.kind == ReactionKind.DISLIKE.value, subq.c.id), else_=None)).label('shouts_dislikes'),
sub_rating.c.shouts_likes,
sub_rating.c.shouts_dislikes,
) )
q = q.group_by(
Author.id,
sub_comments.c.comments_count,
sub_rating.c.likes_count,
sub_rating.c.dislikes_count,
sub_rating.c.shouts_likes,
sub_rating.c.shouts_dislikes,
)
else:
q = q.group_by( q = q.group_by(
Author.id, Author.id,
sub_comments.c.comments_count sub_comments.c.comments_count
@ -173,10 +154,10 @@ def get_with_stat(q, with_rating=False):
if is_author: if is_author:
stat['comments'] = cols[4] stat['comments'] = cols[4]
if with_rating: if with_rating:
logger.debug('author, shouts, authors, followers, comments, rating, rating_shouts') logger.debug('author, shouts, authors, followers, comments, author_likes, author_dislikes, shouts_likes, shouts_dislikes, comment_likes, comments_dislikes')
logger.debug(cols) logger.debug(cols)
stat['rating'] = cols[6] - cols[6] stat['rating'] = cols[6] - cols[7]
stat['rating_shouts'] = cols[7] - cols[8] stat['rating_shouts'] = cols[8] - cols[9]
entity.stat = stat entity.stat = stat
records.append(entity) records.append(entity)
except Exception as exc: except Exception as exc: