66from splitio .models .grammar .condition import ConditionType
77from splitio .models .grammar .matchers .misc import DependencyMatcher
88from splitio .models .grammar .matchers .keys import UserDefinedSegmentMatcher
9- from splitio .models .grammar .matchers .rule_based_segment import RuleBasedSegmentMatcher
9+ from splitio .models .grammar .matchers import RuleBasedSegmentMatcher
10+ from splitio .models .rule_based_segments import SegmentType
1011from splitio .optional .loaders import asyncio
1112
1213CONTROL = 'control'
13- EvaluationContext = namedtuple ('EvaluationContext' , ['flags' , 'segment_memberships' , 'segment_rbs_memberships' , 'segment_rbs_conditions' ])
14+ EvaluationContext = namedtuple ('EvaluationContext' , ['flags' , 'segment_memberships' , 'segment_rbs_memberships' , 'segment_rbs_conditions' , 'excluded_rbs_segments' ])
1415
1516_LOGGER = logging .getLogger (__name__ )
1617
@@ -130,6 +131,7 @@ def context_for(self, key, feature_names):
130131
131132 rbs_segment_memberships = {}
132133 rbs_segment_conditions = {}
134+ excluded_rbs_segments = {}
133135 key_membership = False
134136 segment_memberhsip = False
135137 for rbs_segment in pending_rbs_memberships :
@@ -138,10 +140,14 @@ def context_for(self, key, feature_names):
138140
139141 key_membership = key in rbs_segment_obj .excluded .get_excluded_keys ()
140142 segment_memberhsip = False
141- for segment_name in rbs_segment_obj .excluded .get_excluded_segments ():
142- if self ._segment_storage .segment_contains (segment_name , key ):
143+ for excluded_segment in rbs_segment_obj .excluded .get_excluded_segments ():
144+ if excluded_segment . type == SegmentType . STANDARD and self ._segment_storage .segment_contains (excluded_segment . name , key ):
143145 segment_memberhsip = True
144- break
146+
147+ if excluded_segment .type == SegmentType .RULE_BASED :
148+ rbs_segment = self ._rbs_segment_storage .get (excluded_segment .name )
149+ if rbs_segment is not None :
150+ excluded_rbs_segments .update ()
145151
146152 rbs_segment_memberships .update ({rbs_segment : segment_memberhsip or key_membership })
147153 if not (segment_memberhsip or key_membership ):
@@ -153,7 +159,8 @@ def context_for(self, key, feature_names):
153159 for segment in pending_memberships
154160 },
155161 rbs_segment_memberships ,
156- rbs_segment_conditions
162+ rbs_segment_conditions ,
163+ excluded_rbs_segments
157164 )
158165
159166class AsyncEvaluationDataFactory :
@@ -189,6 +196,7 @@ async def context_for(self, key, feature_names):
189196
190197 rbs_segment_memberships = {}
191198 rbs_segment_conditions = {}
199+ excluded_rbs_segments = {}
192200 key_membership = False
193201 segment_memberhsip = False
194202 for rbs_segment in pending_rbs_memberships :
@@ -197,11 +205,15 @@ async def context_for(self, key, feature_names):
197205
198206 key_membership = key in rbs_segment_obj .excluded .get_excluded_keys ()
199207 segment_memberhsip = False
200- for segment_name in rbs_segment_obj .excluded .get_excluded_segments ():
201- if await self ._segment_storage .segment_contains (segment_name , key ):
208+ for excluded_segment in rbs_segment_obj .excluded .get_excluded_segments ():
209+ if excluded_segment . type == SegmentType . STANDARD and await self ._segment_storage .segment_contains (excluded_segment . name , key ):
202210 segment_memberhsip = True
203- break
204-
211+
212+ if excluded_segment .type == SegmentType .RULE_BASED :
213+ rbs_segment = await self ._rbs_segment_storage .get (excluded_segment .name )
214+ if rbs_segment is not None :
215+ excluded_rbs_segments .update ()
216+
205217 rbs_segment_memberships .update ({rbs_segment : segment_memberhsip or key_membership })
206218 if not (segment_memberhsip or key_membership ):
207219 rbs_segment_conditions .update ({rbs_segment : [condition for condition in rbs_segment_obj .conditions ]})
@@ -215,7 +227,8 @@ async def context_for(self, key, feature_names):
215227 splits ,
216228 dict (zip (segment_names , segment_memberships )),
217229 rbs_segment_memberships ,
218- rbs_segment_conditions
230+ rbs_segment_conditions ,
231+ excluded_rbs_segments
219232 )
220233
221234
0 commit comments