From 5958262240c11327da2c4a851ecf25f783831f11 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 15 Apr 2020 23:18:14 +0200 Subject: [PATCH 1/3] =?UTF-8?q?Body=20odjak=C5=BEiva=20te=C4=8F=20po=C4=8D?= =?UTF-8?q?=C3=ADt=C3=A1=20datab=C3=A1ze?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/views_all.py | 46 +++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 71eeb1b1..cf85096e 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -409,34 +409,38 @@ def hlavni_problemy_cisla(cislo): def body_resitelu_odjakziva(rocnik, resitele): body_odjakziva = {} - for r in resitele: - body_odjakziva[r.id] = 0 +# 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[r.id] += body_pred_roky[i][r.id] +## # 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) +# 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: + resitele_s_body = Resitel.objects.annotate(body=Sum('reseni__hodnoceni__body')) + body_odjakziva = {int(res.id) : res.body for res in resitele_s_body if res in resitele} return body_odjakziva # vrátí slovník řešitel:body obsahující počty bodů zadaných řešitelů za daný ročník From 7677d77ad26f4f42f50f0e03fb795e718bd9b7b8 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Wed, 15 Apr 2020 23:41:01 +0200 Subject: [PATCH 2/3] =?UTF-8?q?Rozeps=C3=A1n=C3=AD,=20co=20se=20d=C4=9Bje?= =?UTF-8?q?=20v=20anotaci=20a=20dict=20comprehension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/views_all.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index cf85096e..05c00cdb 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -439,7 +439,11 @@ def body_resitelu_odjakziva(rocnik, resitele): # 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 + # ... ale jen ro řešitele, které dostaneme jako parametr. + # TODO: Zjistit, co ten parametr říká a proč je potřeba body_odjakziva = {int(res.id) : res.body for res in resitele_s_body if res in resitele} return body_odjakziva From cf5ac6819fdbad47ce7db88b6fa699d91ff48de5 Mon Sep 17 00:00:00 2001 From: Pavel 'LEdoian' Turinsky Date: Thu, 16 Apr 2020 00:02:32 +0200 Subject: [PATCH 3/3] =?UTF-8?q?Smaz=C3=A1ny=20star=C3=A9=20a=20pomal=C3=A9?= =?UTF-8?q?=20verze=20po=C4=8D=C3=ADt=C3=A1n=C3=AD=20bod=C5=AF=20odjak?= =?UTF-8?q?=C5=BEiva?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/views/views_all.py | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 05c00cdb..f1462f5d 100644 --- a/seminar/views/views_all.py +++ b/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