Class: Optimizely::OptimizelyUserContext

Inherits:
Object
  • Object
show all
Defined in:
lib/optimizely/optimizely_user_context.rb

Defined Under Namespace

Classes: OptimizelyDecisionContext, OptimizelyForcedDecision

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(optimizely_client, user_id, user_attributes) ⇒ OptimizelyUserContext



29
30
31
32
33
34
35
36
37
38
# File 'lib/optimizely/optimizely_user_context.rb', line 29

def initialize(optimizely_client, user_id, user_attributes)
  @attr_mutex = Mutex.new
  @forced_decision_mutex = Mutex.new
  @qualified_segment_mutex = Mutex.new
  @optimizely_client = optimizely_client
  @user_id = user_id
  @user_attributes = user_attributes.nil? ? {} : user_attributes.clone
  @forced_decisions = {}
  @qualified_segments = []
end

Instance Attribute Details

#forced_decisionsObject (readonly)

Representation of an Optimizely User Context using which APIs are to be called.



25
26
27
# File 'lib/optimizely/optimizely_user_context.rb', line 25

def forced_decisions
  @forced_decisions
end

#optimizely_clientObject (readonly)

Representation of an Optimizely User Context using which APIs are to be called.



25
26
27
# File 'lib/optimizely/optimizely_user_context.rb', line 25

def optimizely_client
  @optimizely_client
end

#user_idObject (readonly)

Representation of an Optimizely User Context using which APIs are to be called.



25
26
27
# File 'lib/optimizely/optimizely_user_context.rb', line 25

def user_id
  @user_id
end

Instance Method Details

#as_jsonObject



167
168
169
170
171
172
# File 'lib/optimizely/optimizely_user_context.rb', line 167

def as_json
  {
    user_id: @user_id,
    attributes: @user_attributes
  }
end

#cloneObject



40
41
42
43
44
45
# File 'lib/optimizely/optimizely_user_context.rb', line 40

def clone
  user_context = OptimizelyUserContext.new(@optimizely_client, @user_id, user_attributes)
  @forced_decision_mutex.synchronize { user_context.instance_variable_set('@forced_decisions', @forced_decisions.dup) unless @forced_decisions.empty? }
  @qualified_segment_mutex.synchronize { user_context.instance_variable_set('@qualified_segments', @qualified_segments.dup) unless @qualified_segments.empty? }
  user_context
end

#decide(key, options = nil) ⇒ OptimizelyDecision

Returns a decision result (OptimizelyDecision) for a given flag key and a user context, which contains all data required to deliver the flag.

If the SDK finds an error, it’ll return a ‘decision` with nil for `variation_key`. The decision will include an error message in `reasons`



69
70
71
# File 'lib/optimizely/optimizely_user_context.rb', line 69

def decide(key, options = nil)
  @optimizely_client&.decide(clone, key, options)
end

#decide_all(options = nil) ⇒ Object

Returns a hash of decision results (OptimizelyDecision) for all active flag keys.



93
94
95
# File 'lib/optimizely/optimizely_user_context.rb', line 93

def decide_all(options = nil)
  @optimizely_client&.decide_all(clone, options)
end

#decide_for_keys(keys, options = nil) ⇒ Object

Returns a hash of decision results (OptimizelyDecision) for multiple flag keys and a user context.

If the SDK finds an error for a key, the response will include a decision for the key showing ‘reasons` for the error. The SDK will always return hash of decisions. When it can not process requests, it’ll return an empty hash after logging the errors.



83
84
85
# File 'lib/optimizely/optimizely_user_context.rb', line 83

def decide_for_keys(keys, options = nil)
  @optimizely_client&.decide_for_keys(clone, keys, options)
end

#find_forced_decision(context) ⇒ Object



113
114
115
116
117
118
119
# File 'lib/optimizely/optimizely_user_context.rb', line 113

def find_forced_decision(context)
  return nil if @forced_decisions.empty?

  decision = nil
  @forced_decision_mutex.synchronize { decision = @forced_decisions[context] }
  decision
end

#get_forced_decision(context) ⇒ Object

Returns the forced decision for a given flag and an optional rule.



127
128
129
# File 'lib/optimizely/optimizely_user_context.rb', line 127

def get_forced_decision(context)
  find_forced_decision(context)
end

#qualified_for?(segment) ⇒ Boolean

Checks if user is qualified for the provided segment.



198
199
200
201
202
# File 'lib/optimizely/optimizely_user_context.rb', line 198

def qualified_for?(segment)
  return false if @qualified_segments.empty?

  @qualified_segment_mutex.synchronize { @qualified_segments.include?(segment) }
end

#qualified_segmentsObject

Returns An array of qualified segments for this user



182
183
184
# File 'lib/optimizely/optimizely_user_context.rb', line 182

def qualified_segments
  @qualified_segment_mutex.synchronize { @qualified_segments.clone }
end

#qualified_segments=(segments) ⇒ Object

Replace qualified segments with provided segments



190
191
192
# File 'lib/optimizely/optimizely_user_context.rb', line 190

def qualified_segments=(segments)
  @qualified_segment_mutex.synchronize { @qualified_segments = segments.clone }
end

#remove_all_forced_decisionsObject

Removes all forced decisions bound to this user context.



152
153
154
155
156
157
# File 'lib/optimizely/optimizely_user_context.rb', line 152

def remove_all_forced_decisions
  return false if @optimizely_client&.get_optimizely_config.nil?

  @forced_decision_mutex.synchronize { @forced_decisions.clear }
  true
end

#remove_forced_decision(context) ⇒ Object

Removes the forced decision for a given flag and an optional rule.



137
138
139
140
141
142
143
144
145
146
# File 'lib/optimizely/optimizely_user_context.rb', line 137

def remove_forced_decision(context)
  deleted = false
  @forced_decision_mutex.synchronize do
    if @forced_decisions.key?(context)
      @forced_decisions.delete(context)
      deleted = true
    end
  end
  deleted
end

#set_attribute(attribute_key, attribute_value) ⇒ Object

Set an attribute for a given key



56
57
58
# File 'lib/optimizely/optimizely_user_context.rb', line 56

def set_attribute(attribute_key, attribute_value)
  @attr_mutex.synchronize { @user_attributes[attribute_key] = attribute_value }
end

#set_forced_decision(context, decision) ⇒ Object

Sets the forced decision (variation key) for a given flag and an optional rule.



104
105
106
107
108
109
110
111
# File 'lib/optimizely/optimizely_user_context.rb', line 104

def set_forced_decision(context, decision)
  flag_key = context[:flag_key]
  return false if flag_key.nil?

  @forced_decision_mutex.synchronize { @forced_decisions[context] = decision }

  true
end

#to_json(*args) ⇒ Object



174
175
176
# File 'lib/optimizely/optimizely_user_context.rb', line 174

def to_json(*args)
  as_json.to_json(*args)
end

#track_event(event_key, event_tags = nil) ⇒ Object

Track an event



163
164
165
# File 'lib/optimizely/optimizely_user_context.rb', line 163

def track_event(event_key, event_tags = nil)
  @optimizely_client&.track(event_key, @user_id, user_attributes, event_tags)
end

#user_attributesObject



47
48
49
# File 'lib/optimizely/optimizely_user_context.rb', line 47

def user_attributes
  @attr_mutex.synchronize { @user_attributes.clone }
end