From dd67946b18f95a36c0337c08ac517751b3241c66 Mon Sep 17 00:00:00 2001 From: wadii Date: Thu, 7 May 2026 10:18:25 +0200 Subject: [PATCH] fix: respect rule type for sub-rules in segment evaluation Sub-rules were always evaluated with ALL logic, ignoring the parent rule's type field (ANY/ALL/NONE). Now uses type-aware matching for sub-rules, matching the existing conditions behavior. Bumps engine-test-data from v3.5.0 to v3.7.0 which includes test cases for this fix. Equivalent fix to flagsmith-engine#313. Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitmodules | 2 +- lib/flagsmith/engine/segments/evaluator.rb | 5 +++-- spec/engine-test-data | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index 6b07f5f..b2bee4c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "spec/engine-test-data"] path = spec/engine-test-data url = git@github.com:Flagsmith/engine-test-data.git - branch = v3.5.0 + branch = v3.7.0 diff --git a/lib/flagsmith/engine/segments/evaluator.rb b/lib/flagsmith/engine/segments/evaluator.rb index a9402f3..1deaadf 100644 --- a/lib/flagsmith/engine/segments/evaluator.rb +++ b/lib/flagsmith/engine/segments/evaluator.rb @@ -93,7 +93,7 @@ def traits_match_segment_rule(identity_traits, rule, segment_id, identity_id) end matches_conditions && - rule.rules.all? { |r| traits_match_segment_rule(identity_traits, r, segment_id, identity_id) } + rule.rules.send(rule.matching_function) { |r| traits_match_segment_rule(identity_traits, r, segment_id, identity_id) } end # rubocop:enable Metrics/MethodLength @@ -137,9 +137,10 @@ def evaluate_conditions_from_context(rule, segment_key, context) def evaluate_sub_rules_from_context(rule, segment_key, context) return true if rule[:rules].nil? || rule[:rules].empty? - rule[:rules].all? do |sub_rule| + sub_rule_results = rule[:rules].map do |sub_rule| traits_match_segment_rule_from_context(sub_rule, segment_key, context) end + evaluate_rule_conditions(rule[:type], sub_rule_results) end # Evaluates a single segment condition using context diff --git a/spec/engine-test-data b/spec/engine-test-data index 7840a13..4b29dc7 160000 --- a/spec/engine-test-data +++ b/spec/engine-test-data @@ -1 +1 @@ -Subproject commit 7840a1349b601df3b6b4a089f40864f659801afb +Subproject commit 4b29dc772a764364af2dd504ecefbdf74cf5473f