perf: aggregate batch status statistics in a single query
This commit is contained in:
@@ -249,6 +249,38 @@ def test_last_review_updates_batch_and_keeps_zero(sqlite_db):
|
||||
assert sheet["D2"].value == 0
|
||||
|
||||
|
||||
@pytest.mark.parametrize("batch_count", [0, 20])
|
||||
def test_batch_list_status_statistics_use_constant_query_count(sqlite_db, batch_count):
|
||||
from wisegrade.api import list_batches
|
||||
db = sqlite_db
|
||||
item = project(db)
|
||||
expected = {}
|
||||
states = ["scored", "reviewed", "needs_review", "failed", "unscorable"]
|
||||
for index in range(batch_count):
|
||||
created = services.create_batch(SimpleNamespace(course_version_id=1, rubric_version_id=1), db)
|
||||
batch = db.get(ScoringBatch, created["id"])
|
||||
criterion = batch.rubric_snapshot["criteria"][0]["criterion_id"]
|
||||
state = states[index % len(states)]
|
||||
db.add(CriterionScore(batch_id=batch.id, project_id=item.id, criterion_id=criterion, status=state))
|
||||
expected[batch.id] = {state: 1}
|
||||
db.commit()
|
||||
queries = []
|
||||
def trace(_conn, _cursor, statement, _parameters, _context, _many):
|
||||
if statement.lstrip().upper().startswith("SELECT"):
|
||||
queries.append(statement)
|
||||
event.listen(db.get_bind(), "before_cursor_execute", trace)
|
||||
try:
|
||||
listed = list_batches(db)
|
||||
finally:
|
||||
event.remove(db.get_bind(), "before_cursor_execute", trace)
|
||||
assert len(queries) <= (2 if batch_count else 1), len(queries)
|
||||
assert [row["id"] for row in listed] == sorted(expected, reverse=True)
|
||||
for row in listed:
|
||||
assert row["status_counts"] == expected[row["id"]]
|
||||
for state in ("needs_review", "failed", "unscorable"):
|
||||
assert row[state] == expected[row["id"]].get(state, 0)
|
||||
|
||||
|
||||
def test_pdf_html_preserves_zero_and_none():
|
||||
batch = SimpleNamespace(id=1, course_version_id=1, rubric_version_id=1, model_config_snapshot={},
|
||||
embedding_model_name="test", embedding_model_version="test")
|
||||
|
||||
Reference in New Issue
Block a user