Skip to content

Commit 3c2bb48

Browse files
committed
Optimized and refactored the packet sig counting functions
- signatures_received() from ~0.03s to ~0.015s - signatures_required() from ~0.03s to ~0.01s
1 parent 1c88f0e commit 3c2bb48

File tree

2 files changed

+37
-51
lines changed

2 files changed

+37
-51
lines changed

packet/commands.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -186,20 +186,19 @@ def fetch_results():
186186
received = packet.signatures_received()
187187
required = packet.signatures_required()
188188

189-
upper_ratio = sum((received["eboard"], received["upperclassmen"], received["miscellaneous"])) / \
190-
sum((required["eboard"], required["upperclassmen"], required["miscellaneous"]))
189+
upper_ratio = received.member_total / required.member_total
191190
print("\tUpperclassmen score: {}%".format(round(upper_ratio * 100, 2)))
192191

193-
total_ratio = sum(received.values()) / sum(required.values())
192+
total_ratio = received.total / required.total
194193
print("\tTotal score: {}%".format(round(total_ratio * 100, 2)))
195194

196195
print()
197196

198-
print("\tEboard: {}/{}".format(received["eboard"], required["eboard"]))
199-
print("\tUpperclassmen: {}/{}".format(received["upperclassmen"], required["upperclassmen"]))
200-
print("\tFreshmen: {}/{}".format(received["freshmen"], required["freshmen"]))
201-
print("\tMiscellaneous: {}/{}".format(len(packet.misc_signatures), required["miscellaneous"]))
197+
print("\tEboard: {}/{}".format(received.eboard, required.eboard))
198+
print("\tUpperclassmen: {}/{}".format(received.upper, required.upper))
199+
print("\tFreshmen: {}/{}".format(received.fresh, required.fresh))
200+
print("\tMiscellaneous: {}/{}".format(received.misc, required.misc))
202201

203202
print()
204203

205-
print("\tTotal missed:", sum(required.values()) - sum(received.values()))
204+
print("\tTotal missed:", required.total - received.total)

packet/models.py

Lines changed: 30 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
"""
44

55
from datetime import datetime
6-
from functools import lru_cache
76

87
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Boolean
98
from sqlalchemy.orm import relationship
@@ -14,6 +13,19 @@
1413
REQUIRED_MISC_SIGNATURES = 15
1514

1615

16+
class SigCounts:
17+
"""
18+
Utility class for returning counts of signatures broken out by type
19+
"""
20+
def __init__(self, eboard, upper, fresh, misc):
21+
self.eboard = eboard
22+
self.upper = upper # Upperclassmen excluding eboard
23+
self.fresh = fresh
24+
self.misc = misc
25+
self.member_total = eboard + upper + misc
26+
self.total = eboard + upper + fresh + misc
27+
28+
1729
class Freshman(db.Model):
1830
__tablename__ = "freshman"
1931
rit_username = Column(String(10), primary_key=True)
@@ -49,51 +61,26 @@ class Packet(db.Model):
4961
def is_open(self):
5062
return self.start < datetime.now() < self.end
5163

52-
@lru_cache(maxsize=1024)
53-
def signatures_required(self, total=False):
54-
if total:
55-
return len(self.upper_signatures) + len(self.fresh_signatures) + REQUIRED_MISC_SIGNATURES
56-
eboard = UpperSignature.query.with_parent(self).filter_by(eboard=True).count()
57-
return {'eboard': eboard,
58-
'upperclassmen': len(self.upper_signatures) - eboard,
59-
'freshmen': len(self.fresh_signatures),
60-
'miscellaneous': REQUIRED_MISC_SIGNATURES}
61-
62-
def signatures_received(self, total=False):
64+
def signatures_required(self):
65+
eboard = sum(map(lambda sig: 1 if sig.eboard else 0, self.upper_signatures))
66+
upper = len(self.upper_signatures) - eboard
67+
fresh = len(self.fresh_signatures)
68+
69+
return SigCounts(eboard, upper, fresh, REQUIRED_MISC_SIGNATURES)
70+
71+
def signatures_received(self):
6372
"""
6473
Result capped so it will never be greater than that of signatures_required()
6574
"""
66-
misc_count = len(self.misc_signatures)
67-
68-
if misc_count > REQUIRED_MISC_SIGNATURES:
69-
misc_count = REQUIRED_MISC_SIGNATURES
70-
71-
eboard_count = db.session.query(UpperSignature.member) \
72-
.select_from(Packet).join(UpperSignature) \
73-
.filter(Packet.freshman_username == self.freshman_username,
74-
UpperSignature.signed, UpperSignature.eboard) \
75-
.distinct().count()
76-
77-
upper_count = db.session.query(UpperSignature.member) \
78-
.select_from(Packet).join(UpperSignature) \
79-
.filter(Packet.freshman_username == self.freshman_username,
80-
UpperSignature.signed,
81-
UpperSignature.eboard.isnot(True)) \
82-
.distinct().count()
83-
84-
fresh_count = db.session.query(FreshSignature.freshman_username) \
85-
.select_from(Packet).join(FreshSignature) \
86-
.filter(Packet.freshman_username == self.freshman_username,
87-
FreshSignature.signed) \
88-
.distinct().count()
89-
90-
if total:
91-
return eboard_count + upper_count + fresh_count + misc_count
92-
93-
return {'eboard': eboard_count,
94-
'upperclassmen': upper_count,
95-
'freshmen': fresh_count,
96-
'miscellaneous': misc_count}
75+
eboard = sum(map(lambda sig: 1 if sig.eboard and sig.signed else 0, self.upper_signatures))
76+
upper = sum(map(lambda sig: 1 if not sig.eboard and sig.signed else 0, self.upper_signatures))
77+
fresh = sum(map(lambda sig: 1 if sig.signed else 0, self.fresh_signatures))
78+
79+
misc = len(self.misc_signatures)
80+
if misc > REQUIRED_MISC_SIGNATURES:
81+
misc = REQUIRED_MISC_SIGNATURES
82+
83+
return SigCounts(eboard, upper, fresh, misc)
9784

9885

9986
class UpperSignature(db.Model):

0 commit comments

Comments
 (0)