@@ -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,36 @@ 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 ->_experimentKeyMap = [];
276
286
277
- foreach (array_values ($ this ->_experimentKeyMap ) as $ experiment ) {
287
+ foreach (array_values ($ this ->_experimentIdMap ) as $ experiment ) {
278
288
$ this ->_variationKeyMap [$ experiment ->getKey ()] = [];
279
289
$ this ->_variationIdMap [$ experiment ->getKey ()] = [];
280
- $ this ->_experimentIdMap [$ experiment ->getId ()] = $ experiment ;
290
+ $ this ->_variationIdMapByExperimentId [$ experiment ->getID ()] = [];
291
+ $ this ->_variationKeyMapByExperimentId [$ experiment ->getID ()] = [];
292
+ $ this ->_experimentKeyMap [$ experiment ->getKey ()] = $ experiment ;
281
293
282
294
foreach ($ experiment ->getVariations () as $ variation ) {
283
295
$ this ->_variationKeyMap [$ experiment ->getKey ()][$ variation ->getKey ()] = $ variation ;
284
296
$ this ->_variationIdMap [$ experiment ->getKey ()][$ variation ->getId ()] = $ variation ;
297
+ $ this ->_variationKeyMapByExperimentId [$ experiment ->getID ()][$ variation ->getKey ()] = $ variation ;
298
+ $ this ->_variationIdMapByExperimentId [$ experiment ->getID ()][$ variation ->getId ()] = $ variation ;
285
299
}
286
300
}
287
301
@@ -655,6 +669,60 @@ public function getVariationFromId($experimentKey, $variationId)
655
669
return new Variation ();
656
670
}
657
671
672
+ /**
673
+ * @param $experimentId string ID for experiment.
674
+ * @param $variationId string ID for variation.
675
+ *
676
+ * @return Variation Entity corresponding to the provided experiment ID and variation ID.
677
+ * Dummy entity is returned if key or ID is invalid.
678
+ */
679
+ public function getVariationFromIdByExperimentId ($ experimentId , $ variationId )
680
+ {
681
+ if (isset ($ this ->_variationIdMapByExperimentId [$ experimentId ])
682
+ && isset ($ this ->_variationIdMapByExperimentId [$ experimentId ][$ variationId ])
683
+ ) {
684
+ return $ this ->_variationIdMapByExperimentId [$ experimentId ][$ variationId ];
685
+ }
686
+
687
+ $ this ->_logger ->log (
688
+ Logger::ERROR ,
689
+ sprintf (
690
+ 'No variation ID "%s" defined in datafile for experiment "%s". ' ,
691
+ $ variationId ,
692
+ $ experimentId
693
+ )
694
+ );
695
+ $ this ->_errorHandler ->handleError (new InvalidVariationException ('Provided variation is not in datafile. ' ));
696
+ return new Variation ();
697
+ }
698
+
699
+ /**
700
+ * @param $experimentId string ID for experiment.
701
+ * @param $variationKey string Key for variation.
702
+ *
703
+ * @return Variation Entity corresponding to the provided experiment ID and variation Key.
704
+ * Dummy entity is returned if key or ID is invalid.
705
+ */
706
+ public function getVariationFromKeyByExperimentId ($ experimentId , $ variationKey )
707
+ {
708
+ if (isset ($ this ->_variationKeyMapByExperimentId [$ experimentId ])
709
+ && isset ($ this ->_variationKeyMapByExperimentId [$ experimentId ][$ variationKey ])
710
+ ) {
711
+ return $ this ->_variationKeyMapByExperimentId [$ experimentId ][$ variationKey ];
712
+ }
713
+
714
+ $ this ->_logger ->log (
715
+ Logger::ERROR ,
716
+ sprintf (
717
+ 'No variation Key "%s" defined in datafile for experiment "%s". ' ,
718
+ $ variationKey ,
719
+ $ experimentId
720
+ )
721
+ );
722
+ $ this ->_errorHandler ->handleError (new InvalidVariationException ('Provided variation is not in datafile. ' ));
723
+ return new Variation ();
724
+ }
725
+
658
726
/**
659
727
* Gets the feature variable instance given feature flag key and variable key
660
728
*
0 commit comments