Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES/7799.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Optimized response time when filtering repository versions by content.
22 changes: 8 additions & 14 deletions pulpcore/app/models/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -893,26 +893,20 @@ def with_content(self, content):
Filters repository versions that contain the provided content units.

Args:
content (django.db.models.QuerySet): query of content
content (django.db.models.QuerySet or iterable): Content queryset or iterable of PKs

Returns:
django.db.models.QuerySet: Repository versions which contains content.
"""
# TODO: Evaluate if this can be optimized with content_ids field
query = models.Q(pk__in=[])
repo_content = RepositoryContent.objects.filter(content__pk__in=content)

for rc in repo_content.iterator():
filter = models.Q(
repository__pk=rc.repository.pk,
number__gte=rc.version_added.number,
)
if rc.version_removed:
filter &= models.Q(number__lt=rc.version_removed.number)
if isinstance(content, models.QuerySet):
content_pks = content.values_list("pk", flat=True)
else:
content_pks = list(content)

query |= filter
if not content_pks:
return self.none()

return self.filter(query)
return self.filter(content_ids__overlap=content_pks)


class RepositoryVersion(BaseModel):
Expand Down
Loading