11<?php
22/**
3- * Copyright 2019-2020 , Optimizely
3+ * Copyright 2019-2021 , Optimizely
44 *
55 * Licensed under the Apache License, Version 2.0 (the "License");
66 * you may not use this file except in compliance with the License.
@@ -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,38 @@ 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 ->_variationKeyMapByExperimentId = [];
286+ $ this ->_variationIdMapByExperimentId = [];
287+ $ this ->_experimentKeyMap = [];
276288
277- foreach (array_values ($ this ->_experimentKeyMap ) as $ experiment ) {
289+ foreach (array_values ($ this ->_experimentIdMap ) as $ experiment ) {
278290 $ this ->_variationKeyMap [$ experiment ->getKey ()] = [];
279291 $ 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 ;
281295
282296 foreach ($ experiment ->getVariations () as $ variation ) {
283297 $ this ->_variationKeyMap [$ experiment ->getKey ()][$ variation ->getKey ()] = $ variation ;
284298 $ this ->_variationIdMap [$ experiment ->getKey ()][$ variation ->getId ()] = $ variation ;
299+ $ this ->_variationKeyMapByExperimentId [$ experiment ->getId ()][$ variation ->getKey ()] = $ variation ;
300+ $ this ->_variationIdMapByExperimentId [$ experiment ->getId ()][$ variation ->getId ()] = $ variation ;
285301 }
286302 }
287303
@@ -300,24 +316,32 @@ public function __construct($datafile, $logger, $errorHandler)
300316
301317 $ rolloutVariationIdMap = [];
302318 $ rolloutVariationKeyMap = [];
319+ $ rolloutVariationIdMapByExperimentId = [];
320+ $ rolloutVariationKeyMapByExperimentId = [];
303321 foreach ($ this ->_rollouts as $ rollout ) {
304322 $ this ->_rolloutIdMap [$ rollout ->getId ()] = $ rollout ;
305323
306324 foreach ($ rollout ->getExperiments () as $ rule ) {
307325 $ rolloutVariationIdMap [$ rule ->getKey ()] = [];
308326 $ rolloutVariationKeyMap [$ rule ->getKey ()] = [];
327+ $ rolloutVariationIdMapByExperimentId [$ rule ->getId ()] = [];
328+ $ rolloutVariationKeyMapByExperimentId [$ rule ->getId ()] = [];
309329
310330 $ variations = $ rule ->getVariations ();
311331 foreach ($ variations as $ variation ) {
312332 $ rolloutVariationIdMap [$ rule ->getKey ()][$ variation ->getId ()] = $ variation ;
313333 $ rolloutVariationKeyMap [$ rule ->getKey ()][$ variation ->getKey ()] = $ variation ;
334+ $ rolloutVariationIdMapByExperimentId [$ rule ->getId ()][$ variation ->getId ()] = $ variation ;
335+ $ rolloutVariationKeyMapByExperimentId [$ rule ->getId ()][$ variation ->getKey ()] = $ variation ;
314336 }
315337 }
316338 }
317339
318340 // Add variations for rollout experiments to variationIdMap and variationKeyMap
319341 $ this ->_variationIdMap = $ this ->_variationIdMap + $ rolloutVariationIdMap ;
320342 $ this ->_variationKeyMap = $ this ->_variationKeyMap + $ rolloutVariationKeyMap ;
343+ $ this ->_variationIdMapByExperimentId = $ this ->_variationIdMapByExperimentId + $ rolloutVariationIdMapByExperimentId ;
344+ $ this ->_variationKeyMapByExperimentId = $ this ->_variationKeyMapByExperimentId + $ rolloutVariationKeyMapByExperimentId ;
321345
322346 foreach (array_values ($ this ->_featureFlags ) as $ featureFlag ) {
323347 $ this ->_featureKeyMap [$ featureFlag ->getKey ()] = $ featureFlag ;
@@ -655,6 +679,60 @@ public function getVariationFromId($experimentKey, $variationId)
655679 return new Variation ();
656680 }
657681
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+
658736 /**
659737 * Gets the feature variable instance given feature flag key and variable key
660738 *
0 commit comments