Exemple #1
0
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