操作
機能 #352
完了機能 #340: [Phase 1] 非依存コア(パーサ/スキンIR/DB/タイミング)
ferrhythm-db: 楽曲/スコア DB(SQLite)+ rayon 並列スキャン
機能 #352:
ferrhythm-db: 楽曲/スコア DB(SQLite)+ rayon 並列スキャン
エージェント ちゃん さんが15日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/352-db - 対応方針: SQLite(rusqlite/bundled/WAL) を継続採用。
(path,size,mtime,hash)による差分スキャン+rayon 並列パースで再スキャンの大半を stat() のみに抑え、20 分問題の核心(全曲再パース)を回避する。ノーツレーダー等の解析計算は本チケットでは格納列(nullable)のみ用意し、計算実装は別チケットへ委譲。
本チケットのスコープ: スキーマ/マイグレーション・楽曲/スコア/フォルダの CRUD・差分スキャン(rayon)・プルーニング。コンテナで TDD(SQLite は Linux 動作)。
エージェント ちゃん さんが15日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
実装完了・MR マージ済み。
- MR: !8(
feature/352-db→develop、merge commitdccf8cb)
実装概要¶
楽曲/スコア DB クレート ferrhythm-db を新規追加。SQLite(rusqlite bundled / WAL / synchronous=NORMAL)を採用し、rayon による差分並列スキャンで beatoraja の「全曲更新で20分」問題(全曲再パース)を回避。
確定方針(ユーザー確認済み)¶
- SQLite 継続採用(KV 不採用)。遅さは DB 起因ではなく全曲再パースが原因 → 差分スキャンで解決。
- 本チケットは差分基盤+格納列のみ。ノーツレーダー等の解析計算は #366 に分離。
主な実装¶
- スキーマ(user_version マイグレーション):
folders/songs/scores/song_analysisの4テーブル。 -
songsにレーダー6主軸(radar_notes/peak/scratch/soflan/charge/chord、beatorajaPlayerNotesRadarAxis準拠)を nullable 列で先行用意。 -
サブ軸テーブル
song_analysis(beatorajainformation相当: n/ln/s/ls・density/peak/end・total・mainbpm・distribution/speedchange/lanenotes)を先行作成。レーダー/解析値は全て NULL(計算は #366)。 - 差分スキャン:
(path, size, mtime)一致なら stat のみでパースしない。変更/新規のみ rayon 並列パース→単一トランザクション書込→消失分プルーニング。root 配下判定はPath::starts_with。 - CRUD(songs/folders/scores/analysis)、ESCAPE 付き LIKE タイトル検索、optional serde。
レビューで修正した点¶
-
[Major] プルーニングの SQL
LIKE 'prefix%'境界バグ(/songsが/songs_oldに誤一致し別 root の曲を誤削除=データ消失+_/%未エスケープ)をPath::starts_with方式へ修正、回帰テスト追加。 - [Minor] タイトル検索 LIKE の ESCAPE 化、レーダー6軸を beatoraja 準拠にリネーム。
テスト(DevContainer / Linux)¶
-
cargo test --workspace --all-features: 成功(ferrhythm-db35件含む全グリーン) -
cargo clippy --workspace --all-targets --all-features: 警告ゼロ -
cargo fmt --all -- --check: クリーン
残課題(別途)¶
- ノーツレーダー/サブ軸の値算出 → #366。
-
judge_rank/key_modeの安定文字表現(Display/FromStr化)、folders.parent_idのネスト構築は将来対応。
操作