@@ -123,6 +123,16 @@ class DatafileProjectConfig implements ProjectConfigInterface
123123 */
124124 private $ _variationIdMap ;
125125
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+
126136 /**
127137 * @var array Associative array of event key to Event(s) in the datafile.
128138 */
@@ -247,7 +257,7 @@ public function __construct($datafile, $logger, $errorHandler)
247257 }
248258
249259 $ 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);
251261 $ this ->_eventKeyMap = ConfigParser::generateMap ($ events , 'key ' , Event::class);
252262 $ this ->_attributeKeyMap = ConfigParser::generateMap ($ attributes , 'key ' , Attribute::class);
253263 $ typedAudienceIdMap = ConfigParser::generateMap ($ typedAudiences , 'id ' , Audience::class);
@@ -256,32 +266,36 @@ public function __construct($datafile, $logger, $errorHandler)
256266 $ this ->_featureFlags = ConfigParser::generateMap ($ featureFlags , null , FeatureFlag::class);
257267
258268 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);
260270 foreach (array_values ($ experimentsInGroup ) as $ experiment ) {
261271 $ experiment ->setGroupId ($ group ->getId ());
262272 $ experiment ->setGroupPolicy ($ group ->getPolicy ());
263273 }
264- $ this ->_experimentKeyMap = $ this ->_experimentKeyMap + $ experimentsInGroup ;
274+ $ this ->_experimentIdMap = $ this ->_experimentIdMap + $ experimentsInGroup ;
265275 }
266276
267277 foreach ($ this ->_rollouts as $ rollout ) {
268278 foreach ($ rollout ->getExperiments () as $ experiment ) {
269- $ this ->_experimentKeyMap [$ experiment ->getKey ()] = $ experiment ;
279+ $ this ->_experimentIdMap [$ experiment ->getId ()] = $ experiment ;
270280 }
271281 }
272282
273283 $ this ->_variationKeyMap = [];
274284 $ this ->_variationIdMap = [];
275- $ this ->_experimentIdMap = [];
285+ $ this ->_experimentKeyMap = [];
276286
277- foreach (array_values ($ this ->_experimentKeyMap ) as $ experiment ) {
287+ foreach (array_values ($ this ->_experimentIdMap ) as $ experiment ) {
278288 $ this ->_variationKeyMap [$ experiment ->getKey ()] = [];
279289 $ 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 ;
281293
282294 foreach ($ experiment ->getVariations () as $ variation ) {
283295 $ this ->_variationKeyMap [$ experiment ->getKey ()][$ variation ->getKey ()] = $ variation ;
284296 $ this ->_variationIdMap [$ experiment ->getKey ()][$ variation ->getId ()] = $ variation ;
297+ $ this ->_variationKeyMapByExperimentId [$ experiment ->getID ()][$ variation ->getKey ()] = $ variation ;
298+ $ this ->_variationIdMapByExperimentId [$ experiment ->getID ()][$ variation ->getId ()] = $ variation ;
285299 }
286300 }
287301
@@ -655,6 +669,60 @@ public function getVariationFromId($experimentKey, $variationId)
655669 return new Variation ();
656670 }
657671
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+
658726 /**
659727 * Gets the feature variable instance given feature flag key and variable key
660728 *
0 commit comments