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

Commit b186b3c

Browse files
authored
Add batch insert fn for measurements (#466)
1 parent 67879c1 commit b186b3c

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

shared/upload/utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from datetime import timedelta
22
from enum import Enum
33

4+
from django.db import transaction
45
from django.db.models import Q
56
from django.utils import timezone
67

@@ -35,6 +36,18 @@ def query_monthly_coverage_measurements(plan_service: PlanService) -> int:
3536
return queryset[:monthly_limit].count()
3637

3738

39+
def bulk_insert_coverage_measurements(
40+
measurements: list[UserMeasurement],
41+
) -> list[UserMeasurement]:
42+
"""
43+
This function takes measurements as input and bulk_creates them into the DB.
44+
The atomic transaction ensures either all transactions are inserted or none
45+
if there's an error
46+
"""
47+
with transaction.atomic():
48+
return UserMeasurement.objects.bulk_create(measurements)
49+
50+
3851
def insert_coverage_measurement(
3952
owner_id: int,
4053
repo_id: int,

tests/unit/upload/test_utils.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from shared.django_apps.user_measurements.models import UserMeasurement
1515
from shared.plan.service import PlanService
1616
from shared.upload.utils import (
17+
bulk_insert_coverage_measurements,
1718
insert_coverage_measurement,
1819
query_monthly_coverage_measurements,
1920
)
@@ -145,3 +146,28 @@ def test_query_monthly_coverage_measurements_beyond_monthly_limit(
145146
)
146147
# 10 uploads total, max 3 returned
147148
assert monthly_measurements == 3
149+
150+
def test_bulk_insert_user_measurements(self):
151+
owner = OwnerFactory()
152+
measurements = []
153+
for _ in range(5):
154+
repo = RepositoryFactory.create(author=owner)
155+
commit = CommitFactory.create(repository=repo)
156+
report = CommitReportFactory.create(commit=commit)
157+
upload = UploadFactory.create(report=report)
158+
measurements.append(
159+
UserMeasurement(
160+
owner_id=owner.ownerid,
161+
repo_id=repo.repoid,
162+
commit_id=commit.id,
163+
upload_id=upload.id,
164+
uploader_used="CLI",
165+
private_repo=repo.private,
166+
report_type=report.report_type,
167+
)
168+
)
169+
170+
inserted_measurements = bulk_insert_coverage_measurements(
171+
measurements=measurements
172+
)
173+
assert len(inserted_measurements) == 5

0 commit comments

Comments
 (0)