@@ -70,11 +70,11 @@ def get_best_cohort(cohort_results: dict[str, CohortResult]) -> tuple[Status, li
7070
7171 @staticmethod
7272 def get_exclusion_rules (
73- cohort : IterationCohort , rules_filter : Iterable [rules .IterationRule ]
73+ cohort : IterationCohort , filter_rules : Iterable [rules .IterationRule ]
7474 ) -> Iterator [rules .IterationRule ]:
7575 return (
7676 ir
77- for ir in rules_filter
77+ for ir in filter_rules
7878 if ir .cohort_label is None
7979 or cohort .cohort_label == ir .cohort_label
8080 or (isinstance (ir .cohort_label , (list , set , tuple )) and cohort .cohort_label in ir .cohort_label )
@@ -84,59 +84,30 @@ def get_exclusion_rules(
8484 def get_rules_by_type (
8585 active_iteration : Iteration ,
8686 ) -> tuple [tuple [rules .IterationRule , ...], tuple [rules .IterationRule , ...]]:
87- rules_by_type = {
88- rule_type : tuple (rule for rule in active_iteration .iteration_rules if attrgetter ("type" )(rule ) == rule_type )
89- for rule_type in (rules .RuleType .filter , rules .RuleType .suppression , rules .RuleType .redirect )
90- }
91- rules_filter = rules_by_type [rules .RuleType .filter ]
92- rules_suppression = rules_by_type [rules .RuleType .suppression ]
93- return rules_filter , rules_suppression
87+ filter_rules , suppression_rules = (
88+ tuple (rule for rule in active_iteration .iteration_rules if attrgetter ("type" )(rule ) == rule_type )
89+ for rule_type in (rules .RuleType .filter , rules .RuleType .suppression )
90+ )
91+ return filter_rules , suppression_rules
9492
9593 def evaluate_eligibility (self ) -> eligibility .EligibilityStatus :
9694 """Iterates over campaign groups, evaluates eligibility, and returns a consolidated status."""
97- results : dict [ConditionName , IterationResult ] = {}
95+ condition_results : dict [ConditionName , IterationResult ] = {}
9896
9997 for condition_name , campaign_group in self .campaigns_grouped_by_condition_name :
10098 iteration_results : dict [str , IterationResult ] = {}
10199
102100 for active_iteration in [cc .current_iteration for cc in campaign_group ]:
103101 cohort_results : dict [str , CohortResult ] = {}
104102
105- rules_filter , rules_suppression = self .get_rules_by_type (active_iteration )
103+ filter_rules , suppression_rules = self .get_rules_by_type (active_iteration )
106104 for cohort in sorted (active_iteration .iteration_cohorts , key = attrgetter ("priority" )):
107- # Check Base Eligibility
105+ # Base Eligibility - check
108106 if cohort .cohort_label in self .person_cohorts or cohort .cohort_label == magic_cohort :
109- is_eligible : bool = True
110- is_eligible = self .evaluate_filter_rules (
111- cohort ,
112- cohort_results ,
113- rules_filter ,
114- is_eligible = is_eligible ,
115- )
116-
117- if is_eligible :
118- is_actionable : bool = True
119- suppression_reasons , is_actionable = self .evaluate_suppression_rules (
120- cohort ,
121- rules_suppression ,
122- is_actionable = is_actionable ,
123- )
124- if cohort .cohort_label is not None :
125- key = cohort .cohort_label
126- if is_actionable :
127- cohort_results [key ] = CohortResult (
128- cohort .cohort_group if cohort .cohort_group else key ,
129- Status .actionable ,
130- [],
131- str (cohort .positive_description ),
132- )
133- else :
134- cohort_results [key ] = CohortResult (
135- cohort .cohort_group if cohort .cohort_group else key ,
136- Status .not_actionable ,
137- suppression_reasons ,
138- str (cohort .positive_description ),
139- )
107+ # Eligibility - check
108+ if self .is_eligible_by_filter_rules (cohort , cohort_results , filter_rules ):
109+ # Actionability - evaluation
110+ self .evaluate_suppression_rules (cohort , cohort_results , suppression_rules )
140111
141112 # Not base eligible
142113 elif cohort .cohort_label is not None :
@@ -156,7 +127,7 @@ def evaluate_eligibility(self) -> eligibility.EligibilityStatus:
156127 best_candidate = max (iteration_results .values (), key = lambda r : r .status .value )
157128 else :
158129 best_candidate = IterationResult (eligibility .Status .not_eligible , [])
159- results [condition_name ] = best_candidate
130+ condition_results [condition_name ] = best_candidate
160131
161132 # Consolidate all the results and return
162133 final_result = [
@@ -165,23 +136,24 @@ def evaluate_eligibility(self) -> eligibility.EligibilityStatus:
165136 status = active_iteration_result .status ,
166137 cohort_results = active_iteration_result .cohort_results ,
167138 )
168- for condition_name , active_iteration_result in results .items ()
139+ for condition_name , active_iteration_result in condition_results .items ()
169140 ]
170141 return eligibility .EligibilityStatus (conditions = final_result )
171142
172- def evaluate_filter_rules (
143+ def is_eligible_by_filter_rules (
173144 self ,
174145 cohort : IterationCohort ,
175146 cohort_results : dict [str , CohortResult ],
176- rules_filter : Iterable [rules .IterationRule ],
177- * ,
178- is_eligible : bool ,
147+ filter_rules : Iterable [rules .IterationRule ],
179148 ) -> bool :
149+ is_eligible = True
180150 priority_getter = attrgetter ("priority" )
181- sorted_rules_by_priority = sorted (self .get_exclusion_rules (cohort , rules_filter ), key = priority_getter )
151+ sorted_rules_by_priority = sorted (self .get_exclusion_rules (cohort , filter_rules ), key = priority_getter )
182152
183153 for _ , rule_group in groupby (sorted_rules_by_priority , key = priority_getter ):
184- status , group_actionable , group_exclusions , rule_stop = self .evaluate_rules_priority_group (rule_group )
154+ status , group_inclusion_reasons , group_exclusion_reasons , rule_stop = self .evaluate_rules_priority_group (
155+ rule_group
156+ )
185157 if status .is_exclusion :
186158 if cohort .cohort_label is not None :
187159 cohort_results [str (cohort .cohort_label )] = CohortResult (
@@ -197,27 +169,47 @@ def evaluate_filter_rules(
197169 def evaluate_suppression_rules (
198170 self ,
199171 cohort : IterationCohort ,
200- rules_suppression : Iterable [ rules . IterationRule ],
201- * ,
202- is_actionable : bool ,
203- ) -> tuple [ list , bool ]:
172+ cohort_results : dict [ str , CohortResult ],
173+ suppression_rules : Iterable [ rules . IterationRule ] ,
174+ ) -> None :
175+ is_actionable : bool = True
204176 priority_getter = attrgetter ("priority" )
205177 suppression_reasons = []
206- sorted_rules_by_priority = sorted (self .get_exclusion_rules (cohort , rules_suppression ), key = priority_getter )
178+
179+ sorted_rules_by_priority = sorted (self .get_exclusion_rules (cohort , suppression_rules ), key = priority_getter )
180+
207181 for _ , rule_group in groupby (sorted_rules_by_priority , key = priority_getter ):
208- status , group_actionable , group_exclusions , rule_stop = self .evaluate_rules_priority_group (rule_group )
182+ status , group_inclusion_reasons , group_exclusion_reasons , rule_stop = self .evaluate_rules_priority_group (
183+ rule_group
184+ )
209185 if status .is_exclusion :
210186 is_actionable = False
211- suppression_reasons .extend (group_exclusions )
187+ suppression_reasons .extend (group_exclusion_reasons )
212188 if rule_stop :
213189 break
214- return suppression_reasons , is_actionable
190+
191+ if cohort .cohort_label is not None :
192+ key = cohort .cohort_label
193+ if is_actionable :
194+ cohort_results [key ] = CohortResult (
195+ cohort .cohort_group if cohort .cohort_group else key ,
196+ Status .actionable ,
197+ [],
198+ str (cohort .positive_description ),
199+ )
200+ else :
201+ cohort_results [key ] = CohortResult (
202+ cohort .cohort_group if cohort .cohort_group else key ,
203+ Status .not_actionable ,
204+ suppression_reasons ,
205+ str (cohort .positive_description ),
206+ )
215207
216208 def evaluate_rules_priority_group (
217209 self , rules_group : Iterator [rules .IterationRule ]
218210 ) -> tuple [eligibility .Status , list [eligibility .Reason ], list [eligibility .Reason ], bool ]:
219211 is_rule_stop = False
220- actionable_reasons , exclusion_reasons = [], []
212+ inclusion_reasons , exclusion_reasons = [], []
221213 best_status = eligibility .Status .not_eligible
222214
223215 for rule in rules_group :
@@ -229,6 +221,6 @@ def evaluate_rules_priority_group(
229221 exclusion_reasons .append (reason )
230222 else :
231223 best_status = eligibility .Status .actionable
232- actionable_reasons .append (reason )
224+ inclusion_reasons .append (reason )
233225
234- return best_status , actionable_reasons , exclusion_reasons , is_rule_stop
226+ return best_status , inclusion_reasons , exclusion_reasons , is_rule_stop
0 commit comments