compact-author-ratings
All checks were successful
Deploy on push / deploy (push) Successful in 22s

This commit is contained in:
Untone 2024-03-28 15:38:14 +03:00
parent 1eb3d54dd0
commit 72b9bb407d

View File

@ -1,6 +1,6 @@
import json 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 sqlalchemy.orm import aliased
from orm.reaction import Reaction, ReactionKind from orm.reaction import Reaction, ReactionKind
@ -112,53 +112,18 @@ def add_author_stat_columns(q):
def add_author_ratings(q): def add_author_ratings(q):
aliased_author = aliased(Author) aliased_author = aliased(Author)
ratings_subquery = ( selection_list = [
select(
[
aliased_author.id.label("author_id"), aliased_author.id.label("author_id"),
func.count() func.count().filter(and_(Reaction.created_by == aliased_author.id,Reaction.kind == ReactionKind.COMMENT.value,Reaction.deleted_at.is_(None))).label("comments_count"),
.filter( func.sum(case((AuthorRating.plus == true(), 1), else_=0)).label("likes_count"),
and_( func.sum(case((AuthorRating.plus != true(), 1), else_=0)).label("dislikes_count"),
Reaction.created_by == aliased_author.id, func.sum(case((and_(Reaction.kind == ReactionKind.LIKE.value,Shout.authors.any(id=aliased_author.id)),1),else_=0)).label("shouts_likes"),
Reaction.kind == ReactionKind.COMMENT.value, func.sum(case((and_(Reaction.kind == ReactionKind.DISLIKE.value,Shout.authors.any(id=aliased_author.id)),1),else_=0)).label("shouts_dislikes"),
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(*selection_list)
.select_from(aliased_author) .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)) .outerjoin(Shout, Shout.authors.any(id=aliased_author.id))
.filter(Reaction.deleted_at.is_(None)) .filter(Reaction.deleted_at.is_(None))
.group_by(aliased_author.id) .group_by(aliased_author.id)