Class: SplitIoClient::Cache::Repositories::SplitsRepository

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from SplitIoClient::Cache::Repository

#set_string, #string

Constructor Details

#initialize(config) ⇒ SplitsRepository

Returns a new instance of SplitsRepository.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 9

def initialize(config)
  super(config)
  @tt_cache = {}
  @adapter = case @config.cache_adapter.class.to_s
  when 'SplitIoClient::Cache::Adapters::RedisAdapter'
    SplitIoClient::Cache::Adapters::CacheAdapter.new(@config)
  else
    @config.cache_adapter
  end
  unless @config.mode.equal?(:consumer)
    @adapter.set_string(namespace_key('.splits.till'), '-1')
    @adapter.initialize_map(namespace_key('.segments.registered'))
  end
end

Instance Attribute Details

#adapterObject (readonly)

Returns the value of attribute adapter.



7
8
9
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 7

def adapter
  @adapter
end

Instance Method Details

#add_split(split) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 24

def add_split(split)
  return unless split[:name]
  existing_split = get_split(split[:name])

  if(!existing_split)
    increase_tt_name_count(split[:trafficTypeName])
  elsif(existing_split[:trafficTypeName] != split[:trafficTypeName])
    increase_tt_name_count(split[:trafficTypeName])
    decrease_tt_name_count(existing_split[:trafficTypeName])
  end

  @adapter.set_string(namespace_key(".split.#{split[:name]}"), split.to_json)
end

#clearObject



125
126
127
128
129
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 125

def clear
  @tt_cache.clear

  @adapter.clear(namespace_key)
end

#exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


109
110
111
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 109

def exists?(name)
  @adapter.exists?(namespace_key(".split.#{name}"))
end

#get_change_numberObject



97
98
99
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 97

def get_change_number
  @adapter.string(namespace_key('.splits.till'))
end

#get_split(name) ⇒ Object



62
63
64
65
66
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 62

def get_split(name)
  split = @adapter.string(namespace_key(".split.#{name}"))

  JSON.parse(split, symbolize_names: true) if split
end

#get_splits(names, symbolize_names = true) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 46

def get_splits(names, symbolize_names = true)
  splits = {}
  split_names = names.map { |name| namespace_key(".split.#{name}") }
  splits.merge!(
    @adapter
      .multiple_strings(split_names)
      .map { |name, data| [name.gsub(namespace_key('.split.'), ''), data] }.to_h
  )

  splits.map do |name, data|
    parsed_data = data ? JSON.parse(data, symbolize_names: true) : nil
    split_name = symbolize_names ? name.to_sym : name
    [split_name, parsed_data]
  end.to_h
end

#kill(change_number, split_name, default_treatment) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 131

def kill(change_number, split_name, default_treatment)
  split = get_split(split_name)

  return if split.nil?

  split[:killed] = true
  split[:defaultTreatment] = default_treatment
  split[:changeNumber] = change_number

  @adapter.set_string(namespace_key(".split.#{split_name}"), split.to_json)
end

#not_ready!Object



117
118
119
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 117

def not_ready!
  @adapter.set_string(namespace_key('.splits.ready'), -1)
end

#ready!Object



121
122
123
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 121

def ready!
  @adapter.set_string(namespace_key('.splits.ready'), Time.now.utc.to_i)
end

#ready?Boolean

Returns:

  • (Boolean)


113
114
115
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 113

def ready?
  @adapter.string(namespace_key('.splits.ready')).to_i != -1
end

#remove_split(split) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 38

def remove_split(split)
  tt_name = split[:trafficTypeName]

  decrease_tt_name_count(split[:trafficTypeName])

  @adapter.delete(namespace_key(".split.#{split[:name]}"))
end

#set_change_number(since) ⇒ Object



93
94
95
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 93

def set_change_number(since)
  @adapter.set_string(namespace_key('.splits.till'), since)
end

#set_segment_names(names) ⇒ Object



101
102
103
104
105
106
107
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 101

def set_segment_names(names)
  return if names.nil? || names.empty?

  names.each do |name|
    @adapter.add_to_set(namespace_key('.segments.registered'), name)
  end
end

#split_namesObject

Return an array of Split Names excluding control keys like splits.till



88
89
90
91
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 88

def split_names
  @adapter.find_strings_by_prefix(namespace_key('.split.'))
    .map { |split| split.gsub(namespace_key('.split.'), '') }
end

#splitsObject



68
69
70
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 68

def splits
  get_splits(split_names, false)
end

#splits_countObject



143
144
145
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 143

def splits_count
  split_names.length
end

#traffic_type_exists(tt_name) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/splitclient-rb/cache/repositories/splits_repository.rb', line 72

def traffic_type_exists(tt_name)
  case @adapter
  when SplitIoClient::Cache::Adapters::CacheAdapter
    tt_count = @adapter.string(namespace_key(".trafficType.#{tt_name}"))
    begin
      !tt_count.nil? && Integer(tt_count, 10) > 0
    rescue StandardError => e
      @config.logger.error("Error while parsing Traffic Type count: #{e.message}")
      false
    end
  else
    @tt_cache.key?(tt_name) && @tt_cache[tt_name] > 0
  end
end