Polytopia-ELO-Bot
Polytopia-ELO-Bot copied to clipboard
Using window functions for ranking
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.