From 4462e89e113613c5f0840bbcc5eaae3131e60573 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 | 22 ++++++++-------------- 2 files changed, 9 insertions(+), 14 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..35fe7d06b0 100644 --- a/pulpcore/app/models/repository.py +++ b/pulpcore/app/models/repository.py @@ -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):