操作
機能 #314
完了ノーツレーダー細分化 Phase 1: A分類サブ軸の露出・IR伝送・EAV保持・集計
機能 #314:
ノーツレーダー細分化 Phase 1: A分類サブ軸の露出・IR伝送・EAV保持・集計
説明
目的¶
#313 で確定した細分化データモデル設計(docs/notes-radar-subdivision-design.md)の Phase 1。新規パターン解析を伴わず、既に NotesRadarCalculator / NotesRadarFeature が算出済みの A分類サブ軸を新 axis_key として露出し、伝送 → 保持(EAV) → 集計 の縦串を先に通す。
親設計: #313。後続: Phase 2(B分類・新規パターン解析)。
スコープ(A分類サブ軸)¶
-
NOTES:
notes_density_peak_1s(既存peakBurstNotes公開化)/notes_local_hardness(ピーク密度/平均密度比) -
PEAK:
peak_burst_1s/peak_sustained_3s(既存値公開化) -
CHORD:
chord_max_size(maxChordSize公開済) -
SOF-LAN:
soflan_accel/soflan_decel(既存ソフランクラスタを speed 差符号で分離)/soflan_stop(stopCount/soflanStopTimeTotal)/soflan_visual(scrollChangeCount+逆スクロール) -
SCRATCH:
scratch_bss(scratch lane の LongNote 始端。判定が軽微なため Phase 1 に含める)
本体側の変更接点(#313 §7 の縦串・既存29列と同型)¶
-
NotesRadarCalculator.ChartMetrics/calculate(): A分類値の露出(多くは既存値、soflan accel/decel は cluster 生成時に speed 差符号を保持する小改修)。 -
NotesRadarFeature.java: record コンポーネントを末尾追加。EMPTY・互換コンストラクタ・コンパクトコンストラクタを更新。既存6値先頭は不変=後方互換。 -
SongData.java: getter 追加。 -
SongDataDto.java/SongDataResultSetHandler.java(列名存在チェック付き getDouble)。 -
SQLiteSongDatabaseAccessor.java:SONG_COLUMNS/FEATURE_COLUMNS_SQL/ Tablenew Column("feature_xxx","REAL")(自動 ALTER 起点)。INSERT の VALUES プレースホルダ数を SONG_COLUMNS/DTO 順と一致させる。 -
IRChartData.java:values.put("feature_xxx", ...)。現状の「最終6値のみ送信」を「全 feature_ 送信」へ拡張*(server がサブ軸を受け取れる前提)。
plugin / server 側の責務¶
- IR 受信で
feature_*を EAV テーブルsong_chart_feature(song_sha256, axis_key, value, updated_at)に展開保持(axis_key=feature_を除いた名と1:1)。 - 集計(達成率
min(exscore/(notes*2),1.0)重み・軸ごと上位N平均・0〜200 アンカー)を新 axis_key へ拡張。
バックフィル¶
#145 同方式: 楽曲全更新で全譜面再計算 → songdata.db を IR 側へ取り込み。自動 ALTER で旧 DB も列追加、旧値0は全更新で再計算され埋まる。
テスト方針¶
-
NotesRadarCalculatorTest拡張: A分類値の算出・境界、既存6軸値の不変(回帰)、NotesRadarFeature.EMPTY要素数一致、SongDataDtoround-trip 一致、列欠落 DB(旧スキーマ)で getDouble が 0 を返すこと。 -
IRChartDataTest: 新 feature_* キーが values に載ること。
未解決(実データ後決め)¶
- soflan accel/decel/visual の重み配分(既存総合 soflan との二重計上回避係数)。
- 各サブ軸の集計上位N。
- パターン軸ではないため anchor は既存流用 or 比率系はそのまま。
操作