Open syslo opened 9 years ago
Tot moj nazor.
Aj tak sa mi nepaci tlacit kazdu minutu novu vysledkovku do databazy. Podla mna cachovanie s cache invalidation po kazdom submite je lepsie riesenie.
jeden z reason-ov kvoli comu nestaci cachovat HTML vysledkovky je keby sme niekedy v buducnosti chceli implementovat toto: http://www.kms.sk/mo_races.php?kto=226 (aj ked chapem ze taketo veci sa budu chciet ratat len z freeznutych vysledkov)
dovod preco to davat do DB a nemat python-iu cache bol, aby sme mohli mat jeden sposob tahania aj pre nefreeznute vysledkovky aj pre freeznute vysledkovky (pri tomto navrhu akurat nefreeznute vysledkovky maju platnost 1 minutu a freeznute "nekonecno")
Well, stale vieme mat jeden databazovy format, jeden cache format, jednu rataciu funkciu a jeden interface, ktory vzdy dobre zrobi. Len bude treba konvertery nakodit.
Nefinálne výsledkovky vedia tiež byť v nejakej sqlite databáze ktorá bude v RAM. Videl som ako to spraviť, nemám z toho úplne dobrý pocit.
to myslim ze neni nutne, postgres si to podla mna vie pomerne rozumne zmanazovat.
No a stále tu je problém, na ktorý som zabudol pri spisovani issue ... semináre potrebujú nejaké ďalšie dáta pre každú dvojicu (user, round)
. Napríklad sú to už spomínané bonus body, nevylučujem však aj ďalšie využitie. Riešenia, ktoré ma napadli:
RoundMetadata
a necháme každú Competition
pchať si tam čo chce,
v princípe to bude jediný kód, v ktorom sa to bude využívať.Nahadzovanie bonusových bodov vie zo začiatku fungovať na defaulnom adminovi (vyplníme počet bodov, user a round -- dostatočne user friendly kým ich je zopár za sériu)
Treba myslieť na to, že tieto veci tiež vedia devalidovať cache výsledkov.
A ešte jedna jednoduchá, ale dôležitá vec, na ktorú som zabudol. Submit chce mať boolean, že sa akceptuje, aj keď je po termíne. Tento boolean bude zaškrtnuteľný jedine vedúcim. Semináre sa občas dohadujú s účastníkmi, že môžu submitnúť o nejaký čas neskôr z nejakého rozumného dôvodu. FKS potrebuje rozlišovať medzi submitom po termíne a ospravedlneným submitom po termíne. A hodí sa to aj na rôzne hotfixy. Vieme to riešiť aj tak, že nastavíme čas submitu na termín odovzdania, z archivačných dôvodov sa mi však viac páči mať na to flag.
Nefinálne výsledkovky vedia tiež byť v nejakej sqlite databáze ktorá bude v RAM. Videl som ako to spraviť, nemám z toho úplne dobrý pocit.
Toto už znie na môj vkus hodne prešpekulovane a neviem, či ti to skutočne ušetrí toľko námahy.
Čo sa týka cachovanie vs. prepočítavanie výsledkovky každú minútu, cachovanie je viac “pure,” ale “Practicality beats purity.” Ak prepočítavanie mrazených výsledkoviek znamená menej kódu, som za.
nefinalne vysledkovky prepisovat namiesto pridavania
Toto mi pripadá pomerne samozrejmé – určite nechceme mať pre každú minútu v databáze jednu výsledkovku, na ktorú sa už nikdy viac nič nepozrie.
Ešte by ma zaujímalo, ako presne by malo vyzerať to prepočítavanie mrazenej výsledkovky – na prvý pohľad som si pod tým predstavil kopu insertov, prípadne updatov. To môže byť pomerne drahá operácia, čo by znamenalo, že by sa to asi nemalo diať pri klasickom requeste (a už vôbec by to nemalo byť zakopané kdesi v nejakom template tagu, ako sa nám už v minulosti s niečím stalo). V takom prípade by bolo asi lepšie to spraviť ako nejaký management command púšťaný ako cronjob.
Samozrejme, môžem sa mýliť a ak sa to podarí naimplementovať tak, že to vykoná iba nejakých 10-20 (alebo iné rozumne malé O(1)) databázových query, ktoré zbehnú rozumne rýchlo, tak to asi nebude až taký problém. (Ale stále platí, že to nemá byť pochované v template tagu.)
Toto mozem zavriet?
@mhozza - Vyriešil som prvú časť v #735, stále však chýba zmrazenie, dokumentácia a testy. Issues o výsledkovke bolo dosť, nechám si teda túto stále otvorenú. Zvyšok si už pozatváral, to je OK.
Spolu s @black3r sme navrhli nový, všeobecnejší systém, ktorým by sa mohli generovať výsledkovky pre rôzne súťaže.
Pre každú
Competition
pomocouCompetitionRules
(#594) zadefinujeme funkciucalculate_frozen_results
, ktorá pre danú sériu a prípadne kategóriu vytvorí frozen results. Počas aktívnej série budú frozen results platnéC
minút. Pri generovaní výsledkovky sa potom overí, či nejaké frozen results existujú, a ak nie, tak sa zgenerujú. Rovnako sa budú používať frozen results pri akejkoľvek inej potrebe zobraziť body / poradie.Frozen results budú mať dynamický počet stĺpcov. Vytvorí sa nový model pre frozen stĺpec obsahujúci jeho popis a prípadný foreign key na úlohu. Frozen riadky sa nechajú pôvodné, akurát sa pridá foreign key na predošlé frozen riadky (môže potrebovať seminár pri rátaní bodov a vieme potom vyhoviť prev_rank a prev_points). Frozen bunka bude mať foreign keys na stĺpec a riadok, body za popis a za automatické testovanie, obe nullable, a boolean, či sa ráta do súčtu (#413). Všetky modely okrem frozen stĺpcov momentálne v nejakej podobe existujú.
Funkcii
calculate_frozen_results
definovanej v defaultnýchCompetitionRules
vytvoríme rozumné helpers akoget_active_submits
,customize_columns
,customize_row
,compare_rows
, ... . Jednotlivé súťaže vedia potom preťažiť niektoré helpers ako aj celécalculate_frozen_results
.Ďalšie zmeny:
Týmto poriešime issues #114 #413 #414 #577
Rád by som názor od @koniiiik a @mhozza.