Browse Source

Smazány staré a pomalé verze počítání bodů odjakživa

middleware_test
Pavel 'LEdoian' Turinsky 5 years ago
parent
commit
cf5ac6819f
  1. 32
      seminar/views/views_all.py

32
seminar/views/views_all.py

@ -407,38 +407,6 @@ def hlavni_problemy_cisla(cislo):
# vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník
def body_resitelu_odjakziva(rocnik, resitele):
body_odjakziva = {}
# for r in resitele:
# body_odjakziva[str(r.id)] = 0
#########################################################################
# POZOR! Aktuálně počítá jen za posledních 10 let od zadaného ročníku #
#########################################################################
## # Body za posledních 10 let je dobrá aproximace pro naše potřeby (výsledkovka
## # s aktivními řešiteli)
##
## body_pred_roky = []
## rok = rocnik.prvni_rok
## rocniky = Rocnik.objects.filter(prvni_rok__gt=rok-11)
## for roc in rocniky:
## body_pred_roky.append(body_resitelu_za_rocnik(roc, resitele))
##
## for r in resitele:
## for i in range(0,10):
## body_odjakziva[str(r.id)] += body_pred_roky[i][str(r.id)]
# Nasledující řešení je sice správné, ale moc pomalé:
# (důsledek toho, že dotazy na joinování databázových tabulek jsou kvadratické)
# for res in Reseni.objects.prefetch_related('resitele', 'hodnoceni_set').all():
# for r in res.resitele.all():
# # daný řešitel nemusí být v naší podmnožině
# if r not in resitele: continue
#
# for hodn in res.hodnoceni_set.all():
# pricti_body(body_odjakziva, r, hodn.body)
# Zkusíme agregovat:
# Následující řádek přidá ke každému řešiteli údaj ".body" se součtem jejich bodů
resitele_s_body = Resitel.objects.annotate(body=Sum('reseni__hodnoceni__body'))
# Teď jen z QuerySetu řešitelů anotovaných body vygenerujeme slovník indexovaný řešitelským id obsahující body

Loading…
Cancel
Save