class Bullet::Detector::UnusedEagerLoading

def add_eager_loadings(objects, associations)

def add_eager_loadings(objects, associations)
  return unless Bullet.start?
  return unless Bullet.unused_eager_loading_enable?
  return if objects.map(&:bullet_primary_key_value).compact.empty?
  Bullet.debug(
    'Detector::UnusedEagerLoading#add_eager_loadings',
    "objects: #{objects.map(&:bullet_key).join(', ')}, associations: #{associations}"
  )
  bullet_keys = objects.map(&:bullet_key)
  to_add = []
  to_merge = []
  to_delete = []
  eager_loadings.each do |k, _v|
    key_objects_overlap = k & bullet_keys
    next if key_objects_overlap.empty?
    bullet_keys -= k
    if key_objects_overlap == k
      to_add << [k, associations]
    else
      to_merge << [key_objects_overlap, (eager_loadings[k].dup << associations)]
      keys_without_objects = k - key_objects_overlap
      to_merge << [keys_without_objects, eager_loadings[k]]
      to_delete << k
    end
  end
  to_add.each { |k, val| eager_loadings.add k, val }
  to_merge.each { |k, val| eager_loadings.merge k, val }
  to_delete.each { |k| eager_loadings.delete k }
  eager_loadings.add bullet_keys, associations unless bullet_keys.empty?
end