Skip to content

Commit 025907c

Browse files
committed
feat: Add groups context to dependency evaluation
1 parent 687bb7d commit 025907c

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

posthog/client.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,6 +1535,9 @@ def _locally_evaluate_flag(
15351535
requested_flag_keys={
15361536
key
15371537
}, # Only evaluate the requested flag and its dependencies
1538+
groups=groups,
1539+
group_properties=group_properties,
1540+
group_type_mapping=self.group_type_mapping,
15381541
)
15391542
response = all_results.get(key)
15401543
if response is not None:

posthog/dependency_graph.py

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,9 @@ def evaluate_flags_with_dependencies(
340340
properties: Dict,
341341
cohort_properties: Optional[Dict] = None,
342342
requested_flag_keys: Optional[Set[str]] = None,
343+
groups: Optional[Dict] = None,
344+
group_properties: Optional[Dict] = None,
345+
group_type_mapping: Optional[Dict] = None,
343346
) -> Dict[str, FlagValue]:
344347
"""
345348
Evaluate feature flags with dependency support.
@@ -353,6 +356,9 @@ def evaluate_flags_with_dependencies(
353356
properties: Properties for evaluation
354357
cohort_properties: Cohort properties for evaluation
355358
requested_flag_keys: Set of flag keys to evaluate (None for all)
359+
groups: Group information for group-level flag evaluation
360+
group_properties: Group properties for group-level flag evaluation
361+
group_type_mapping: Mapping from group type index to group name
356362
357363
Returns:
358364
Dict[str, FlagValue]: Map of flag keys to their evaluation results
@@ -389,14 +395,43 @@ def evaluate_flags_with_dependencies(
389395
continue
390396

391397
try:
392-
result = match_feature_flag_properties(
393-
flag_def,
394-
distinct_id,
395-
properties,
396-
cohort_properties,
397-
dependency_graph,
398-
id_to_key,
399-
)
398+
# Check if this is a group-level flag
399+
flag_filters = flag_def.get("filters", {})
400+
aggregation_group_type_index = flag_filters.get("aggregation_group_type_index")
401+
402+
if aggregation_group_type_index is not None:
403+
# This is a group-level flag
404+
_groups = groups or {}
405+
_group_properties = group_properties or {}
406+
_group_type_mapping = group_type_mapping or {}
407+
408+
group_name = _group_type_mapping.get(str(aggregation_group_type_index))
409+
if not group_name or group_name not in _groups:
410+
# Can't evaluate group flag without proper group info
411+
results[flag_key] = False
412+
dependency_graph.cache_result(flag_key, False)
413+
continue
414+
415+
focused_group_properties = _group_properties.get(group_name, {})
416+
result = match_feature_flag_properties(
417+
flag_def,
418+
_groups[group_name],
419+
focused_group_properties,
420+
cohort_properties,
421+
dependency_graph,
422+
id_to_key,
423+
)
424+
else:
425+
# Person-level flag
426+
result = match_feature_flag_properties(
427+
flag_def,
428+
distinct_id,
429+
properties,
430+
cohort_properties,
431+
dependency_graph,
432+
id_to_key,
433+
)
434+
400435
results[flag_key] = result
401436
dependency_graph.cache_result(flag_key, result)
402437
except InconclusiveMatchError:

0 commit comments

Comments
 (0)