Sha256: 8ed5890e171a36b32fb42f3f1734b87b50c478426883c256fdc9f22457b851ea

Contents?: true

Size: 1.41 KB

Versions: 4

Compression:

Stored size: 1.41 KB

Contents

module Tally
  # Contains all keys set for the given day
  #
  # Can be used to iterate over a large amount of smembers in the daily set
  class Daily < KeyFinder

    def daily_key
      "#{ Tally.config.prefix }@#{ day_key }"
    end

    private

      def all_keys
        @keys ||= build_keys_from_redis
      end

      def build_keys_from_redis
        result = []
        cursor = ""

        scan = scan_from_redis

        while cursor != "0"
          result << scan.last
          cursor = scan.first

          scan = scan_from_redis(cursor: cursor)
        end

        result.flatten
      end

      def day_key
        @day_key ||= day.strftime(Tally.config.date_format)
      end

      def entry_regex
        @entry_regex ||= Regexp.new("(?<record>[^:]+:[\\d]+)?:?(?<key>[^:]+)")
      end

      def scan_from_redis(cursor: "0")
        Tally.redis do |conn|
          conn.sscan(daily_key, cursor, match: scan_key, count: 25)
        end
      end

      def scan_key
        @scan_key ||= if key.present? && record.present?
          "#{ record.model_name.i18n_key }:#{ record.id }:#{ key }"
        elsif key.present? && type.present?
          "#{ type }:*:#{ key }"
        elsif record.present?
          "#{ record.model_name.i18n_key }:#{ record.id }:*"
        elsif type.present?
          "#{ type }:*:*"
        elsif key.present?
          "*#{ key }"
        else
          "*"
        end
      end

  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
tally-1.0.2 lib/tally/daily.rb
tally-1.0.1 lib/tally/daily.rb
tally-1.0.0 lib/tally/daily.rb
tally-1.0.0.beta1 lib/tally/daily.rb