Class: SplitIoClient::Cache::Repositories::Impressions::RedisRepository

Inherits:
SplitIoClient::Cache::Repository show all
Defined in:
lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb

Constant Summary collapse

IMPRESSIONS_SLICE =
1000

Instance Method Summary collapse

Methods inherited from SplitIoClient::Cache::Repository

#set_string, #string

Constructor Details

#initialize(adapter, config) ⇒ RedisRepository

Returns a new instance of RedisRepository.



8
9
10
11
# File 'lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb', line 8

def initialize(adapter, config)
  @adapter = adapter
  @config = config
end

Instance Method Details

#add(split_name, data) ⇒ Object

Store impression data in Redis



14
15
16
17
18
19
# File 'lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb', line 14

def add(split_name, data)
  @adapter.add_to_set(
    impressions_metrics_key("impressions.#{split_name}"),
    data.to_json
  )
end

#add_bulk(key, bucketing_key, treatments_labels_change_numbers, time) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb', line 21

def add_bulk(key, bucketing_key, treatments_labels_change_numbers, time)
  @adapter.redis.pipelined do
    treatments_labels_change_numbers.each_slice(IMPRESSIONS_SLICE) do |treatments_labels_change_numbers_slice|
      treatments_labels_change_numbers_slice.each do |split_name, treatment_label_change_number|
        add(split_name,
            'keyName' => key,
            'bucketingKey' => bucketing_key,
            'treatment' => treatment_label_change_number[:treatment],
            'label' => @config.labels_enabled ? treatment_label_change_number[:label] : nil,
            'changeNumber' => treatment_label_change_number[:change_number],
            'time' => time)
      end
    end
  end
end

#clearObject

Get random impressions from redis in batches of size @config.impressions_queue_size, delete fetched impressions afterwards



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
# File 'lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb', line 39

def clear
  impressions = impression_keys.each_with_object([]) do |key, memo|
    ip = key.split('/')[-2] # 'prefix/sdk_lang/ip/impressions.name' -> ip
    if ip.nil?
      @config.logger.warn("Impressions IP parse error for key: #{key}")
      next
    end
    split_name = key.split('.').last
    members = @adapter.random_set_elements(key, @config.impressions_queue_size)
    members.each do |impression|
      parsed_impression = JSON.parse(impression)

      memo << {
        feature: split_name,
        impressions: parsed_impression,
        ip: ip
      }
    end

    @adapter.delete_from_set(key, members)
  end

  impressions
rescue StandardError => e
  @config.logger.error("Exception while clearing impressions cache: #{e}")
end