@@ -44,13 +44,7 @@ def evaluate_segments(evaluation_context)
4444 identity_segments = get_segments_from_context ( evaluation_context )
4545
4646 segments = identity_segments . map do |segment |
47- result = {
48- name : segment [ :name ]
49- }
50-
51- result [ :metadata ] = segment [ :metadata ] if segment [ :metadata ]
52-
53- result
47+ { name : segment [ :name ] , metadata : segment [ :metadata ] } . compact
5448 end
5549
5650 segment_overrides = process_segment_overrides ( identity_segments )
@@ -59,15 +53,11 @@ def evaluate_segments(evaluation_context)
5953 end
6054
6155 # Returns Record<string: override.name, SegmentOverride>
62- def process_segment_overrides ( identity_segments )
56+ def process_segment_overrides ( identity_segments ) # rubocop:disable Metrics/MethodLength
6357 segment_overrides = { }
6458
6559 identity_segments . each do |segment |
66- next unless segment [ :overrides ]
67-
68- overrides_list = segment [ :overrides ] . is_a? ( Array ) ? segment [ :overrides ] : [ ]
69-
70- overrides_list . each do |override |
60+ Array ( segment [ :overrides ] ) . each do |override |
7161 next unless should_apply_override ( override , segment_overrides )
7262
7363 segment_overrides [ override [ :name ] ] = {
@@ -82,33 +72,15 @@ def process_segment_overrides(identity_segments)
8272
8373 # returns EvaluationResultFlags<Metadata>
8474 def evaluate_features ( evaluation_context , segment_overrides )
85- flags = { }
75+ identity_key = get_identity_key ( evaluation_context )
8676
87- ( evaluation_context [ :features ] || { } ) . each_value do |feature |
77+ ( evaluation_context [ :features ] || { } ) . each_with_object ( { } ) do |( _ , feature ) , flags |
8878 segment_override = segment_overrides [ feature [ :name ] ]
8979 final_feature = segment_override ? segment_override [ :feature ] : feature
90- has_override = !segment_override . nil?
91-
92- # Evaluate feature value
93- evaluated = evaluate_feature_value ( final_feature , get_identity_key ( evaluation_context ) )
94-
95- # Build flag result
96- flag_result = {
97- name : final_feature [ :name ] ,
98- enabled : final_feature [ :enabled ] ,
99- value : evaluated [ :value ]
100- }
101-
102- # Add metadata if present
103- flag_result [ :metadata ] = final_feature [ :metadata ] if final_feature [ :metadata ]
10480
105- # Set reason
106- flag_result [ :reason ] = evaluated [ :reason ] ||
107- ( has_override ? "#{ TARGETING_REASON_TARGETING_MATCH } ; segment=#{ segment_override [ :segment_name ] } " : TARGETING_REASON_DEFAULT )
81+ flag_result = build_flag_result ( final_feature , identity_key , segment_override )
10882 flags [ final_feature [ :name ] . to_sym ] = flag_result
10983 end
110-
111- flags
11284 end
11385
11486 # Returns {value: any; reason?: string}
@@ -123,19 +95,19 @@ def get_multivariate_feature_value(feature, identity_key)
12395 percentage_value = hashed_percentage_for_object_ids ( [ feature [ :key ] , identity_key ] )
12496 sorted_variants = ( feature [ :variants ] || [ ] ) . sort_by { |v | v [ :priority ] || WEAKEST_PRIORITY }
12597
98+ variant = find_matching_variant ( sorted_variants , percentage_value )
99+ variant || { value : feature [ :value ] , reason : nil }
100+ end
101+
102+ def find_matching_variant ( sorted_variants , percentage_value )
126103 start_percentage = 0
127104 sorted_variants . each do |variant |
128105 limit = start_percentage + variant [ :weight ]
129- if start_percentage <= percentage_value && percentage_value < limit
130- return {
131- value : variant [ :value ] ,
132- reason : "#{ TARGETING_REASON_SPLIT } ; weight=#{ variant [ :weight ] } "
133- }
134- end
106+ return { value : variant [ :value ] , reason : "#{ TARGETING_REASON_SPLIT } ; weight=#{ variant [ :weight ] } " } if start_percentage <= percentage_value && percentage_value < limit
107+
135108 start_percentage = limit
136109 end
137-
138- { value : feature [ :value ] , reason : nil }
110+ nil
139111 end
140112
141113 # returns boolean
@@ -144,12 +116,22 @@ def should_apply_override(override, existing_overrides)
144116 !current_override || stronger_priority? ( override [ :priority ] , current_override [ :feature ] [ :priority ] )
145117 end
146118
147- def stronger_priority? ( priority_a , priority_b )
148- ( priority_a || WEAKEST_PRIORITY ) < ( priority_b || WEAKEST_PRIORITY )
149- end
150-
151119 private
152120
121+ def build_flag_result ( feature , identity_key , segment_override )
122+ evaluated = evaluate_feature_value ( feature , identity_key )
123+
124+ flag_result = {
125+ name : feature [ :name ] ,
126+ enabled : feature [ :enabled ] ,
127+ value : evaluated [ :value ] ,
128+ reason : evaluated [ :reason ] || ( segment_override ? "#{ TARGETING_REASON_TARGETING_MATCH } ; segment=#{ segment_override [ :segment_name ] } " : TARGETING_REASON_DEFAULT )
129+ }
130+
131+ flag_result [ :metadata ] = feature [ :metadata ] if feature [ :metadata ]
132+ flag_result
133+ end
134+
153135 # Extract identity key from evaluation context
154136 #
155137 # @param evaluation_context [Hash] The evaluation context
@@ -159,5 +141,9 @@ def get_identity_key(evaluation_context)
159141
160142 evaluation_context [ :identity ] [ :key ]
161143 end
144+
145+ def stronger_priority? ( priority_a , priority_b )
146+ ( priority_a || WEAKEST_PRIORITY ) < ( priority_b || WEAKEST_PRIORITY )
147+ end
162148 end
163149end
0 commit comments