From c41ae4ba98b2f99b554529acecd3d0f24f5743cb Mon Sep 17 00:00:00 2001 From: Untone Date: Fri, 1 Mar 2024 09:56:36 +0300 Subject: [PATCH] comments-stat-subquery --- resolvers/stat.py | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/resolvers/stat.py b/resolvers/stat.py index 7f66e835..50af415d 100644 --- a/resolvers/stat.py +++ b/resolvers/stat.py @@ -57,38 +57,31 @@ def add_author_stat_columns(q): aliased_author_followers = aliased(AuthorFollower) # aliased_reaction = aliased(Reaction) - q = ( - q.outerjoin(aliased_shout_author, aliased_shout_author.author == Author.id) - .add_columns( - func.count(distinct(aliased_shout_author.shout)).label('shouts_stat') - ) + q = q.outerjoin(aliased_shout_author, aliased_shout_author.author == Author.id) + q = q.add_columns(func.count(distinct(aliased_shout_author.shout)).label('shouts_stat')) - .outerjoin(aliased_author_authors, aliased_author_authors.follower == Author.id) - .add_columns( - func.count(distinct(aliased_author_authors.author)).label('authors_stat') - ) + q = q.outerjoin(aliased_author_authors, aliased_author_authors.follower == Author.id) + q = q.add_columns(func.count(distinct(aliased_author_authors.author)).label('authors_stat')) - .outerjoin( - aliased_author_followers, aliased_author_followers.author == Author.id - ) - .add_columns( - func.count(distinct(aliased_author_followers.follower)).label( - 'followers_stat' - ) + q = q.outerjoin(aliased_author_followers, aliased_author_followers.author == Author.id) + q = q.add_columns(func.count(distinct(aliased_author_followers.follower)).label('followers_stat')) + + # Create a subquery for comments count + subquery = ( + select(Reaction.created_by, func.count(Reaction.id).label('comments_stat')) + .filter( + and_( + Reaction.kind == ReactionKind.COMMENT.value, + Reaction.deleted_at.is_(None), + ) ) + .group_by(Reaction.created_by) + .subquery() ) - # .outerjoin( - # aliased_reaction, - # and_( - # aliased_reaction.created_by == Author.id, - # aliased_reaction.kind == ReactionKind.COMMENT.value, - # aliased_reaction.deleted_at.is_(None), - # ), - # ) - # .add_columns( - # func.count(distinct(aliased_reaction.id)).label('comments_stat') - # ) + q = q.outerjoin(subquery, subquery.c.created_by == Author.id) + q = q.add_columns(subquery.c.comments_count) + q = q.group_by(Author.id) return q