Skip to content
Merged
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.
23 changes: 8 additions & 15 deletions pulpcore/app/models/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -893,26 +893,19 @@ 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 list): Content queryset or list 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)

query |= filter
if isinstance(content, models.QuerySet):
content_pks = content.values_list("pk", flat=True)
elif not content:
return self.none()
else:
content_pks = content

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


class RepositoryVersion(BaseModel):
Expand Down
2 changes: 1 addition & 1 deletion pulpcore/app/viewsets/custom_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ def filter(self, qs, value):
for url in value:
content_units[extract_pk(url)] = url

content_units_pks = set(content_units.keys())
content_units_pks = list(content_units.keys())
existing_content_units = Content.objects.filter(pk__in=content_units_pks)
raise_for_unknown_content_units(existing_content_units, content_units)

Expand Down
Loading