trojsten / web

Trojstenovy web
MIT License
9 stars 9 forks source link

Návrh nového systému výsledkoviek #595

Open syslo opened 9 years ago

syslo commented 9 years ago

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 pomocou CompetitionRules (#594) zadefinujeme funkciu calculate_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ých CompetitionRules vytvoríme rozumné helpers ako get_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.

mhozza commented 9 years ago

Tot moj nazor.

black3r commented 9 years ago
mhozza commented 9 years ago

Aj tak sa mi nepaci tlacit kazdu minutu novu vysledkovku do databazy. Podla mna cachovanie s cache invalidation po kazdom submite je lepsie riesenie.

syslo commented 9 years ago
mhozza commented 9 years ago
black3r commented 9 years ago

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")

syslo commented 9 years ago

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.

mhozza commented 9 years ago
syslo commented 9 years ago

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.

mhozza commented 9 years ago

to myslim ze neni nutne, postgres si to podla mna vie pomerne rozumne zmanazovat.

syslo commented 9 years ago

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:

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.

syslo commented 9 years ago

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.

koniiiik commented 9 years ago

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.)

mhozza commented 8 years ago

Toto mozem zavriet?

syslo commented 8 years ago

@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.