Module: WebTestingSegmentUtil

Defined in:
lib/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.rb

Class Method Summary collapse

Class Method Details

.evaluate_web_testing_campaign_variation(campaign_variation_operand, assigned_variations_by_campaign_id) ⇒ Object

Evaluates campaignVariation operand encoding:

  • "!C" — user is not in campaign C (no entry in map)
  • "C_!V" — user is in campaign C and assigned variation is not V
  • "C_V" — user is in campaign C with variation V
  • "C" (digits only) — user is in campaign C (any variation)


108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.rb', line 108

def evaluate_web_testing_campaign_variation(campaign_variation_operand, assigned_variations_by_campaign_id)
  assignments = assigned_variations_by_campaign_id || {}

  # match type !C
  if match = /^!(\d+)$/.match(campaign_variation_operand)
    campaign_id = match[1]
    return { result: !assignments.key?(campaign_id), invalid_format: false }
  end

  # match type C_!V
  if match = /^(\d+)_!(\d+)$/.match(campaign_variation_operand)
    campaign_id = match[1]
    variation_id = match[2]
    if !assignments.key?(campaign_id)
      return { result: false, invalid_format: false }
    end
    return { result: assignments[campaign_id] != variation_id, invalid_format: false }
  end
  
  # match type C_V
  if match = /^(\d+)_(\d+)$/.match(campaign_variation_operand)
    campaign_id = match[1]
    variation_id = match[2]
    if !assignments.key?(campaign_id)
      return { result: false, invalid_format: false }
    end
    return { result: assignments[campaign_id] == variation_id, invalid_format: false }
  end
  
  # match type C
  if match = /^(\d+)$/.match(campaign_variation_operand)
    campaign_id = match[1]
    return { result: assignments.key?(campaign_id), invalid_format: false }
  end

  { result: false, invalid_format: true }
end

.normalize_web_testing_campaigns_map(raw_assignments) ⇒ Hash

Normalizes Web Testing campaign map keys and variation values to strings.

Parameters:

  • raw_assignments (Hash)

    The raw assignments map from the context.

Returns:

  • (Hash)

    The normalized assignments map with campaign_id as key and variation_id as value.



26
27
28
29
30
31
32
33
34
# File 'lib/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.rb', line 26

def normalize_web_testing_campaigns_map(raw_assignments)
  campaign_id_to_variation_id = {}
  raw_assignments.each do |campaign_id, assigned_variation_id|
    unless assigned_variation_id.nil? || campaign_id.to_s.empty?
      campaign_id_to_variation_id[campaign_id.to_s] = assigned_variation_id.to_s
    end
  end
  campaign_id_to_variation_id
end

.parse_web_testing_campaigns_from_context(context) ⇒ Hash?

Parses context.platform_variables[:webTestingCampaigns] (JSON string or plain object).

Parameters:

Returns:

  • (Hash, nil)


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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.rb', line 39

def parse_web_testing_campaigns_from_context(context)
  platform_variables = context.get_platform_variables || {}
  # support both string and symbol keys
  web_testing_campaigns_input = platform_variables[:webTestingCampaigns] || platform_variables['webTestingCampaigns']

  if web_testing_campaigns_input.nil?
    return nil
  end

  if web_testing_campaigns_input.is_a?(Hash)
    return normalize_web_testing_campaigns_map(web_testing_campaigns_input)
  end

  if web_testing_campaigns_input.is_a?(String)
    trimmed_json = web_testing_campaigns_input.strip
    if trimmed_json.empty?
      return nil
    end

    begin
      # Check for duplicate keys using regex
      all_campaign_id_tokens = trimmed_json.scan(/"([^"\\]*)"\s*:/).flatten
      if all_campaign_id_tokens.any?
        campaign_ids = all_campaign_id_tokens
        has_duplicate_campaign_id = campaign_ids.length != campaign_ids.uniq.length
        if has_duplicate_campaign_id
          LoggerService.log(
            LogLevelEnum::ERROR,
            'INVALID_WEB_TESTING_CAMPAIGNS_DUPLICATE_KEY',
            { an: ApiEnum::GET_FLAG, uuid: context.get_uuid, sId: context.get_session_id }
          )
        end
      end

      parsed_assignments = JSON.parse(trimmed_json)
      if parsed_assignments.is_a?(Hash)
        return normalize_web_testing_campaigns_map(parsed_assignments)
      end

      LoggerService.log(
        LogLevelEnum::ERROR,
        'INVALID_WEB_TESTING_CAMPAIGNS_JSON',
        { an: ApiEnum::GET_FLAG, uuid: context.get_uuid, sId: context.get_session_id }
      )
    rescue JSON::ParserError
      LoggerService.log(
        LogLevelEnum::ERROR,
        'INVALID_WEB_TESTING_CAMPAIGNS_JSON',
        { an: ApiEnum::GET_FLAG, uuid: context.get_uuid, sId: context.get_session_id }
      )
    end
    return nil
  end

  # For array, numeric, boolean etc.
  kind = web_testing_campaigns_input.is_a?(Array) ? 'array' : DataTypeUtil.get_type(web_testing_campaigns_input).downcase
  LoggerService.log(
    LogLevelEnum::ERROR,
    'INVALID_WEB_TESTING_CAMPAIGNS_TYPE',
    { kind: kind, an: ApiEnum::GET_FLAG, uuid: context.get_uuid, sId: context.get_session_id }
  )
  nil
end