def get_playlist_repost_intersection_users(repost_playlist_id, follower_user_id): users = [] db = get_db_read_replica() with db.scoped_session() as session: # ensure playlist_id exists playlist_entry = (session.query(Playlist).filter( Playlist.playlist_id == repost_playlist_id, Playlist.is_current == True).first()) if playlist_entry is None: raise exceptions.NotFoundError( "Resource not found for provided playlist id") query = session.query(User).filter( User.is_current == True, User.user_id.in_( session.query(Repost.user_id).filter( Repost.repost_item_id == repost_playlist_id, Repost.repost_type != RepostType.track, Repost.is_current == True, Repost.is_delete == False, ).intersect( session.query(Follow.followee_user_id).filter( Follow.follower_user_id == follower_user_id, Follow.is_current == True, Follow.is_delete == False, ))), ) users = paginate_query(query).all() users = helpers.query_result_to_list(users) return users
def get_reposters_for_track(args): user_results = [] current_user_id = args.get('current_user_id') repost_track_id = args.get('repost_track_id') limit = args.get('limit') offset = args.get('offset') db = get_db_read_replica() with db.scoped_session() as session: # Ensure Track exists for provided repost_track_id. track_entry = session.query(Track).filter( Track.track_id == repost_track_id, Track.is_current == True).first() if track_entry is None: raise exceptions.NotFoundError( 'Resource not found for provided track id') # Subquery to get all (user_id, follower_count) entries from Follows table. follower_count_subquery = (session.query( Follow.followee_user_id, func.count(Follow.followee_user_id).label( response_name_constants.follower_count)).filter( Follow.is_current == True, Follow.is_delete == False).group_by( Follow.followee_user_id).subquery()) # Get all Users that reposted track, ordered by follower_count desc & paginated. query = ( session.query( User, # Replace null values from left outer join with 0 to ensure sort works correctly. (func.coalesce(follower_count_subquery.c.follower_count, 0) ).label(response_name_constants.follower_count)) # Left outer join to associate users with their follower count. .outerjoin( follower_count_subquery, follower_count_subquery.c.followee_user_id == User.user_id).filter( User.is_current == True, # Only select users that reposted given track. User.user_id.in_( session.query(Repost.user_id).filter( Repost.repost_item_id == repost_track_id, Repost.repost_type == RepostType.track, Repost.is_current == True, Repost.is_delete == False) )).order_by(desc(response_name_constants.follower_count))) user_results = add_query_pagination(query, limit, offset).all() # Fix format to return only Users objects with follower_count field. if user_results: users, _ = zip(*user_results) user_results = helpers.query_result_to_list(users) # bundle peripheral info into user results user_ids = [user['user_id'] for user in user_results] user_results = populate_user_metadata(session, user_ids, user_results, current_user_id) return user_results
def get_reposters_for_playlist(args): user_results = [] current_user_id = args.get("current_user_id") repost_playlist_id = args.get("repost_playlist_id") limit = args.get("limit") offset = args.get("offset") db = get_db_read_replica() with db.scoped_session() as session: # Ensure Playlist exists for provided repost_playlist_id. playlist_entry = (session.query(Playlist).filter( Playlist.playlist_id == repost_playlist_id, Playlist.is_current == True).first()) if playlist_entry is None: raise exceptions.NotFoundError( "Resource not found for provided playlist id") # Get all Users that reposted Playlist, ordered by follower_count desc & paginated. query = ( session.query( User, # Replace null values from left outer join with 0 to ensure sort works correctly. (func.coalesce(AggregateUser.follower_count, 0) ).label(response_name_constants.follower_count), ) # Left outer join to associate users with their follower count. .outerjoin(AggregateUser, AggregateUser.user_id == User.user_id). filter( User.is_current == True, # Only select users that reposted given playlist. User.user_id.in_( session.query(Repost.user_id).filter( Repost.repost_item_id == repost_playlist_id, # Select Reposts for Playlists and Albums (i.e. not Tracks). Repost.repost_type != RepostType.track, Repost.is_current == True, Repost.is_delete == False, )), ).order_by(desc(response_name_constants.follower_count))) user_results = add_query_pagination(query, limit, offset).all() # Fix format to return only Users objects with follower_count field. if user_results: users, _ = zip(*user_results) user_results = helpers.query_result_to_list(users) # bundle peripheral info into user results user_ids = [user["user_id"] for user in user_results] user_results = populate_user_metadata(session, user_ids, user_results, current_user_id) return user_results
def get_savers_for_track(save_track_id): user_results = [] db = get_db_read_replica() with db.scoped_session() as session: # Ensure Track exists for provided save_track_id. track_entry = session.query(Track).filter( Track.track_id == save_track_id, Track.is_current == True).first() if track_entry is None: raise exceptions.NotFoundError( 'Resource not found for provided track id') # Subquery to get all (user_id, follower_count) entries from Follows table. follower_count_subquery = (session.query( Follow.followee_user_id, func.count(Follow.followee_user_id).label( response_name_constants.follower_count)).filter( Follow.is_current == True, Follow.is_delete == False).group_by( Follow.followee_user_id).subquery()) # Get all Users that saved track, ordered by follower_count desc & paginated. query = ( session.query( User, # Replace null values from left outer join with 0 to ensure sort works correctly. (func.coalesce(follower_count_subquery.c.follower_count, 0) ).label(response_name_constants.follower_count)) # Left outer join to associate users with their follower count. .outerjoin( follower_count_subquery, follower_count_subquery.c.followee_user_id == User.user_id).filter( User.is_current == True, # Only select users that saved given track. User.user_id.in_( session.query(Save.user_id).filter( Save.save_item_id == save_track_id, Save.save_type == SaveType.track, Save.is_current == True, Save.is_delete == False) )).order_by(desc(response_name_constants.follower_count))) user_results = paginate_query(query).all() # Fix format to return only Users objects with follower_count field. if user_results: users, follower_counts = zip(*user_results) user_results = helpers.query_result_to_list(users) for i, user in enumerate(user_results): user[response_name_constants. follower_count] = follower_counts[i] return user_results