22
33from django .db import models
44from django .db .models import Prefetch , Q
5+ from flag_engine .engine import get_evaluation_result
56
67from environments .identities .managers import IdentityManager
78from environments .identities .traits .models import Trait
1112from features .multivariate .models import MultivariateFeatureStateValue
1213from features .versioning .versioning_service import get_environment_flags_list
1314from segments .models import Segment
14- from util .engine_models .context .mappers import (
15- is_context_in_segment ,
16- map_environment_identity_to_context ,
17- )
18- from util .mappers .engine import (
19- map_identity_to_engine ,
20- map_segment_to_engine ,
21- map_traits_to_engine ,
22- )
15+ from util .mappers .engine import map_environment_to_evaluation_context
2316
2417
2518class Identity (models .Model ):
@@ -154,7 +147,6 @@ def get_segments(
154147 :param overrides_only: only retrieve the segments which have a valid override in the environment
155148 :return: List of matching segments
156149 """
157- matching_segments = []
158150 db_traits = (
159151 self .identity_traits .all () if (traits is None and self .id ) else traits or []
160152 )
@@ -164,29 +156,18 @@ def get_segments(
164156 else :
165157 all_segments = self .environment .project .get_segments_from_cache ()
166158
167- engine_identity = map_identity_to_engine (
168- self ,
169- with_overrides = False ,
170- with_traits = False ,
159+ segments_by_pk = {segment .pk : segment for segment in all_segments }
160+ context = map_environment_to_evaluation_context (
161+ identity = self ,
162+ environment = self .environment ,
163+ traits = db_traits ,
164+ segments = all_segments ,
171165 )
172- engine_traits = map_traits_to_engine (db_traits )
173-
174- for segment in all_segments :
175- engine_segment = map_segment_to_engine (segment )
176-
177- context = map_environment_identity_to_context (
178- environment = self .environment ,
179- identity = engine_identity ,
180- override_traits = engine_traits ,
181- )
182-
183- if is_context_in_segment (
184- context = context ,
185- segment = engine_segment ,
186- ):
187- matching_segments .append (segment )
188-
189- return matching_segments
166+ result = get_evaluation_result (context )
167+ return [
168+ segments_by_pk [segment_result ["metadata" ]["pk" ]]
169+ for segment_result in result ["segments" ]
170+ ]
190171
191172 def get_all_user_traits (self ): # type: ignore[no-untyped-def]
192173 # this is pointless, we should probably replace all uses with the below code
0 commit comments