8000 wrong variation issue fix · optimizely/python-sdk@2e4f867 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2e4f867

Browse files
committed
wrong variation issue fix
1 parent b55582c commit 2e4f867

File tree

5 files changed

+512
-10
lines changed

5 files changed

+512
-10
lines changed

optimizely/bucketer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def bucket(self, project_config, experiment, user_id, bucketing_id):
142142
variation_id = self.find_bucket(project_config, bucketing_id,
143143
experiment.id, experiment.trafficAllocation)
144144
if variation_id:
145-
variation = project_config.get_variation_from_id(experiment.key, variation_id)
145+
variation = project_config.get_variation_from_id(experiment.id, variation_id)
146146
return variation, decide_reasons
147147

148148
else:

optimizely/decision_service.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from .helpers import validator
2222
from .user_profile import UserProfile
2323

24-
2524
Decision = namedtuple('Decision', 'experiment variation source')
2625

2726

@@ -342,8 +341,8 @@ def get_variation_for_rollout(self, project_config, rollout, user_id, attributes
342341
if rollout and len(rollout.experiments) > 0:
343342
for idx in range(len(rollout.experiments) - 1):
344343
logging_key = str(idx + 1)
345-
rollout_rule = project_config.get_experiment_from_key(rollout.experiments[idx].get('key'))
346-
344+
rollout_rule = project_config.get_experiment_from_id(rollout.experiments[idx].get('id'))
345+
# rollout_rule = optimizely.entities.Experiment(**rollout.experiments[idx])
347346
# Check if user meets audience conditions for targeting rule
348347
audience_conditions = rollout_rule.get_audience_conditions_or_ids()
349348
user_meets_audience_conditions, reasons_received = audience_helper.does_user_meet_audience_conditions(

optimizely/project_config.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from .helpers import enums
1818
from . import entities
1919
from . import exceptions
20+
import copy
2021

2122
SUPPORTED_VERSIONS = [
2223
enums.DatafileVersions.V2,
@@ -56,6 +57,7 @@ def __init__(self, datafile, logger, error_handler):
5657
self.environment_key = config.get('environmentKey', None)
5758
self.groups = config.get('groups', [])
5859
self.experiments = config.get('experiments', [])
60+
self.mapexperiment = copy.deepcopy(self.experiments)
5961
self.events = config.get('events', [])
6062
self.attributes = config.get('attributes', [])
6163
self.audiences = config.get('audiences', [])
@@ -68,6 +70,7 @@ def __init__(self, datafile, logger, error_handler):
6870

6971
# Utility maps for quick lookup
7072
self.group_id_map = self._generate_key_map(self.groups, 'id', entities.Group)
73+
self.experimentID_map = self._generate_key_map(self.mapexperiment, 'id', entities.Experiment)
7174
self.experiment_key_map = self._generate_key_map(self.experiments, 'key', entities.Experiment)
7275
self.event_key_map = self._generate_key_map(self.events, 'key', entities.Event)
7376
self.attribute_key_map = self._generate_key_map(self.attributes, 'key', entities.Attribute)
@@ -85,18 +88,24 @@ def __init__(self, datafile, logger, error_handler):
8588
for layer in self.rollout_id_map.values():
8689
for experiment in layer.experiments:
8790
self.experiment_key_map[experiment['key']] = entities.Experiment(**experiment)
91+
self.experimentID_map[experiment['id']] = entities.Experiment(**experiment)
8892

8993
self.audience_id_map = self._deserialize_audience(self.audience_id_map)
9094
for group in self.group_id_map.values():
9195
experiments_in_group_key_map = self._generate_key_map(group.experiments, 'key', entities.Experiment)
9296
for experiment in experiments_in_group_key_map.values():
9397
experiment.__dict__.update({'groupId': group.id, 'groupPolicy': group.policy})
9498
self.experiment_key_map.update(experiments_in_group_key_map)
99+
experiments_in_group_id_map = self._generate_key_map(group.experiments, 'id', entities.Experiment)
100+
for experiment in experiments_in_group_id_map.values():
101+
experiment.__dict__.update({'groupId': group.id, 'groupPolicy': group.policy})
102+
self.experiment_key_map.update(experiments_in_group_id_map)
95103

96104
self.experiment_id_map = {}
97105
self.variation_key_map = {}
98106
self.variation_id_map = {}
99107
self.variation_variable_usage_map = {}
108+
100109
for experiment in self.experiment_key_map.values():
101110
self.experiment_id_map[experiment.id] = experiment
102111
self.variation_key_map[experiment.key] = self._generate_key_map(
@@ -108,6 +117,26 @@ def __init__(self, datafile, logger, error_handler):
108117
self.variation_variable_usage_map[variation.id] = self._generate_key_map(
109118
variation.variables, 'id', entities.Variation.VariableUsage
110119
)
120+
self.correct_variation_id_map = {}
121+
self.temp_variation_id_map = {}
122+
for experiment in self.experimentID_map.values():
123+
self.temp_variation_id_map[experiment.id] = self._generate_key_map(
124+
experiment.variations, 'id', entities.Variation
125+
)
126+
self.correct_variation_id_map[experiment.id] = {}
127+
for variation in self.temp_variation_id_map.get(experiment.id).values():
128+
self.correct_variation_id_map[experiment.id][variation.id] = variation
129+
self.variation_variable_usage_map[variation.id] = self._generate_key_map(
130+
variation.variables, 'id', entities.Variation.VariableUsage
131+
)
132+
133+
134+
135+
136+
137+
138+
139+
111140

112141
self.feature_key_map = self._generate_key_map(self.feature_flags, 'key', entities.FeatureFlag)
113142

@@ -280,8 +309,8 @@ def get_experiment_from_id(self, experiment_id):
280309
Experiment corresponding to the provided experiment ID.
281310
"""
282311

283-
experiment = self.experiment_id_map.get(experiment_id)
284-
312+
# experiment = self.experiment_id_map.get(experiment_id)
313+
experiment = self.experimentID_map.get(experiment_id)
285314
if experiment:
286315
return experiment
287316

@@ -362,8 +391,8 @@ def get_variation_from_id(self, experiment_key, variation_id):
362391
Object representing the variation.
363392
"""
364393

365-
variation_map = self.variation_id_map.get(experiment_key)
366-
394+
#variation_map = self.variation_id_map.get(experiment_key)
395+
variation_map = self.correct_variation_id_map.get(experiment_key)
367396
if variation_map:
368397
variation = variation_map.get(variation_id)
369398
if variation:

0 commit comments

Comments
 (0)
0