Skip to content

Commit

Permalink
feat: engine segment evaluation
Browse files Browse the repository at this point in the history
  • Loading branch information
khvn26 committed Oct 19, 2023
1 parent 9ca7e92 commit 403c5dd
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 7 deletions.
17 changes: 14 additions & 3 deletions api/segments/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
)
from django.core.exceptions import ValidationError
from django.db import models
from flag_engine.segments.evaluator import evaluate_identity_in_segment
from flag_engine.utils.semver import is_semver, remove_semver_suffix

from audit.constants import SEGMENT_CREATED_MESSAGE, SEGMENT_UPDATED_MESSAGE
Expand All @@ -20,6 +21,11 @@
)
from features.models import Feature
from projects.models import Project
from util.mappers.engine import (
map_identity_to_engine,
map_segment_to_engine,
map_traits_to_trait_models,
)

if typing.TYPE_CHECKING:
from environments.identities.models import Identity
Expand Down Expand Up @@ -109,9 +115,14 @@ def id_exists_in_rules_data(rules_data: typing.List[dict]) -> bool:
def does_identity_match(
self, identity: "Identity", traits: typing.List["Trait"] = None
) -> bool:
rules = self.rules.all()
return rules.count() > 0 and all(
rule.does_identity_match(identity, traits) for rule in rules
segment_model = map_segment_to_engine(self)
identity_model = map_identity_to_engine(identity)
trait_models = map_traits_to_trait_models(traits) if traits else None

return evaluate_identity_in_segment(
identity=identity_model,
segment=segment_model,
override_traits=trait_models,
)

def get_create_log_message(self, history_instance) -> typing.Optional[str]:
Expand Down
24 changes: 20 additions & 4 deletions api/util/mappers/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,25 @@
)


def map_traits_to_trait_models(traits: Iterable["Trait"]) -> list[TraitModel]:
return [
TraitModel(trait_key=trait.trait_key, trait_value=trait.trait_value)
for trait in traits
]


def map_segment_to_engine(segment: "Segment") -> SegmentModel:
segment_rules = segment.rules.all()

return SegmentModel(
id=segment.pk,
name=segment.name,
rules=[
map_segment_rule_to_engine(segment_rule) for segment_rule in segment_rules
],
)


def map_segment_rule_to_engine(
segment_rule: "SegmentRule",
) -> SegmentRuleModel:
Expand Down Expand Up @@ -354,10 +373,7 @@ def map_identity_to_engine(identity: "Identity") -> IdentityModel:
)
for feature_state in identity_feature_states
]
identity_trait_models = [
TraitModel(trait_key=trait.trait_key, trait_value=trait.trait_value)
for trait in identity_traits
]
identity_trait_models = map_traits_to_trait_models(identity_traits)

return IdentityModel(
# Attributes:
Expand Down

0 comments on commit 403c5dd

Please sign in to comment.