From fc0e4bb2df89e3d474b05ee51127553c06961cd7 Mon Sep 17 00:00:00 2001 From: Untone Date: Sun, 25 Feb 2024 13:54:28 +0300 Subject: [PATCH] aliased-fix --- resolvers/reader.py | 2 -- resolvers/stat.py | 44 +++++++++++++++++++------------------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/resolvers/reader.py b/resolvers/reader.py index ff7cffff..ff4b558a 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -431,9 +431,7 @@ async def load_shouts_random_top(_, _info, options): func.sum( case( (Reaction.kind == str(ReactionKind.LIKE.value), 1), - (Reaction.kind == str(ReactionKind.AGREE.value), 1), (Reaction.kind == str(ReactionKind.DISLIKE.value), -1), - (Reaction.kind == str(ReactionKind.DISAGREE.value), -1), else_=0, ) ) diff --git a/resolvers/stat.py b/resolvers/stat.py index a2202f18..e1ec16aa 100644 --- a/resolvers/stat.py +++ b/resolvers/stat.py @@ -69,40 +69,34 @@ def add_author_stat_columns(q): def add_author_ratings(q): + aliased_author = aliased(Author) ratings_subquery = ( select([ - Author.id, - func.count().filter( - and_( - Reaction.created_by == Author.id, - Reaction.kind == ReactionKind.COMMENT.value, - Reaction.deleted_at.is_(None), - ) - ).label('comments_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((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') + aliased_author.id.label('author_id'), + func.count().filter(and_( + Reaction.created_by == aliased_author.id, + Reaction.kind == ReactionKind.COMMENT.value, + Reaction.deleted_at.is_(None), + )).label('comments_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((and_(Reaction.kind == ReactionKind.LIKE.value, Shout.authors.any(id=aliased_author.id)), 1), else_=0)).label('shouts_likes'), + func.sum(case((and_(Reaction.kind == ReactionKind.DISLIKE.value, Shout.authors.any(id=aliased_author.id)), 1), else_=0)).label('shouts_dislikes') ]) - .select_from(Author) - .join(AuthorRating, AuthorRating.author == Author.id) - .outerjoin(Shout, Shout.authors.any(id=Author.id)) + .select_from(aliased_author) + .join(AuthorRating, AuthorRating.author == aliased_author.id) + .outerjoin(Shout, Shout.authors.any(id=aliased_author.id)) .filter( Reaction.deleted_at.is_(None) ) - .group_by(Author.id) + .group_by(aliased_author.id) .alias('ratings_subquery') ) - return q.join(ratings_subquery, Author.id == ratings_subquery.c.author_id) + q = q.join(ratings_subquery, Author.id == ratings_subquery.c.author_id) + + return q + def get_with_stat(q):