Polytopia-ELO-Bot icon indicating copy to clipboard operation
Polytopia-ELO-Bot copied to clipboard

Using window functions for ranking

Open davidfdriscoll opened this issue 4 years ago • 0 comments

This is an attempt to rewrite the leaderboard_rank method from DiscordMember:

def my_dm_leaderboard_rank(discordmember, date_cutoff):
    query = my_leaderboard(date_cutoff)

    r = (Select(columns=[query.c.id, query.c.elo, fn.rank().over(order_by=[query.c.elo.desc()]).alias('ranked')])
    .from_(query))

    rank = Select(columns=[r.c.ranked]).from_(r).where(r.c.id == discordmember.id).bind(db).get()

    return(rank.get('ranked'), query.count())

Note that for this function to work, you need to explicitly select 'DiscordMember.id, elo_field' in leaderboard, as follows

query = DiscordMember.select(DiscordMember.id, elo_field).join(Player).join(Lineup).join(Game).where(
    (Game.is_completed == 1) & (Game.date > date_cutoff) & (Game.is_ranked == 1) & (DiscordMember.is_banned == 0)
).distinct().order_by(-elo_field)

It's no faster though than the current method: 214 ms for current method, 210 ms for this one.

davidfdriscoll avatar Jul 17 '20 23:07 davidfdriscoll