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):