Skip to content

週間・月間ランキングを追加 - #212

Merged
kojira merged 1 commit into
mainfrom
claude/ranking-feature-bug-a8nq2k
Jul 25, 2026
Merged

週間・月間ランキングを追加#212
kojira merged 1 commit into
mainfrom
claude/ranking-feature-bug-a8nq2k

Conversation

@kojira

@kojira kojira commented Jul 25, 2026

Copy link
Copy Markdown
Member

Closes #211

トータルに加えて**暦週・暦月(JST、週は月曜0:00始まり)**のランキングを追加します。

指標ごとの作り方

ぽいんとusers/{id}/sanpai_logs をコレクショングループで横断し、add_point を期間合計。週初と月初の早い方を下限にした1クエリで週間・月間の両方を賄う(週が月をまたぐケースに対応)。ログは2021年から残っているので遡って正確な値が出る。

せんとうりょくstatus.total は現在値しか保存が無く過去を復元できないため、期間開始時点のスナップショット cache_data/battle_baseline との差分=伸び幅でランキング。

  • 期間キーが変わったら基準値を作り直す(全員0から再スタート)
  • 基準値の無いユーザー(新規・初回観測)は現在値で初期化して差分0にする ← 現在値まるごとで1位になる事故を防ぐ
  • 伸び幅0以下は載せない。したがって導入直後は空になり、フロントがトータルにフォールバックする

実行とコスト

rankingUpdateGo(毎時)に相乗り。usersの追加スキャンは発生しない(既存スキャンから表示情報を引く)。

頻度 追加コスト
せんとうりょく期間 毎時 基準値 1 read + 1 write
ぽいんと期間 3時間ごと 期間中の参拝ログ件数に比例

JST 0時は集計回に当たるので、週明け・月初の切り替わりは待たずに反映されます。期間集計が失敗しても(インデックス未作成・一時エラー等)ログを残してトータルの更新は続行します。

キャッシュの持ち方(1MiB対策)

ranking_cache は全ユーザーを表示情報つきで持っており上限が N≒2,000〜3,500。期間別で同じ持ち方をすると余裕が一気に縮むため:

  • *_top: 上位100件(display_name / image_path つき)
  • *_ranks: 全ユーザー分の {screen_name, value, rank} のみ

「あなたの順位」カードは順位と値しか使わないので、圏外でも自分の順位が出せます

フロント

  • Ranking.vue に指標×期間の2段セグメント。初期表示は週間×せんとうりょく
  • 選択中の期間が空ならトータルにフォールバック+「まだ週間の記録が溜まっていないため、トータルを表示しています」の注記。溜まれば自動で期間表示に戻る
  • 期間ランキングのヘッダには「週間で伸びたせんとうりょく」等の注記を出し、絶対値との誤解を防ぐ
  • 全期間を1レスポンスで受け取るのでタブ切替で再フェッチしない(CDNキャッシュキーも増えない)
  • トップページは幅が狭いので :show-tabs="false" でタブを出さず、週間(空ならトータル)のみ

インデックス

sanpai_logs.timestampCOLLECTION_GROUP スコープのインデックスを追加。fieldOverrides は自動の単一フィールドインデックスを置き換えるため、既存の sanpaiHistoryGo が使う COLLECTION スコープの昇順・降順も併記しています。デプロイは既存の firebase deploy --force が拾います。

検証

  • Firestoreエミュレータで go test ./... 全パス。新規テスト: 期間境界(月曜/日曜/月初が週の途中/UTC入力)、3時間間引きの判定、同点同順位・上位100件キャップと全件順位リスト、基準値の初期化・ロールオーバー・伸び幅・不在ユーザーの剪定、コレクショングループ集計、レスポンスの periods と圏外 my_rank
  • yarn generate 成功
  • ヘッドレスでUI3状態(フォールバック / 週間ぽいんと / 月間せんとうりょく)を目視確認

🤖 Generated with Claude Code

https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU


Generated by Claude Code

トータルに加えて暦週・暦月(JST、週は月曜始まり)のランキングを出す。

- ぽいんと: sanpai_logs をコレクショングループで横断し add_point を期間合計。
  ログは2021年から残っているので遡って正確な値が出る
- せんとうりょく: 現在値しか保存が無く過去を復元できないため、期間開始時点の
  スナップショット(cache_data/battle_baseline)との差分=伸び幅でランキング。
  基準値の無い新規ユーザーは現在値で初期化して差分0にし、現在値まるごとで
  1位になる事故を防ぐ
- 実行は rankingUpdateGo に相乗り(usersの追加スキャンなし)。せんとうりょくは
  毎時、ぽいんとの横断読み取りは3時間ごとに間引く(JST0時は集計回なので
  週明け・月初は待たずに反映)。期間集計が失敗してもトータルの更新は続行する
- キャッシュは上位100件(表示情報つき)+全員分の軽量順位リストの2本立てにし、
  ドキュメントの1MiB上限を圧迫しないようにする
- sanpai_logs.timestamp にコレクショングループスコープのインデックスを追加
- Ranking.vue に指標×期間の2段セグメント。初期表示は週間×せんとうりょくで、
  記録が溜まるまではトータルにフォールバックして注記を出す。トップページは
  タブを出さず週間のみ

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
@cursor

cursor Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@kojira
kojira merged commit 8f5d702 into main Jul 25, 2026
3 checks passed
kojira pushed a commit that referenced this pull request Aug 2, 2026
base_at は締め機能と同時に足したフィールドで、期間ランキング自体は
それより前(#212)から動いている。既存の基準値ドキュメントはこの
フィールドを持たないため、ゼロ値を「途中から集計を始めた」と見なすと、
頭から記録できている最初の週・月に赤い注意書きが出てしまう。

ゼロ値は「フィールドを持つ前に作られた基準値」であって途中開始では
ないので、partial としない。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
kojira added a commit that referenced this pull request Aug 2, 2026
base_at は締め機能と同時に足したフィールドで、期間ランキング自体は #212 から動いている。既存の基準値ドキュメントはこのフィールドを持たないため、ゼロ値を「途中から集計を始めた」と見なすと、頭から記録できている最初の週・月に誤った注意書きが出る。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

週間・月間ランキングの追加

2 participants