Class: Publication::MostRecentRevisionLookup

Inherits:
Object
  • Object
show all
Defined in:
app/services/publication/most_recent_revision_lookup.rb

Overview

Service to efficiently precompute most recent revisions for a collection of publications.
This avoids N+1 queries by computing all revisions in a single database query.

Usage:
lookup = Publication::MostRecentRevisionLookup.new(publications)
most_recent_revisions = lookup.lookup_hash
most_recent = most_recent_revisions[publication.id]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(publications) ⇒ MostRecentRevisionLookup

Returns a new instance of MostRecentRevisionLookup.



14
15
16
# File 'app/services/publication/most_recent_revision_lookup.rb', line 14

def initialize(publications)
  @publications = publications
end

Instance Attribute Details

#publicationsObject (readonly)

Returns the value of attribute publications.



12
13
14
# File 'app/services/publication/most_recent_revision_lookup.rb', line 12

def publications
  @publications
end

Instance Method Details

#lookup_hashObject

Returns a hash mapping publication ID -> most recent revision (Item object)
If the publication IS the most recent revision, the value will be nil to indicate "no newer revision"



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/services/publication/most_recent_revision_lookup.rb', line 20

def lookup_hash
  return {} if publications.blank?

  # Extract canonical SKUs from the current publications
  publication_ids = publications.map(&:id)
  canonical_skus_map = publications.to_h { |pub| [pub.id, extract_canonical_sku(pub.sku)] }

  # Get unique canonical SKUs
  unique_canonical_skus = canonical_skus_map.values.uniq

  # Build a single query to find the most recent revision for each canonical SKU
  # Using a subquery with DISTINCT ON for efficiency
  most_recent_by_canonical = find_most_recent_revisions(unique_canonical_skus)

  # Build the lookup hash
  result = {}
  publications.each do |pub|
    canonical_sku = canonical_skus_map[pub.id]
    most_recent = most_recent_by_canonical[canonical_sku]

    # Only return a value if there's a different, newer revision
    result[pub.id] = most_recent if most_recent && most_recent.id != pub.id
  end

  result
end