@@ -120,8 +120,8 @@ def calculate_exercises():
120
120
if not ecosystem_matrices :
121
121
break
122
122
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 )
125
125
calculation_values = []
126
126
# Skip calculations that don't have an ecosystem matrix
127
127
for ecosystem_matrix in ecosystem_matrices :
@@ -130,42 +130,38 @@ def calculate_exercises():
130
130
131
131
calculations = calculations_by_ecosystem_uuid [ecosystem_uuid ]
132
132
for calculation in calculations :
133
- calculation_uuid = calculation ['calculation_uuid' ]
133
+ calc_uuid = calculation ['calculation_uuid' ]
134
134
135
135
# Partition exercise_uuids into known and unknown
136
- known_exercise_uuids = []
137
- unknown_exercise_uuids = []
138
136
for exercise_uuid in calculation ['exercise_uuids' ]:
139
137
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 )
141
139
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 ,
151
145
ecosystem_uuid ,
152
- calculation ['student_uuid' ],
153
- exercise_uuid
154
- ) for exercise_uuid in known_exercise_uuids
155
- ])
146
+ calculation ['student_uuid' ]
147
+ )
148
+ )
156
149
157
150
response_dicts_by_calculation_uuid = defaultdict (list )
151
+ # Beware that uuid columns return UUID objects (not strings) when using from_statement()
158
152
for result in session .query ('calculation_uuid' , Response ).from_statement (text (dedent ("""
159
153
SELECT "values"."calculation_uuid", "responses".*
160
154
FROM "responses" INNER JOIN (VALUES {}) AS "values"
161
- ("calculation_uuid", "ecosystem_uuid", "student_uuid", "exercise_uuid" )
155
+ ("calculation_uuid", "ecosystem_uuid", "student_uuid")
162
156
ON "responses"."student_uuid" = "values"."student_uuid"
163
157
AND "responses"."ecosystem_uuid" = "values"."ecosystem_uuid"
164
- AND "responses"."exercise_uuid" = "values"."exercise_uuid"
165
158
""" .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 )
169
165
170
166
exercise_calculation_requests = []
171
167
for ecosystem_matrix in ecosystem_matrices :
@@ -192,8 +188,9 @@ def calculate_exercises():
192
188
ordered_exercise_uuids = [info .Q_id for info in ordered_Q_infos ]
193
189
194
190
# 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
+ )
197
194
shuffle (unknown_exercise_uuids )
198
195
ordered_exercise_uuids .extend (unknown_exercise_uuids )
199
196
0 commit comments