Skip to content

Commit d0e3c28

Browse files
committed
fix(games): respect last played sort order
1 parent bccbf61 commit d0e3c28

1 file changed

Lines changed: 18 additions & 13 deletions

File tree

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

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::database::dto::{
77
BatchOperationError, BatchOperationResult, InsertGameData, UpdateGameData,
88
};
99
use crate::entity::prelude::*;
10-
use crate::entity::{games, savedata};
10+
use crate::entity::{game_statistics, games, savedata};
1111
use sea_orm::sea_query::Expr;
1212
use sea_orm::*;
1313
use serde::{Deserialize, Serialize};
@@ -463,6 +463,19 @@ impl GamesRepository {
463463
.order_by_asc(games::Column::Id)
464464
}
465465

466+
/// 最近游玩排序:无游玩记录始终置末尾,升序按最近优先,降序按最久优先。
467+
fn apply_last_played_order(query: Select<Games>, sort_order: SortOrder) -> Select<Games> {
468+
let query = query.left_join(game_statistics::Entity).order_by(
469+
Expr::col(game_statistics::Column::LastPlayed).is_null(),
470+
Order::Asc,
471+
);
472+
match sort_order {
473+
SortOrder::Asc => query.order_by_desc(game_statistics::Column::LastPlayed),
474+
SortOrder::Desc => query.order_by_asc(game_statistics::Column::LastPlayed),
475+
}
476+
.order_by_asc(games::Column::Id)
477+
}
478+
466479
/// 应用层排序:按可选数值键排序,None 值统一置末尾
467480
///
468481
/// - `key_fn`:从游戏记录提取排序键,返回 `Option<K>`
@@ -595,13 +608,10 @@ impl GamesRepository {
595608
.await
596609
}
597610
SortOption::LastPlayed => {
598-
use crate::entity::game_statistics;
599-
Self::build_base_query(game_type)
611+
let query = Self::build_base_query(game_type)
600612
.select_only()
601-
.column(games::Column::Id)
602-
.left_join(game_statistics::Entity)
603-
.order_by(game_statistics::Column::LastPlayed, Order::Desc)
604-
.order_by_asc(games::Column::Id)
613+
.column(games::Column::Id);
614+
Self::apply_last_played_order(query, sort_order)
605615
.into_tuple::<i32>()
606616
.all(db)
607617
.await
@@ -618,8 +628,6 @@ impl GamesRepository {
618628
sort_order: SortOrder,
619629
language: Option<String>,
620630
) -> Result<Vec<games::Model>, DbErr> {
621-
use crate::entity::game_statistics;
622-
623631
match sort_option {
624632
SortOption::Addtime => {
625633
let mut query = Self::build_base_query(game_type);
@@ -635,10 +643,7 @@ impl GamesRepository {
635643
.await
636644
}
637645
SortOption::LastPlayed => {
638-
let query = Self::build_base_query(game_type).left_join(game_statistics::Entity);
639-
query
640-
.order_by(game_statistics::Column::LastPlayed, Order::Desc)
641-
.order_by_asc(games::Column::Id)
646+
Self::apply_last_played_order(Self::build_base_query(game_type), sort_order)
642647
.all(db)
643648
.await
644649
}

0 commit comments

Comments
 (0)