File: counter_cache.rb

package info (click to toggle)
ruby-bullet 7.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 836 kB
  • sloc: ruby: 6,133; javascript: 57; sh: 27; makefile: 4
file content (67 lines) | stat: -rw-r--r-- 2,266 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# frozen_string_literal: true

module Bullet
  module Detector
    class CounterCache < Base
      class << self
        def add_counter_cache(object, associations)
          return unless Bullet.start?
          return unless Bullet.counter_cache_enable?
          return unless object.bullet_primary_key_value

          Bullet.debug(
            'Detector::CounterCache#add_counter_cache',
            "object: #{object.bullet_key}, associations: #{associations}"
          )
          create_notification object.class.to_s, associations if conditions_met?(object, associations)
        end

        def add_possible_objects(object_or_objects)
          return unless Bullet.start?
          return unless Bullet.counter_cache_enable?

          objects = Array.wrap(object_or_objects)
          return if objects.map(&:bullet_primary_key_value).compact.empty?

          Bullet.debug(
            'Detector::CounterCache#add_possible_objects',
            "objects: #{objects.map(&:bullet_key).join(', ')}"
          )
          objects.each { |object| possible_objects.add object.bullet_key }
        end

        def add_impossible_object(object)
          return unless Bullet.start?
          return unless Bullet.counter_cache_enable?
          return unless object.bullet_primary_key_value

          Bullet.debug('Detector::CounterCache#add_impossible_object', "object: #{object.bullet_key}")
          impossible_objects.add object.bullet_key
        end

        def conditions_met?(object, _associations)
          possible_objects.include?(object.bullet_key) && !impossible_objects.include?(object.bullet_key)
        end

        def possible_objects
          Thread.current[:bullet_counter_possible_objects]
        end

        def impossible_objects
          Thread.current[:bullet_counter_impossible_objects]
        end

        private

        def create_notification(klazz, associations)
          notify_associations = Array.wrap(associations) - Bullet.get_safelist_associations(:counter_cache, klazz)

          if notify_associations.present?
            notice = Bullet::Notification::CounterCache.new klazz, notify_associations
            Bullet.notification_collector.add notice
          end
        end
      end
    end
  end
end