Sha256: 2adbbff4628a38cd276a2226fd125c4f71be36663f8e93acb701e93ffa0e94e5

Contents?: true

Size: 1.91 KB

Versions: 16

Compression:

Stored size: 1.91 KB

Contents

class Card
  module ViewCache
    class << self
      SIZE = 500
      LIMIT = 1000 # reduce cache size to SIZE if LIMIT is reached
      CNT_KEY = 'view_cache_cnt'
      FREQUENCY_KEY = 'view_cache_frequency'

      def cache
        Card::Cache[Card::ViewCache]
      end

      def increment_cnt
        cache.write(CNT_KEY, count+1)
      end

      def count
        cache.read(CNT_KEY) || 0
      end

      def reduce_cache
        update_frequency do |freq|
          cnts_with_key = freq.keys.map { |key| [freq[key], key] }
          index = 1
          SortedSet.new(cnts_with_key).each do |cnt, key|
            if index < (LIMIT - SIZE)
              cache.delete(key)
              freq.delete(key)
            else
              freq[key] = 0
            end
            index += 1
          end
        end
      end

      def update_frequency
        freq = cache.read(FREQUENCY_KEY) || {}
        yield(freq)
        cache.write(FREQUENCY_KEY, freq)
      end

      def fetch(format, view, args, &block)
        if !Card.config.view_cache || !format.view_caching? || !format.main? ||  (view != :open && view != :content) || format.class != HtmlFormat
          return block.call
        end

        roles = Card::Auth.current.all_roles.sort.join '_'
        key = "view_#{view}_#{format.card.key}_args_#{Card::Cache.obj_to_key(args)}_roles_#{roles}"

        if !cache.exist?(key)
          increment_cnt
          reduce_cache if count > LIMIT
        end

        update_frequency do |freq|
          freq[key] ||= 0
          freq[key] += 1
        end

        if Card.config.view_cache == 'debug'
          if cache.exist? key
            "fetched from view cache: #{cache.read key}"
          else
            "written to view cache: #{cache.fetch(key, &block)}"
          end
        else
          cache.fetch(key, &block)
        end
      end

      def reset hard=false
        cache.reset hard
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
card-1.16.15 lib/card/view_cache.rb
card-1.16.14 lib/card/view_cache.rb
card-1.16.13 lib/card/view_cache.rb
card-1.16.12 lib/card/view_cache.rb
card-1.16.11 lib/card/view_cache.rb
card-1.16.10 lib/card/view_cache.rb
card-1.16.9 lib/card/view_cache.rb
card-1.16.8 lib/card/view_cache.rb
card-1.16.7 lib/card/view_cache.rb
card-1.16.6 lib/card/view_cache.rb
card-1.16.5 lib/card/view_cache.rb
card-1.16.4 lib/card/view_cache.rb
card-1.16.3 lib/card/view_cache.rb
card-1.16.2 lib/card/view_cache.rb
card-1.16.1 lib/card/view_cache.rb
card-1.16.0 lib/card/view_cache.rb