loadReactionsBy fix

This commit is contained in:
Igor Lobanov 2022-11-28 14:37:05 +01:00
parent 77d8e2f2fd
commit 7da187470a
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 = {