Merge pull request #52 from Discours/load-reactions

loadReactionsBy fix
This commit is contained in:
Tony 2022-11-28 16:40:00 +03:00 committed by GitHub
commit 3574068dbf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 24 deletions

View File

@ -1,6 +1,6 @@
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload, aliased
from sqlalchemy.sql.expression import desc, asc, select, case from sqlalchemy.sql.expression import desc, asc, select, case
from base.orm import local_session from base.orm import local_session
from base.resolvers import query from base.resolvers import query
@ -12,26 +12,27 @@ from services.stat.viewed import ViewedStorage
def calc_reactions(q): def calc_reactions(q):
return q.join(Reaction).add_columns( aliased_reaction = aliased(Reaction)
return q.join(aliased_reaction).add_columns(
sa.func.sum(case( sa.func.sum(case(
(Reaction.kind == ReactionKind.AGREE, 1), (aliased_reaction.kind == ReactionKind.AGREE, 1),
(Reaction.kind == ReactionKind.DISAGREE, -1), (aliased_reaction.kind == ReactionKind.DISAGREE, -1),
(Reaction.kind == ReactionKind.PROOF, 1), (aliased_reaction.kind == ReactionKind.PROOF, 1),
(Reaction.kind == ReactionKind.DISPROOF, -1), (aliased_reaction.kind == ReactionKind.DISPROOF, -1),
(Reaction.kind == ReactionKind.ACCEPT, 1), (aliased_reaction.kind == ReactionKind.ACCEPT, 1),
(Reaction.kind == ReactionKind.REJECT, -1), (aliased_reaction.kind == ReactionKind.REJECT, -1),
(Reaction.kind == ReactionKind.LIKE, 1), (aliased_reaction.kind == ReactionKind.LIKE, 1),
(Reaction.kind == ReactionKind.DISLIKE, -1), (aliased_reaction.kind == ReactionKind.DISLIKE, -1),
else_=0) else_=0)
).label('rating'), ).label('rating'),
sa.func.sum( sa.func.sum(
case( case(
(Reaction.body.is_not(None), 1), (aliased_reaction.body.is_not(None), 1),
else_=0 else_=0
) )
).label('commented'), ).label('commented'),
sa.func.sum( sa.func.sum(
Reaction.id aliased_reaction.id
).label('reacted') ).label('reacted')
) )

View File

@ -199,15 +199,6 @@ async def delete_reaction(_, info, rid):
session.commit() session.commit()
return {} return {}
def map_result_item(result_item):
[reaction, user, shout] = result_item
print(reaction)
reaction.createdBy = user
reaction.shout = shout
return reaction
@query.field("loadReactionsBy") @query.field("loadReactionsBy")
async def load_reactions_by(_, _info, by, limit=50, offset=0): async def load_reactions_by(_, _info, by, limit=50, offset=0):
""" """
@ -251,21 +242,24 @@ async def load_reactions_by(_, _info, by, limit=50, offset=0):
if by.get("days"): if by.get("days"):
after = datetime.now(tz=timezone.utc) - timedelta(days=int(by["days"]) or 30) after = datetime.now(tz=timezone.utc) - timedelta(days=int(by["days"]) or 30)
q = q.filter(Reaction.createdAt > after) q = q.filter(Reaction.createdAt > after)
order_way = asc if by.get("sort", "").startswith("-") else desc order_way = asc if by.get("sort", "").startswith("-") else desc
order_field = by.get("sort") or Reaction.createdAt order_field = by.get("sort") or Reaction.createdAt
q = q.group_by( q = q.group_by(
Reaction.id, CreatedByUser.id, ReactedShout.id Reaction.id, CreatedByUser.id, ReactedShout.id
).order_by( ).order_by(
order_way(order_field) order_way(order_field)
) )
q = calc_reactions(q) q = calc_reactions(q)
q = q.where(Reaction.deletedAt.is_(None)) q = q.where(Reaction.deletedAt.is_(None))
q = q.limit(limit).offset(offset) q = q.limit(limit).offset(offset)
reactions = [] reactions = []
with local_session() as session: with local_session() as session:
for [ for [reaction, user, shout, rating, commented, reacted] in session.execute(q):
[reaction, rating, commented, reacted], user, shout
] in list(map(map_result_item, session.execute(q))):
reaction.createdBy = user reaction.createdBy = user
reaction.shout = shout reaction.shout = shout
reaction.stat = { reaction.stat = {