From 4b5c101f2f3bde879bd9ac721321e0d7b13d7932 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 28 Mar 2024 23:59:26 +0300 Subject: [PATCH] author-stat-fix-8 --- resolvers/stat.py | 77 ++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/resolvers/stat.py b/resolvers/stat.py index a5bf2e73..8eb05ca7 100644 --- a/resolvers/stat.py +++ b/resolvers/stat.py @@ -84,13 +84,11 @@ def add_author_stat_columns(q, with_rating=False): ) # Create a subquery for comments count - select_list = [ - Author.id, - func.coalesce(func.count(Reaction.id)).label('comments_count'), - ] - sub_comments = ( - select(*select_list) + select( + Author.id, + func.coalesce(func.count(Reaction.id)).label('comments_count') + ) .outerjoin( Reaction, and_( @@ -106,50 +104,33 @@ def add_author_stat_columns(q, with_rating=False): q = q.outerjoin(sub_comments, Author.id == sub_comments.c.id) q = q.add_columns(sub_comments.c.comments_count) - if with_rating: - # Create a subquery for ratings counters - 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('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'), - ] + q = q.outerjoin(AuthorRating, AuthorRating.author == Author.id) + q = q.add_columns( + func.sum(case((AuthorRating.plus == true(), 1), else_=0)).label('likes_count'), + func.sum(case((AuthorRating.plus != true(), 1), else_=0)).label('dislikes_count'), + ) - sub_rating = ( - select(*select_list) - .outerjoin( - Reaction, - and_( - Reaction.created_by == Author.id, - Reaction.reply_to.is_(None), - Reaction.deleted_at.is_(None), - ), + if with_rating: + subq = select(Reaction).where( + and_( + Reaction.shout == Shout.id, + Shout.authors.any(id=Author.id), + Reaction.reply_to.is_(None), + Reaction.deleted_at.is_(None) ) - .group_by(Author.id) - .subquery() - ) - q = q.outerjoin(sub_rating, Author.id == sub_rating.c.id) + ).subquery() + + q = q.outerjoin(subq, subq.c.shout == Shout.id) q = q.add_columns( - sub_rating.c.likes_count, - sub_rating.c.dislikes_count, - 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( - Author.id, - sub_comments.c.comments_count + func.count(case((subq.c.kind == ReactionKind.LIKE.value, subq.c.id), else_=None)).label('shouts_likes'), + func.count(case((subq.c.kind == ReactionKind.DISLIKE.value, subq.c.id), else_=None)).label('shouts_dislikes'), ) + q = q.group_by( + Author.id, + sub_comments.c.comments_count + ) + return q @@ -173,10 +154,10 @@ def get_with_stat(q, with_rating=False): if is_author: stat['comments'] = cols[4] 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) - stat['rating'] = cols[6] - cols[6] - stat['rating_shouts'] = cols[7] - cols[8] + stat['rating'] = cols[6] - cols[7] + stat['rating_shouts'] = cols[8] - cols[9] entity.stat = stat records.append(entity) except Exception as exc: