Skip to content

Commit 4d60b77

Browse files
committed
hotfix: ranks module using wrong map leaderboard
* The ranks module was using the `global_[event_]records` SQL views to compare with the Redis leaderboard to, fetch the rank of a player on a map. However, when retrieving the rank of a player not in an event context, it uses the `global_records` SQL view. This view doesn't show records made on a map made specifically for an event (e.g. the Benchmark version of a map in the Benchmark 2 event). Thus, when retrieving the rank of a player not in an event context, but for a Benchmark version of a map, it was always seeing an empty leaderboard, because of the SQL view that is used. The fix is simply to not use these views, but to fetch the records from the `records` SQL table directly, and grouping by the player. * Change an `if let` to a `match` expression. Refs: d64657c, e85754c, 6383979
1 parent 0a985e3 commit 4d60b77

File tree

4 files changed

+33
-55
lines changed

4 files changed

+33
-55
lines changed

crates/game_api/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "game-api"
3-
version = "1.3.4"
3+
version = "1.3.5"
44
edition = "2024"
55

66
[lib]

crates/game_api/src/http/player_finished.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -191,17 +191,14 @@ pub async fn finished<C: ConnectionTrait + StreamTrait>(
191191

192192
let old_record = get_old_record(conn, player_id, map.id, params.event).await?;
193193

194-
let (old, new, has_improved, old_rank) = if let Some(records::Model { time: old, .. }) =
195-
old_record
196-
{
197-
(
194+
let (old, new, has_improved, old_rank) = match old_record {
195+
Some(records::Model { time: old, .. }) => (
198196
old,
199197
params.body.time,
200198
params.body.time < old,
201199
Some(ranks::get_rank(conn, redis_conn, map.id, player_id, old, params.event).await?),
202-
)
203-
} else {
204-
(params.body.time, params.body.time, true, None)
200+
),
201+
None => (params.body.time, params.body.time, true, None),
205202
};
206203

207204
let event = params.event;

crates/records_lib/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "records-lib"
3-
version = "1.3.3"
3+
version = "1.3.4"
44
edition = "2024"
55

66
[dependencies]

crates/records_lib/src/ranks.rs

Lines changed: 27 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,12 @@ use crate::{
6363
redis_key::{MapKey, map_key},
6464
};
6565
use deadpool_redis::redis::{self, AsyncCommands};
66-
use entity::{event_edition_records, global_event_records, global_records, records};
67-
use futures::{StreamExt, TryStreamExt};
66+
use entity::{event_edition_records, records};
67+
use futures::TryStreamExt;
6868
use sea_orm::{
69-
ColumnTrait as _, ConnectionTrait, EntityTrait, FromQueryResult, Order, PaginatorTrait,
70-
QueryFilter as _, QuerySelect, StreamTrait,
71-
prelude::Expr,
72-
sea_query::{Query, SelectStatement},
69+
ColumnTrait as _, ConnectionTrait, EntityTrait, Order, PaginatorTrait, QueryFilter as _,
70+
QueryOrder as _, QuerySelect, QueryTrait as _, SelectModel, Selector, StreamTrait,
71+
sea_query::expr,
7372
};
7473

7574
use std::{
@@ -286,32 +285,26 @@ pub struct DbLeaderboardItem {
286285
pub time: i32,
287286
}
288287

289-
fn get_mariadb_lb_query(map_id: u32, event: OptEvent<'_>) -> SelectStatement {
290-
let mut query = Query::select();
291-
query
292-
.order_by_expr(Expr::col(("r", records::Column::Time)).into(), Order::Asc)
293-
.order_by_expr(
294-
Expr::col(("r", records::Column::RecordPlayerId)).into(),
295-
Order::Asc,
296-
)
297-
.expr(Expr::col(("r", records::Column::RecordPlayerId)))
298-
.expr(Expr::col(("r", records::Column::Time)))
299-
.and_where(Expr::col(("r", records::Column::MapId)).eq(map_id));
300-
301-
match event.get() {
302-
Some((ev, ed)) => {
303-
query.from_as(global_event_records::Entity, "r").and_where(
304-
Expr::col(("r", global_event_records::Column::EventId))
288+
fn get_mariadb_lb_query(
289+
map_id: u32,
290+
event: OptEvent<'_>,
291+
) -> Selector<SelectModel<DbLeaderboardItem>> {
292+
records::Entity::find()
293+
.filter(records::Column::MapId.eq(map_id))
294+
.group_by(records::Column::RecordPlayerId)
295+
.order_by(records::Column::Time, Order::Asc)
296+
.order_by(records::Column::RecordPlayerId, Order::Asc)
297+
.apply_if(event.get(), |builder, (ev, ed)| {
298+
builder.reverse_join(event_edition_records::Entity).filter(
299+
event_edition_records::Column::EventId
305300
.eq(ev.id)
306-
.and(Expr::col(("r", global_event_records::Column::EditionId)).eq(ed.id)),
307-
);
308-
}
309-
None => {
310-
query.from_as(global_records::Entity, "r");
311-
}
312-
}
313-
314-
query
301+
.and(event_edition_records::Column::EditionId.eq(ed.id)),
302+
)
303+
})
304+
.select_only()
305+
.column(records::Column::RecordPlayerId)
306+
.column_as(expr::Expr::col(records::Column::Time).min(), "time")
307+
.into_model()
315308
}
316309

317310
async fn force_update_locked<C: ConnectionTrait + StreamTrait>(
@@ -327,13 +320,9 @@ async fn force_update_locked<C: ConnectionTrait + StreamTrait>(
327320

328321
pipe.del(&key);
329322

330-
let stmt = conn
331-
.get_database_backend()
332-
.build(&get_mariadb_lb_query(map_id, event));
333-
334-
conn.stream(stmt)
323+
get_mariadb_lb_query(map_id, event)
324+
.stream(conn)
335325
.await?
336-
.map(|res| res.and_then(|result| DbLeaderboardItem::from_query_result(&result, "")))
337326
.map_ok(|item| {
338327
pipe.zadd(&key, item.record_player_id, item.time);
339328
})
@@ -423,15 +412,7 @@ async fn get_rank_failed<C: ConnectionTrait>(
423412
) -> RecordsResult<RecordsError> {
424413
let key = &map_key(map_id, event);
425414
let redis_lb: Vec<i64> = redis_conn.zrange_withscores(key, 0, -1).await?;
426-
let mariadb_lb = conn
427-
.get_database_backend()
428-
.build(&get_mariadb_lb_query(map_id, event));
429-
let mariadb_lb = conn
430-
.query_all(mariadb_lb)
431-
.await?
432-
.into_iter()
433-
.map(|result| DbLeaderboardItem::from_query_result(&result, ""))
434-
.collect::<Result<Vec<_>, _>>()?;
415+
let mariadb_lb = get_mariadb_lb_query(map_id, event).all(conn).await?;
435416

436417
Err(RecordsError::RankCompute(RankComputeError {
437418
inner: Arc::new(RankComputeErrorInner {

0 commit comments

Comments
 (0)