1
1
<?php
2
2
/**
3
- * Copyright 2019-2020 , Optimizely
3
+ * Copyright 2019-2021 , Optimizely
4
4
*
5
5
* Licensed under the Apache License, Version 2.0 (the "License");
6
6
* you may not use this file except in compliance with the License.
@@ -123,6 +123,16 @@ class DatafileProjectConfig implements ProjectConfigInterface
123
123
*/
124
124
private $ _variationIdMap ;
125
125
126
+ /**
127
+ * @var array Associative array of experiment id to associative array of variation ID to variations.
128
+ */
129
+ private $ _variationIdMapByExperimentId ;
130
+
131
+ /**
132
+ * @var array Associative array of experiment id to associative array of variation key to variations.
133
+ */
134
+ private $ _variationKeyMapByExperimentId ;
135
+
126
136
/**
127
137
* @var array Associative array of event key to Event(s) in the datafile.
128
138
*/
@@ -247,7 +257,7 @@ public function __construct($datafile, $logger, $errorHandler)
247
257
}
248
258
249
259
$ this ->_groupIdMap = ConfigParser::generateMap ($ groups , 'id ' , Group::class);
250
- $ this ->_experimentKeyMap = ConfigParser::generateMap ($ experiments , 'key ' , Experiment::class);
260
+ $ this ->_experimentIdMap = ConfigParser::generateMap ($ experiments , 'id ' , Experiment::class);
251
261
$ this ->_eventKeyMap = ConfigParser::generateMap ($ events , 'key ' , Event::class);
252
262
$ this ->_attributeKeyMap = ConfigParser::generateMap ($ attributes , 'key ' , Attribute::class);
253
263
$ typedAudienceIdMap = ConfigParser::generateMap ($ typedAudiences , 'id ' , Audience::class);
@@ -256,32 +266,38 @@ public function __construct($datafile, $logger, $errorHandler)
256
266
$ this ->_featureFlags = ConfigParser::generateMap ($ featureFlags , null , FeatureFlag::class);
257
267
258
268
foreach (array_values ($ this ->_groupIdMap ) as $ group ) {
259
- $ experimentsInGroup = ConfigParser::generateMap ($ group ->getExperiments (), 'key ' , Experiment::class);
269
+ $ experimentsInGroup = ConfigParser::generateMap ($ group ->getExperiments (), 'id ' , Experiment::class);
260
270
foreach (array_values ($ experimentsInGroup ) as $ experiment ) {
261
271
$ experiment ->setGroupId ($ group ->getId ());
262
272
$ experiment ->setGroupPolicy ($ group ->getPolicy ());
263
273
}
264
- $ this ->_experimentKeyMap = $ this ->_experimentKeyMap + $ experimentsInGroup ;
274
+ $ this ->_experimentIdMap = $ this ->_experimentIdMap + $ experimentsInGroup ;
265
275
}
266
276
267
277
foreach ($ this ->_rollouts as $ rollout ) {
268
278
foreach ($ rollout ->getExperiments () as $ experiment ) {
269
- $ this ->_experimentKeyMap [$ experiment ->getKey ()] = $ experiment ;
279
+ $ this ->_experimentIdMap [$ experiment ->getId ()] = $ experiment ;
270
280
}
271
281
}
272
282
273
283
$ this ->_variationKeyMap = [];
274
284
$ this ->_variationIdMap = [];
275
- $ this ->_experimentIdMap = [];
285
+ $ this ->_variationKeyMapByExperimentId = [];
286
+ $ this ->_variationIdMapByExperimentId = [];
287
+ $ this ->_experimentKeyMap = [];
276
288
277
- foreach (array_values ($ this ->_experimentKeyMap ) as $ experiment ) {
289
+ foreach (array_values ($ this ->_experimentIdMap ) as $ experiment ) {
278
290
$ this ->_variationKeyMap [$ experiment ->getKey ()] = [];
279
291
$ this ->_variationIdMap [$ experiment ->getKey ()] = [];
280
- $ this ->_experimentIdMap [$ experiment ->getId ()] = $ experiment ;
292
+ $ this ->_variationIdMapByExperimentId [$ experiment ->getId ()] = [];
293
+ $ this ->_variationKeyMapByExperimentId [$ experiment ->getId ()] = [];
294
+ $ this ->_experimentKeyMap [$ experiment ->getKey ()] = $ experiment ;
281
295
282
296
foreach ($ experiment ->getVariations () as $ variation ) {
283
297
$ this ->_variationKeyMap [$ experiment ->getKey ()][$ variation ->getKey ()] = $ variation ;
284
298
$ this ->_variationIdMap [$ experiment ->getKey ()][$ variation ->getId ()] = $ variation ;
299
+ $ this ->_variationKeyMapByExperimentId [$ experiment ->getId ()][$ variation ->getKey ()] = $ variation ;
300
+ $ this ->_variationIdMapByExperimentId [$ experiment ->getId ()][$ variation ->getId ()] = $ variation ;
285
301
}
286
302
}
287
303
@@ -300,24 +316,32 @@ public function __construct($datafile, $logger, $errorHandler)
300
316
301
317
$ rolloutVariationIdMap = [];
302
318
$ rolloutVariationKeyMap = [];
319
+ $ rolloutVariationIdMapByExperimentId = [];
320
+ $ rolloutVariationKeyMapByExperimentId = [];
303
321
foreach ($ this ->_rollouts as $ rollout ) {
304
322
$ this ->_rolloutIdMap [$ rollout ->getId ()] = $ rollout ;
305
323
306
324
foreach ($ rollout ->getExperiments () as $ rule ) {
307
325
$ rolloutVariationIdMap [$ rule ->getKey ()] = [];
308
326
$ rolloutVariationKeyMap [$ rule ->getKey ()] = [];
327
+ $ rolloutVariationIdMapByExperimentId [$ rule ->getId ()] = [];
328
+ $ rolloutVariationKeyMapByExperimentId [$ rule ->getId ()] = [];
309
329
310
330
$ variations = $ rule ->getVariations ();
311
331
foreach ($ variations as $ variation ) {
312
332
$ rolloutVariationIdMap [$ rule ->getKey ()][$ variation ->getId ()] = $ variation ;
313
333
$ rolloutVariationKeyMap [$ rule ->getKey ()][$ variation ->getKey ()] = $ variation ;
334
+ $ rolloutVariationIdMapByExperimentId [$ rule ->getId ()][$ variation ->getId ()] = $ variation ;
335
+ $ rolloutVariationKeyMapByExperimentId [$ rule ->getId ()][$ variation ->getKey ()] = $ variation ;
314
336
}
315
337
}
316
338
}
317
339
318
340
// Add variations for rollout experiments to variationIdMap and variationKeyMap
319
341
$ this ->_variationIdMap = $ this ->_variationIdMap + $ rolloutVariationIdMap ;
320
342
$ this ->_variationKeyMap = $ this ->_variationKeyMap + $ rolloutVariationKeyMap ;
343
+ $ this ->_variationIdMapByExperimentId = $ this ->_variationIdMapByExperimentId + $ rolloutVariationIdMapByExperimentId ;
344
+ $ this ->_variationKeyMapByExperimentId = $ this ->_variationKeyMapByExperimentId + $ rolloutVariationKeyMapByExperimentId ;
321
345
322
346
foreach (array_values ($ this ->_featureFlags ) as $ featureFlag ) {
323
347
$ this ->_featureKeyMap [$ featureFlag ->getKey ()] = $ featureFlag ;
@@ -655,6 +679,60 @@ public function getVariationFromId($experimentKey, $variationId)
655
679
return new Variation ();
656
680
}
657
681
682
+ /**
683
+ * @param $experimentId string ID for experiment.
684
+ * @param $variationId string ID for variation.
685
+ *
686
+ * @return Variation Entity corresponding to the provided experiment ID and variation ID.
687
+ * Dummy entity is returned if key or ID is invalid.
688
+ */
689
+ public function getVariationFromIdByExperimentId ($ experimentId , $ variationId )
690
+ {
691
+ if (isset ($ this ->_variationIdMapByExperimentId [$ experimentId ])
692
+ && isset ($ this ->_variationIdMapByExperimentId [$ experimentId ][$ variationId ])
693
+ ) {
694
+ return $ this ->_variationIdMapByExperimentId [$ experimentId ][$ variationId ];
695
+ }
696
+
697
+ $ this ->_logger ->log (
698
+ Logger::ERROR ,
699
+ sprintf (
700
+ 'No variation ID "%s" defined in datafile for experiment "%s". ' ,
701
+ $ variationId ,
702
+ $ experimentId
703
+ )
704
+ );
705
+ $ this ->_errorHandler ->handleError (new InvalidVariationException ('Provided variation is not in datafile. ' ));
706
+ return new Variation ();
707
+ }
708
+
709
+ /**
710
+ * @param $experimentId string ID for experiment.
711
+ * @param $variationKey string Key for variation.
712
+ *
713
+ * @return Variation Entity corresponding to the provided experiment ID and variation Key.
714
+ * Dummy entity is returned if key or ID is invalid.
715
+ */
716
+ public function getVariationFromKeyByExperimentId ($ experimentId , $ variationKey )
717
+ {
718
+ if (isset ($ this ->_variationKeyMapByExperimentId [$ experimentId ])
719
+ && isset ($ this ->_variationKeyMapByExperimentId [$ experimentId ][$ variationKey ])
720
+ ) {
721
+ return $ this ->_variationKeyMapByExperimentId [$ experimentId ][$ variationKey ];
722
+ }
723
+
724
+ $ this ->_logger ->log (
725
+ Logger::ERROR ,
726
+ sprintf (
727
+ 'No variation Key "%s" defined in datafile for experiment "%s". ' ,
728
+ $ variationKey ,
729
+ $ experimentId
730
+ )
731
+ );
732
+ $ this ->_errorHandler ->handleError (new InvalidVariationException ('Provided variation is not in datafile. ' ));
733
+ return new Variation ();
734
+ }
735
+
658
736
/**
659
737
* Gets the feature variable instance given feature flag key and variable key
660
738
*
0 commit comments