diff --git a/app/finders/packages/tags_finder.rb b/app/finders/packages/tags_finder.rb index 020b3d8072a1dc73898420b0a674ca3ba80ee4f7..dd104ea6f9133ddd08bdb6d36c3a7f59e2763cd4 100644 --- a/app/finders/packages/tags_finder.rb +++ b/app/finders/packages/tags_finder.rb @@ -15,7 +15,7 @@ def execute .with_name(package_name) packages = packages.with_package_type(package_type) if package_type.present? - Packages::Tag.for_packages(packages) + Packages::Tag.for_package_ids(packages.select(:id)) end private diff --git a/app/models/packages/package.rb b/app/models/packages/package.rb index c6e8ff6c3fa186db71c92926396c3a5b4935d0fd..9b137a378deedc0d431b69aeb52529fca1b959d3 100644 --- a/app/models/packages/package.rb +++ b/app/models/packages/package.rb @@ -162,7 +162,8 @@ class Packages::Package < ApplicationRecord scope :preload_files, -> { preload(:installable_package_files) } scope :preload_nuget_files, -> { preload(:installable_nuget_package_files) } scope :preload_pipelines, -> { preload(pipelines: :user) } - scope :last_of_each_version, -> { where(id: all.select('MAX(id) AS id').group(:version)) } + scope :last_of_each_version, -> { where(id: all.last_of_each_version_ids) } + scope :last_of_each_version_ids, -> { select('MAX(id) AS id').unscope(where: :id).group(:version) } scope :limit_recent, ->(limit) { order_created_desc.limit(limit) } scope :select_distinct_name, -> { select(:name).distinct } diff --git a/app/models/packages/tag.rb b/app/models/packages/tag.rb index 14a1ae98ed4601806dfb9251c52332631c74ad77..9c17a147bf44db9ff80e6391db9e8395b0b6ea5c 100644 --- a/app/models/packages/tag.rb +++ b/app/models/packages/tag.rb @@ -10,8 +10,8 @@ class Packages::Tag < ApplicationRecord scope :preload_package, -> { preload(:package) } scope :with_name, -> (name) { where(name: name) } - def self.for_packages(packages) - where(package_id: packages.select(:id)) + def self.for_package_ids(package_ids) + where(package_id: package_ids) .order(updated_at: :desc) .limit(FOR_PACKAGES_TAGS_LIMIT) end diff --git a/app/presenters/packages/npm/package_presenter.rb b/app/presenters/packages/npm/package_presenter.rb index fabb0a3674600a166ca19aa12bafbb643ca62ac8..57bdd373309774f64b25968f8200fdbe80522f5c 100644 --- a/app/presenters/packages/npm/package_presenter.rb +++ b/app/presenters/packages/npm/package_presenter.rb @@ -83,7 +83,7 @@ def sorted_versions end def package_tags - Packages::Tag.for_packages(packages) + Packages::Tag.for_package_ids(packages.last_of_each_version_ids) .preload_package end diff --git a/spec/models/packages/tag_spec.rb b/spec/models/packages/tag_spec.rb index 842ba7ad51855f1566d6916e7e4083421de77a3d..bc03c34f56b2604dca4d8e4355f01455179ba68a 100644 --- a/spec/models/packages/tag_spec.rb +++ b/spec/models/packages/tag_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe Packages::Tag, type: :model do +RSpec.describe Packages::Tag, type: :model, feature_category: :package_registry do let!(:project) { create(:project) } let!(:package) { create(:npm_package, version: '1.0.2', project: project, updated_at: 3.days.ago) } @@ -16,14 +16,14 @@ it { is_expected.to validate_presence_of(:name) } end - describe '.for_packages' do + describe '.for_package_ids' do let(:package2) { create(:package, project: project, updated_at: 2.days.ago) } let(:package3) { create(:package, project: project, updated_at: 1.day.ago) } let!(:tag1) { create(:packages_tag, package: package) } let!(:tag2) { create(:packages_tag, package: package2) } let!(:tag3) { create(:packages_tag, package: package3) } - subject { described_class.for_packages(project.packages) } + subject { described_class.for_package_ids(project.packages) } it { is_expected.to match_array([tag1, tag2, tag3]) } @@ -34,6 +34,12 @@ it { is_expected.to match_array([tag2, tag3]) } end + + context 'with package ids' do + subject { described_class.for_package_ids(project.packages.select(:id)) } + + it { is_expected.to match_array([tag1, tag2, tag3]) } + end end describe '.with_name' do