Skip to content

Commit

Permalink
Use associations to define rubygem reverse dependencies
Browse files Browse the repository at this point in the history
This ends up speeding up the endpoint significantly due to the small differences in the generated query
  • Loading branch information
segiddins committed Mar 6, 2024
1 parent f3d2cb3 commit c2c255a
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 14 deletions.
1 change: 1 addition & 0 deletions app/models/dependency.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
class Dependency < ApplicationRecord
belongs_to :rubygem, optional: true
belongs_to :version
has_one :version_rubygem, through: :version, source: :rubygem

before_validation :use_gem_dependency,
:use_existing_rubygem,
Expand Down
18 changes: 4 additions & 14 deletions app/models/rubygem.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ class Rubygem < ApplicationRecord
has_many :audits, as: :auditable, inverse_of: :auditable
has_many :link_verifications, as: :linkable, inverse_of: :linkable, dependent: :destroy
has_many :oidc_rubygem_trusted_publishers, class_name: "OIDC::RubygemTrustedPublisher", inverse_of: :rubygem, dependent: :destroy
has_many :incoming_dependencies, -> { where(versions: { indexed: true, position: 0 }) }, class_name: "Dependency", inverse_of: :rubygem
has_many :reverse_dependencies, through: :incoming_dependencies, source: :version_rubygem
has_many :reverse_development_dependencies, -> { merge(Dependency.development) }, through: :incoming_dependencies, source: :version_rubygem
has_many :reverse_runtime_dependencies, -> { merge(Dependency.runtime) }, through: :incoming_dependencies, source: :version_rubygem

validates :name,
length: { maximum: Gemcutter::MAX_FIELD_LENGTH },
Expand Down Expand Up @@ -341,20 +345,6 @@ def release_reserved_namespace!
update_attribute(:updated_at, 101.days.ago)
end

def reverse_dependencies
self.class.joins("inner join versions as v on v.rubygem_id = rubygems.id
inner join dependencies as d on d.version_id = v.id").where("v.indexed = 't'
and v.position = 0 and d.rubygem_id = ?", id)
end

def reverse_development_dependencies
reverse_dependencies.where("d.scope = 'development'")
end

def reverse_runtime_dependencies
reverse_dependencies.where("d.scope ='runtime'")
end

def metadata_mfa_required?
latest_version&.rubygems_metadata_mfa_required?
end
Expand Down

0 comments on commit c2c255a

Please sign in to comment.