11
11
# See the License for the specific language governing permissions and
12
12
# limitations under the License.
13
13
14
- import json
14
+ import copy
15
+
15
16
16
17
class OptimizelyConfig (object ):
17
18
def __init__ (self , revision , experiments_map , features_map ):
18
19
self .revision = revision
19
- self .experimentsMap = experiments_map
20
- self .featuresMap = features_map
20
+ self .experiments_map = experiments_map
21
+ self .features_map = features_map
22
+
21
23
22
24
class OptimizelyExperiment (object ):
23
25
def __init__ (self , id , key , variations_map ):
24
26
self .id = id
25
27
self .key = key
26
- self .variationsMap = variations_map
28
+ self .variations_map = variations_map
29
+
27
30
28
31
class OptimizelyFeature (object ):
29
32
def __init__ (self , id , key , experiments_map , variables_map ):
30
33
self .id = id
31
34
self .key = key
32
- self .experimentsMap = experiments_map
33
- self .variablesMap = variables_map
35
+ self .experiments_map = experiments_map
36
+ self .variables_map = variables_map
37
+
34
38
35
39
class OptimizelyVariation (object ):
36
40
def __init__ (self , id , key , feature_enabled , variables_map ):
37
41
self .id = id
38
42
self .key = key
39
- self .featureEnabled = feature_enabled
40
- self .variablesMap = variables_map
43
+ self .feature_enabled = feature_enabled
44
+ self .variables_map = variables_map
45
+
41
46
42
47
class OptimizelyVariable (object ):
43
48
def __init__ (self , id , key , type , value ):
@@ -55,53 +60,51 @@ def __init__(self, project_config):
55
60
self .groups = project_config .groups
56
61
self .revision = project_config .revision
57
62
58
- def get_optimizely_config (self ):
59
- experiments_map = self ._get_experiments_map ()
60
- features_map = self ._get_features_map (experiments_map )
63
+ def build (self ):
64
+ self ._create_lookup_maps ()
61
65
62
- return OptimizelyConfig (self .revision , experiments_map , features_map )
66
+ experiments_key_map , experiments_id_map = self ._get_experiments_maps ()
67
+ features_map = self ._get_features_map (experiments_id_map )
63
68
64
- def _get_feature_variable_by_id (self , variable_id , feature_flag ):
65
- for variable in feature_flag .get ('variables' , []):
66
- if variable_id == variable ['id' ]:
67
- return variable
68
- return None
69
+ return OptimizelyConfig (self .revision , experiments_key_map , features_map )
69
70
70
- def _get_featureflag_by_experiment_id (self , experiment_id ):
71
+ def _create_lookup_maps (self ):
72
+ self .exp_id_to_feature_map = {}
71
73
for feature in self .feature_flags :
72
74
for id in feature ['experimentIds' ]:
73
- if id == experiment_id :
74
- return feature
75
- return None
75
+ self .exp_id_to_feature_map [id ] = feature
76
76
77
- def _get_experiment_by_id (self , experiment_id , experiments_map ):
78
- for experiment in experiments_map .values ():
79
- if experiment .id == experiment_id :
80
- return experiment
77
+ self .feature_key_variable_key_to_variable_map = {}
78
+ self .feature_key_variable_id_to_variable_map = {}
79
+ for feature in self .feature_flags :
80
+ variables_key_map = {}
81
+ variables_id_map = {}
82
+ for variable in feature .get ('variables' , []):
83
+ opt_variable = OptimizelyVariable (
84
+ variable ['id' ], variable ['key' ], variable ['type' ], variable ['defaultValue' ]
85
+ )
86
+ variables_key_map [variable ['key' ]] = opt_variable
87
+ variables_id_map [variable ['id' ]] = opt_variable
81
88
82
- return None
89
+ self .feature_key_variable_key_to_variable_map [feature ['key' ]] = variables_key_map
90
+ self .feature_key_variable_id_to_variable_map [feature ['key' ]] = variables_id_map
83
91
84
92
def _get_variables_map (self , variation , experiment ):
85
- feature_flag = self ._get_featureflag_by_experiment_id (experiment ['id' ])
93
+ feature_flag = self .exp_id_to_feature_map . get (experiment ['id' ], None )
86
94
if feature_flag is None :
87
95
return {}
88
96
89
97
# set default variables for each variation
90
98
variables_map = {}
91
- for variable in feature_flag .get ('variables' , []):
92
- opt_variable = OptimizelyVariable (
93
- variable ['id' ], variable ['key' ], variable ['type' ], variable ['defaultValue' ]
94
- )
95
- variables_map [variable ['key' ]] = opt_variable
96
-
99
+ variables_map = copy .deepcopy (self .feature_key_variable_key_to_variable_map [feature_flag ['key' ]])
97
100
98
101
# set variation specific variable value if any
99
102
if variation .get ('featureEnabled' , None ):
100
103
for variable in variation .get ('variables' , []):
101
- feature_variable = self ._get_feature_variable_by_id ( variable ['id' ], feature_flag )
102
- variables_map [feature_variable [ ' key' ] ].value = variable ['value' ]
104
+ feature_variable = self .feature_key_variable_id_to_variable_map [ feature_flag [ 'key' ]][ variable ['id' ]]
105
+ variables_map [feature_variable . key ].value = variable ['value' ]
103
106
104
- return variables_map
107
+ return variables_map
105
108
106
109
def _get_variations_map (self , experiment ):
107
110
variations_map = {}
@@ -126,44 +129,36 @@ def _get_all_experiments(self):
126
129
127
130
return experiments
128
131
129
- def _get_experiments_map (self ):
130
- experiments_map = {}
132
+ def _get_experiments_maps (self ):
133
+ experiments_key_map = {}
134
+ experiments_id_map = {}
131
135
all_experiments = self ._get_all_experiments ()
132
-
136
+
133
137
for exp in all_experiments :
134
138
optly_exp = OptimizelyExperiment (
135
139
exp ['id' ], exp ['key' ], self ._get_variations_map (exp )
136
140
)
137
141
138
- experiments_map [exp ['key' ]] = optly_exp
142
+ experiments_key_map [exp ['key' ]] = optly_exp
143
+ experiments_id_map [exp ['id' ]] = optly_exp
139
144
140
- return experiments_map
145
+ return experiments_key_map , experiments_id_map
141
146
142
- def _get_features_map (self , experiments_map ):
147
+ def _get_features_map (self , experiments_id_map ):
143
148
features_map = {}
144
149
145
150
for feature in self .feature_flags :
146
151
exp_map = {}
147
152
for experiment_id in feature .get ('experimentIds' , []):
148
- optly_exp = self . _get_experiment_by_id ( experiment_id , experiments_map )
153
+ optly_exp = experiments_id_map [ experiment_id ]
149
154
exp_map [optly_exp .key ] = optly_exp
150
155
151
-
152
-
153
- variables_map = {}
154
- for variable in feature ['variables' ]:
155
- optly_variable = OptimizelyVariable (
156
- variable ['id' ], variable ['key' ], variable ['type' ], variable ['defaultValue' ]
157
- )
158
-
159
- variables_map [variable ['key' ]] = optly_variable
160
-
156
+ variables_map = self .feature_key_variable_key_to_variable_map [feature ['key' ]]
161
157
162
158
optly_feature = OptimizelyFeature (
163
159
feature ['id' ], feature ['key' ], exp_map , variables_map
164
160
)
165
161
166
162
features_map [feature ['key' ]] = optly_feature
167
163
168
-
169
164
return features_map
0 commit comments