Skip to content

Commit 867342b

Browse files
committed
Fix impression event
1 parent 2f3ec50 commit 867342b

3 files changed

Lines changed: 30 additions & 10 deletions

File tree

lib/optimizely.rb

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,16 @@ def create_optimizely_decision(user_context, flag_key, decision, reasons, decide
220220
decision_source = decision.source
221221
end
222222

223+
# For holdout decisions, ensure campaign_id is empty string, not nil
224+
campaign_id = nil
225+
if decision_source == Optimizely::DecisionService::DECISION_SOURCES['HOLDOUT']
226+
campaign_id = ''
227+
elsif experiment
228+
campaign_id = experiment['campaignId'] || experiment['layerId']
229+
end
230+
223231
if !decide_options.include?(OptimizelyDecideOption::DISABLE_DECISION_EVENT) && (decision_source == Optimizely::DecisionService::DECISION_SOURCES['FEATURE_TEST'] || decision_source == Optimizely::DecisionService::DECISION_SOURCES['HOLDOUT'] || config.send_flag_decisions)
224-
send_impression(config, experiment, variation_key || '', flag_key, rule_key || '', feature_enabled, decision_source, user_id, attributes, decision&.cmab_uuid)
232+
send_impression(config, experiment, variation_key || '', flag_key, rule_key || '', feature_enabled, decision_source, user_id, attributes, decision&.cmab_uuid, campaign_id)
225233
decision_event_dispatched = true
226234
end
227235

@@ -1274,10 +1282,8 @@ def send_impression(config, experiment, variation_key, flag_key, rule_key, enabl
12741282
# For holdout decisions, filter attributes to only include $opt_bot_filtering
12751283
filtered_attributes = attributes
12761284
if rule_type == Optimizely::DecisionService::DECISION_SOURCES['HOLDOUT']
1277-
filtered_attributes = {}
1278-
if attributes && attributes.is_a?(Hash)
1279-
filtered_attributes['$opt_bot_filtering'] = attributes['$opt_bot_filtering'] if attributes['$opt_bot_filtering']
1280-
end
1285+
bot_filtering = attributes&.dig('$opt_bot_filtering')
1286+
filtered_attributes = bot_filtering ? { '$opt_bot_filtering' => bot_filtering } : {}
12811287
end
12821288

12831289
metadata = {
@@ -1286,7 +1292,7 @@ def send_impression(config, experiment, variation_key, flag_key, rule_key, enabl
12861292
rule_type: rule_type,
12871293
variation_key: variation_key
12881294
}
1289-
1295+
12901296
# Only include enabled field for non-holdout rule types
12911297
metadata[:enabled] = enabled unless rule_type == Optimizely::DecisionService::DECISION_SOURCES['HOLDOUT']
12921298
metadata[:cmab_uuid] = cmab_uuid unless cmab_uuid.nil?

lib/optimizely/decision_service.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,13 @@ def get_decision_for_flag(feature_flag, user_context, project_config, decide_opt
196196
# Check holdouts
197197
holdouts = project_config.get_holdouts_for_flag(feature_flag['id'])
198198

199-
holdouts.each do |holdout|
199+
# Sort holdouts: global holdouts (empty includedFlags) should be evaluated first
200+
sorted_holdouts = holdouts.sort_by do |holdout|
201+
included_flags = holdout['includedFlags'] || []
202+
included_flags.empty? ? 0 : 1
203+
end
204+
205+
sorted_holdouts.each do |holdout|
200206
holdout_decision = get_variation_for_holdout(holdout, user_context, project_config)
201207
reasons.push(*holdout_decision.reasons)
202208

@@ -314,7 +320,7 @@ def get_variations_for_feature_list(project_config, feature_flags, user_context,
314320
feature_flags.each do |feature_flag|
315321
# check if the feature is being experiment on and whether the user is bucketed into the experiment
316322
holdouts = project_config.get_holdouts_for_flag(feature_flag['id'])
317-
323+
318324
if holdouts && !holdouts.empty?
319325
decision_result = get_decision_for_flag(feature_flag, user_context, project_config, decide_options, user_profile_tracker)
320326
else

lib/optimizely/event_builder.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,22 @@ def get_impression_params(project_config, experiment, variation_id)
171171
experiment_key = experiment['key']
172172
experiment_id = experiment['id']
173173

174+
campaign_id = experiment&.dig('campaignId') || experiment&.dig('layerId')
175+
if decision_source == Optimizely::DecisionService::DECISION_SOURCES['HOLDOUT']
176+
campaign_id = ''
177+
entity_id = ''
178+
else
179+
entity_id = campaign_id
180+
end
181+
174182
{
175183
decisions: [{
176-
campaign_id: project_config.experiment_key_map[experiment_key]['layerId'],
184+
campaign_id: campaign_id
177185
experiment_id: experiment_id,
178186
variation_id: variation_id
179187
}],
180188
events: [{
181-
entity_id: project_config.experiment_key_map[experiment_key]['layerId'],
189+
entity_id: entity_id,
182190
timestamp: create_timestamp,
183191
key: ACTIVATE_EVENT_KEY,
184192
uuid: create_uuid

0 commit comments

Comments
 (0)