Skip to content
This repository was archived by the owner on May 4, 2021. It is now read-only.

Commit 13a5107

Browse files
authored
Merge pull request #64 from openstax/speed_up_exercise_calculations
Speed up exercise calculations
2 parents 2f404bd + 2cd9400 commit 13a5107

File tree

3 files changed

+29
-28
lines changed

3 files changed

+29
-28
lines changed

sparfa_server/biglearn/clients.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from logging import getLogger
2-
from json import dumps
32
from requests import Session
43

54
from .. import __version__

sparfa_server/tasks/calcs.py

+23-26
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ def calculate_exercises():
120120
if not ecosystem_matrices:
121121
break
122122

123-
known_exercise_uuids_by_calculation_uuid = {}
124-
unknown_exercise_uuids_by_calculation_uuid = {}
123+
known_exercise_uuids_by_calculation_uuid = defaultdict(set)
124+
unknown_exercise_uuids_by_calculation_uuid = defaultdict(set)
125125
calculation_values = []
126126
# Skip calculations that don't have an ecosystem matrix
127127
for ecosystem_matrix in ecosystem_matrices:
@@ -130,42 +130,38 @@ def calculate_exercises():
130130

131131
calculations = calculations_by_ecosystem_uuid[ecosystem_uuid]
132132
for calculation in calculations:
133-
calculation_uuid = calculation['calculation_uuid']
133+
calc_uuid = calculation['calculation_uuid']
134134

135135
# Partition exercise_uuids into known and unknown
136-
known_exercise_uuids = []
137-
unknown_exercise_uuids = []
138136
for exercise_uuid in calculation['exercise_uuids']:
139137
if exercise_uuid in Q_ids_set:
140-
known_exercise_uuids.append(exercise_uuid)
138+
known_exercise_uuids_by_calculation_uuid[calc_uuid].add(exercise_uuid)
141139
else:
142-
unknown_exercise_uuids.append(exercise_uuid)
143-
known_exercise_uuids_by_calculation_uuid[calculation_uuid] = \
144-
known_exercise_uuids
145-
unknown_exercise_uuids_by_calculation_uuid[calculation_uuid] = \
146-
unknown_exercise_uuids
147-
148-
calculation_values.extend([
149-
"(UUID('{0}'), UUID('{1}'), UUID('{2}'), UUID('{3}'))".format(
150-
calculation_uuid,
140+
unknown_exercise_uuids_by_calculation_uuid[calc_uuid].add(exercise_uuid)
141+
142+
calculation_values.append(
143+
"(UUID('{0}'), UUID('{1}'), UUID('{2}'))".format(
144+
calc_uuid,
151145
ecosystem_uuid,
152-
calculation['student_uuid'],
153-
exercise_uuid
154-
) for exercise_uuid in known_exercise_uuids
155-
])
146+
calculation['student_uuid']
147+
)
148+
)
156149

157150
response_dicts_by_calculation_uuid = defaultdict(list)
151+
# Beware that uuid columns return UUID objects (not strings) when using from_statement()
158152
for result in session.query('calculation_uuid', Response).from_statement(text(dedent("""
159153
SELECT "values"."calculation_uuid", "responses".*
160154
FROM "responses" INNER JOIN (VALUES {}) AS "values"
161-
("calculation_uuid", "ecosystem_uuid", "student_uuid", "exercise_uuid")
155+
("calculation_uuid", "ecosystem_uuid", "student_uuid")
162156
ON "responses"."student_uuid" = "values"."student_uuid"
163157
AND "responses"."ecosystem_uuid" = "values"."ecosystem_uuid"
164-
AND "responses"."exercise_uuid" = "values"."exercise_uuid"
165158
""".format(', '.join(calculation_values))).strip())).all():
166-
response_dicts_by_calculation_uuid[result.calculation_uuid].append(
167-
result.Response.dict_for_algs
168-
)
159+
calc_uuid = str(result.calculation_uuid)
160+
response = result.Response
161+
if str(
162+
response.exercise_uuid
163+
) in known_exercise_uuids_by_calculation_uuid[calc_uuid]:
164+
response_dicts_by_calculation_uuid[calc_uuid].append(response.dict_for_algs)
169165

170166
exercise_calculation_requests = []
171167
for ecosystem_matrix in ecosystem_matrices:
@@ -192,8 +188,9 @@ def calculate_exercises():
192188
ordered_exercise_uuids = [info.Q_id for info in ordered_Q_infos]
193189

194190
# Put any unknown exercise uuids at the end of the list in random order
195-
unknown_exercise_uuids = \
196-
unknown_exercise_uuids_by_calculation_uuid[calculation_uuid].copy()
191+
unknown_exercise_uuids = list(
192+
unknown_exercise_uuids_by_calculation_uuid[calculation_uuid]
193+
)
197194
shuffle(unknown_exercise_uuids)
198195
ordered_exercise_uuids.extend(unknown_exercise_uuids)
199196

tests/unit/tasks/test_calcs.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010

1111

1212
def test_calculate_ecosystem_matrices(transaction):
13-
ecosystem_1 = Ecosystem(uuid=str(uuid4()), metadata_sequence_number=0, sequence_number=1)
13+
ecosystem_1 = Ecosystem(
14+
uuid=str(uuid4()),
15+
metadata_sequence_number=0,
16+
sequence_number=1,
17+
last_ecosystem_matrix_update_calculation_uuid=str(uuid4())
18+
)
1419

1520
calculation_uuid = str(uuid4())
1621
ecosystem_matrix_updates = [{

0 commit comments

Comments
 (0)