From 2e635abe5ea9d5f1083b68aa50449ede8e9d21f9 Mon Sep 17 00:00:00 2001 From: Untone Date: Sun, 25 Feb 2024 17:49:15 +0300 Subject: [PATCH] sql-text-fix-order --- resolvers/author.py | 6 +++--- resolvers/reaction.py | 4 ++-- resolvers/reader.py | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resolvers/author.py b/resolvers/author.py index f480f6e6..9951fc52 100644 --- a/resolvers/author.py +++ b/resolvers/author.py @@ -1,7 +1,7 @@ import json import time -from sqlalchemy import desc, select, or_, and_ +from sqlalchemy import select, or_, and_, text from sqlalchemy.orm import aliased from sqlalchemy_searchable import search @@ -106,8 +106,8 @@ def load_authors_by(_, _info, by, limit, offset): q = q.filter(Author.created_at > before) order = by.get('order') - if order == 'followers' or order == 'shouts': - q = q.order_by(desc(f'{order}_stat')) + if order in ['likes', 'shouts', 'followers']: + q = q.order_by(text(f'{order}_stat')) q = q.limit(limit).offset(offset) diff --git a/resolvers/reaction.py b/resolvers/reaction.py index be407b5a..b15b760f 100644 --- a/resolvers/reaction.py +++ b/resolvers/reaction.py @@ -36,7 +36,7 @@ def add_reaction_stat_columns(q, aliased_reaction): (aliased_reaction.kind != str(ReactionKind.COMMENT.value), None), else_=aliased_reaction.created_at, ) - ).label('last_comment'), + ).label('last_comment_stat'), ) return q @@ -445,7 +445,7 @@ async def reacted_shouts_updates(follower_id: int, limit=50, offset=0) -> List[S # Sort shouts by the `last_comment` field combined_query = ( - union(q1, q2).order_by(desc('last_comment')).limit(limit).offset(offset) + union(q1, q2).order_by(desc('last_comment_stat')).limit(limit).offset(offset) ) results = session.execute(combined_query).scalars() diff --git a/resolvers/reader.py b/resolvers/reader.py index deb549c2..49c1d9e0 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -144,9 +144,9 @@ async def load_shouts_by(_, _info, options): # order order_by = Shout.featured_at if filters.get('featured') else Shout.published_at - order_by_str = options.get('order_by') - if order_by_str: - order_by = text(order_by_str) + order_str = options.get('order_by') + if order_str in ['likes', 'shouts', 'followers', 'comments', 'last_comment']: + q = q.order_by(text(f'{order_str}_stat')) query_order_by = ( desc(order_by) if options.get('order_by_desc', True) else asc(order_by) )