def get_featured_comments_for_assets(asset_ids, no_of_comments=1): # Calculate the ranked comments per asset as a separate "table". CommentAlias = Comment.alias() subquery = CommentAlias.select( CommentAlias.id, fn.RANK().over(partition_by=[CommentAlias.asset], order_by=[ CommentAlias.editors_pick.desc(), CommentAlias.parent.asc(), CommentAlias.created.desc() ]).alias('rnk')).where( CommentAlias.asset_id << asset_ids).alias('subq') comments = Comment.select(Comment).join(Asset).where( Comment.asset_id << asset_ids).switch(Comment).join( subquery, on=((subquery.c.id == Comment.id) & (subquery.c.rnk <= no_of_comments))).execute() asset2comments = {} for comment in comments: if comment.asset_id not in asset2comments: asset2comments[comment.asset_id] = [] asset2comments[comment.asset_id].append(comment.to_dict()) return asset2comments