From 72b9bb407d0567dd8eacd5e73c0ce4ecd3da27c3 Mon Sep 17 00:00:00 2001 From: Untone Date: Thu, 28 Mar 2024 15:38:14 +0300 Subject: [PATCH] compact-author-ratings --- resolvers/stat.py | 57 +++++++++-------------------------------------- 1 file changed, 11 insertions(+), 46 deletions(-) diff --git a/resolvers/stat.py b/resolvers/stat.py index acb44f9b..ef636747 100644 --- a/resolvers/stat.py +++ b/resolvers/stat.py @@ -1,6 +1,6 @@ import json -from sqlalchemy import func, distinct, select, join, and_, case, true, cast, Integer +from sqlalchemy import func, distinct, select, join, and_, case, true from sqlalchemy.orm import aliased from orm.reaction import Reaction, ReactionKind @@ -112,53 +112,18 @@ def add_author_stat_columns(q): def add_author_ratings(q): aliased_author = aliased(Author) + selection_list = [ + 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"), + ] ratings_subquery = ( - select( - [ - 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(*selection_list) .select_from(aliased_author) - .join(AuthorRating, cast(AuthorRating.author, Integer) == aliased_author.id) + .join(AuthorRating, AuthorRating.author == aliased_author.id) .outerjoin(Shout, Shout.authors.any(id=aliased_author.id)) .filter(Reaction.deleted_at.is_(None)) .group_by(aliased_author.id)