From a633f924c59e576eb680a79a9d18b541687665ad Mon Sep 17 00:00:00 2001 From: Jitka Halova Date: Thu, 25 Jun 2026 12:17:03 +0200 Subject: [PATCH] Optimize filtering of repo versions by content closes #7799 Assisted By: Claude Opus 4.6 --- CHANGES/7799.feature | 1 + pulpcore/app/models/repository.py | 23 ++++++++--------------- pulpcore/app/viewsets/custom_filters.py | 2 +- 3 files changed, 10 insertions(+), 16 deletions(-) create mode 100644 CHANGES/7799.feature diff --git a/CHANGES/7799.feature b/CHANGES/7799.feature new file mode 100644 index 0000000000..78130fa434 --- /dev/null +++ b/CHANGES/7799.feature @@ -0,0 +1 @@ +Optimized response time when filtering repository versions by content. diff --git a/pulpcore/app/models/repository.py b/pulpcore/app/models/repository.py index 3f1207cb77..5470fb5d23 100644 --- a/pulpcore/app/models/repository.py +++ b/pulpcore/app/models/repository.py @@ -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): diff --git a/pulpcore/app/viewsets/custom_filters.py b/pulpcore/app/viewsets/custom_filters.py index 46c48ffc1b..72db8022db 100644 --- a/pulpcore/app/viewsets/custom_filters.py +++ b/pulpcore/app/viewsets/custom_filters.py @@ -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)