Skip to content

Commit 04d2a1d

Browse files
committed
fix(games): keep missing release dates last
1 parent ccb0c1e commit 04d2a1d

1 file changed

Lines changed: 19 additions & 12 deletions

File tree

src-tauri/src/database/repository/games_repository.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::database::dto::{
88
};
99
use crate::entity::prelude::*;
1010
use crate::entity::{games, savedata};
11+
use sea_orm::sea_query::Expr;
1112
use sea_orm::*;
1213
use serde::{Deserialize, Serialize};
1314
use std::collections::HashSet;
@@ -452,6 +453,16 @@ impl GamesRepository {
452453
query
453454
}
454455

456+
/// 发行日期排序:无日期的游戏始终置末尾,升序/降序只影响非空日期。
457+
fn apply_date_order(query: Select<Games>, sort_order: SortOrder) -> Select<Games> {
458+
let query = query.order_by(Expr::col(games::Column::Date).is_null(), Order::Asc);
459+
match sort_order {
460+
SortOrder::Asc => query.order_by_asc(games::Column::Date),
461+
SortOrder::Desc => query.order_by_desc(games::Column::Date),
462+
}
463+
.order_by_asc(games::Column::Id)
464+
}
465+
455466
/// 应用层排序:按可选数值键排序,None 值统一置末尾
456467
///
457468
/// - `key_fn`:从游戏记录提取排序键,返回 `Option<K>`
@@ -575,14 +586,13 @@ impl GamesRepository {
575586
query.into_tuple::<i32>().all(db).await
576587
}
577588
SortOption::Datetime => {
578-
let mut query = Self::build_base_query(game_type)
589+
let query = Self::build_base_query(game_type)
579590
.select_only()
580591
.column(games::Column::Id);
581-
query = match sort_order {
582-
SortOrder::Asc => query.order_by_asc(games::Column::Date),
583-
SortOrder::Desc => query.order_by_desc(games::Column::Date),
584-
};
585-
query.into_tuple::<i32>().all(db).await
592+
Self::apply_date_order(query, sort_order)
593+
.into_tuple::<i32>()
594+
.all(db)
595+
.await
586596
}
587597
SortOption::LastPlayed => {
588598
use crate::entity::game_statistics;
@@ -620,12 +630,9 @@ impl GamesRepository {
620630
query.all(db).await
621631
}
622632
SortOption::Datetime => {
623-
let mut query = Self::build_base_query(game_type);
624-
query = match sort_order {
625-
SortOrder::Asc => query.order_by_asc(games::Column::Date),
626-
SortOrder::Desc => query.order_by_desc(games::Column::Date),
627-
};
628-
query.all(db).await
633+
Self::apply_date_order(Self::build_base_query(game_type), sort_order)
634+
.all(db)
635+
.await
629636
}
630637
SortOption::LastPlayed => {
631638
let query = Self::build_base_query(game_type).left_join(game_statistics::Entity);

0 commit comments

Comments
 (0)