feat: hoppa över predicted rating när inga nya tävlingar tillkommit sedan senaste PDGA-uträkning #30

Open
opened 2026-06-09 10:49:29 +02:00 by shcizo · 0 comments
Owner

Beskrivning

Vi beräknar och visar predicted_rating även när det inte tillkommit några nya rundor sedan PDGA:s senaste officiella uträkning. I det läget är prediktionen i praktiken lika med current_rating (ingen ny indata kan flytta den), så beräkningen är meningslös och prediktionen riskerar att se ut som "ny information" trots att den inte är det.

Motivation / Förväntat beteende

Om spelarens senaste tävlingsrunda ligger före (eller på) datumet för den senaste officiella PDGA-uträkningen ska vi inte visa någon prediktion — current_rating inkorporerar redan all den datan. Istället visas med en kort förklaring (tooltip/hjälptext, t.ex. "Inga nya rundor sedan senaste PDGA-uträkning").

Tekniska noteringar

  • round_history-tabellen (src/db.js:82-91) lagrar date (tävlingsdatum) per runda → spelarens senaste tävlingsdatum kan härledas.
  • getNextPDGAUpdateDate() (src/services/rating-calculator.js:40-71) ger nästa andra-tisdag. Vi behöver motsvarande för föregående uträkning: helpern getPreviousPDGAUpdateDate(). Denna delas med #29 — implementeras där eller här beroende på vilken som landar först.
  • Skip-villkor: max(round_history.date) <= getPreviousPDGAUpdateDate() → ingen ny data → ingen prediktion.
  • getPlayerDataFromDB (src/services/player-service.js:35-85) är naturlig plats att applicera skip-logiken innan predicted returneras.
  • Visningslager: predicted renderas i views/partials/ratings-table.ejs:71-80, views/partials/ratings-cards.ejs och views/partials/player-history.ejs:22-50. Null→ finns redan (player-history.ejs:23, ?? '—'), men den förklarande tooltip-texten är ny och bör skilja "inga nya rundor" från andra null-orsaker.

Edge cases att överväga

  • PDGA-lag: PDGA inkorporerar inte alltid rundor omedelbart — en tävling spelad strax före andra-tisdagen kan hamna i nästa cykel. Strikt datumjämförelse kan därför i kantfall suppressa en prediktion som faktiskt har ny data. Bör vi använda date > lastUpdate rakt av, eller behövs en marginal? Bestäms vid implementation.
  • Spelare helt utan round_history → redan null idag, ingen ändring.

Förhållande till #29

#29 hanterar temporal invalidering (cachat värde blir inaktuellt när cykeln rullar). Denna issue hanterar data-driven skip (ingen ny indata → ingen meningsfull output). De delar helpern getPreviousPDGAUpdateDate() men löser olika problem och kan implementeras oberoende.

Scope

  • Ingår: skip-villkor i läsväg (getPlayerDataFromDB), -visning med förklarande text i vyerna, ev. delning av getPreviousPDGAUpdateDate() med #29.
  • Ingår INTE: cykel-invalidering av redan beräknat värde (#29).
## Beskrivning Vi beräknar och visar `predicted_rating` även när det inte tillkommit några nya rundor sedan PDGA:s senaste officiella uträkning. I det läget är prediktionen i praktiken lika med `current_rating` (ingen ny indata kan flytta den), så beräkningen är meningslös och prediktionen riskerar att se ut som "ny information" trots att den inte är det. ## Motivation / Förväntat beteende Om spelarens senaste tävlingsrunda ligger före (eller på) datumet för den senaste officiella PDGA-uträkningen ska vi inte visa någon prediktion — `current_rating` inkorporerar redan all den datan. Istället visas `—` med en kort förklaring (tooltip/hjälptext, t.ex. *"Inga nya rundor sedan senaste PDGA-uträkning"*). ## Tekniska noteringar - `round_history`-tabellen (`src/db.js:82-91`) lagrar `date` (tävlingsdatum) per runda → spelarens senaste tävlingsdatum kan härledas. - `getNextPDGAUpdateDate()` (`src/services/rating-calculator.js:40-71`) ger *nästa* andra-tisdag. Vi behöver motsvarande för *föregående* uträkning: helpern `getPreviousPDGAUpdateDate()`. **Denna delas med #29** — implementeras där eller här beroende på vilken som landar först. - Skip-villkor: `max(round_history.date) <= getPreviousPDGAUpdateDate()` → ingen ny data → ingen prediktion. - `getPlayerDataFromDB` (`src/services/player-service.js:35-85`) är naturlig plats att applicera skip-logiken innan predicted returneras. - Visningslager: predicted renderas i `views/partials/ratings-table.ejs:71-80`, `views/partials/ratings-cards.ejs` och `views/partials/player-history.ejs:22-50`. Null→`—` finns redan (`player-history.ejs:23`, `?? '—'`), men den **förklarande tooltip-texten är ny** och bör skilja "inga nya rundor" från andra null-orsaker. ## Edge cases att överväga - **PDGA-lag:** PDGA inkorporerar inte alltid rundor omedelbart — en tävling spelad strax före andra-tisdagen kan hamna i *nästa* cykel. Strikt datumjämförelse kan därför i kantfall suppressa en prediktion som faktiskt har ny data. Bör vi använda `date > lastUpdate` rakt av, eller behövs en marginal? Bestäms vid implementation. - Spelare helt utan `round_history` → redan `null` idag, ingen ändring. ## Förhållande till #29 #29 hanterar **temporal** invalidering (cachat värde blir inaktuellt när cykeln rullar). Denna issue hanterar **data-driven skip** (ingen ny indata → ingen meningsfull output). De delar helpern `getPreviousPDGAUpdateDate()` men löser olika problem och kan implementeras oberoende. ## Scope - Ingår: skip-villkor i läsväg (`getPlayerDataFromDB`), `—`-visning med förklarande text i vyerna, ev. delning av `getPreviousPDGAUpdateDate()` med #29. - Ingår INTE: cykel-invalidering av redan beräknat värde (#29).
shcizo added the enhancement label 2026-06-09 10:49:29 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: shcizo/pdga-rating#30