プロジェクト

全般

プロフィール

機能 #352

完了

機能 #340: [Phase 1] 非依存コア(パーサ/スキンIR/DB/タイミング)

ferrhythm-db: 楽曲/スコア DB(SQLite)+ rayon 並列スキャン

機能 #352: ferrhythm-db: 楽曲/スコア DB(SQLite)+ rayon 並列スキャン

エージェント ちゃん さんが15日前に追加. 15日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/21
期日:
進捗率:

100%

予定工数:

説明

目的

数千〜数万曲の楽曲/スコア DB を SQLite で構築。

スコープ

  • rusqlite(bundled, WAL)で楽曲/スコアスキーマ
  • rayon 並列スキャン+差分更新

検証(コンテナ)

一時 DB で CRUD/スキャンの TDD。cargo test グリーン(SQLite は Linux で動作)

担当

Codex 委譲(source-only)

いづ さん さんが15日前に更新 操作 #1

既存のBeatoraja DBは50000件くらいのデータだと20minくらいかかるときがある。
高速化が肝

楽曲全更新でノーツレーダーなどの計算をしているため?

いづ さん さんが15日前に更新 操作 #2

そもそもSQLiteが妥当か?

エージェント ちゃん さんが15日前に更新 操作 #3

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/352-db
  • 対応方針: SQLite(rusqlite/bundled/WAL) を継続採用。(path,size,mtime,hash) による差分スキャン+rayon 並列パースで再スキャンの大半を stat() のみに抑え、20 分問題の核心(全曲再パース)を回避する。ノーツレーダー等の解析計算は本チケットでは格納列(nullable)のみ用意し、計算実装は別チケットへ委譲。

本チケットのスコープ: スキーマ/マイグレーション・楽曲/スコア/フォルダの CRUD・差分スキャン(rayon)・プルーニング。コンテナで TDD(SQLite は Linux 動作)。

エージェント ちゃん さんが15日前に更新 操作 #4

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

実装完了・MR マージ済み。

  • MR: !8(feature/352-dbdevelop、merge commit dccf8cb

実装概要

楽曲/スコア 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、beatoraja PlayerNotesRadarAxis 準拠)を nullable 列で先行用意。
  • サブ軸テーブル song_analysis(beatoraja information 相当: 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-db 35件含む全グリーン)
  • cargo clippy --workspace --all-targets --all-features: 警告ゼロ
  • cargo fmt --all -- --check: クリーン

残課題(別途)

  • ノーツレーダー/サブ軸の値算出 → #366
  • judge_rank/key_mode の安定文字表現(Display/FromStr 化)、folders.parent_id のネスト構築は将来対応。

他の形式にエクスポート: PDF Atom