Skip to content

Commit c9f901a

Browse files
committed
init
1 parent 39cfc1c commit c9f901a

File tree

3 files changed

+94
-8
lines changed

3 files changed

+94
-8
lines changed

src/Optimizely/Bucketer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ public function bucket(ProjectConfigInterface $config, Experiment $experiment, $
197197
list($variationId, $reasons) = $this->findBucket($bucketingId, $userId, $experiment->getId(), $experiment->getTrafficAllocation());
198198
$decideReasons = array_merge($decideReasons, $reasons);
199199
if (!empty($variationId)) {
200-
$variation = $config->getVariationFromId($experiment->getKey(), $variationId);
200+
$variation = $config->getVariationFromIdByExperimentId($experiment->getId(), $variationId);
201201

202202
return [ $variation, $decideReasons ];
203203
}

src/Optimizely/Config/DatafileProjectConfig.php

Lines changed: 75 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*

src/Optimizely/Config/ProjectConfigInterface.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,24 @@ public function getVariationFromKey($experimentKey, $variationKey);
141141
*/
142142
public function getVariationFromId($experimentKey, $variationId);
143143

144+
/**
145+
* @param $experimentId string ID for experiment.
146+
* @param $variationId string ID for variation.
147+
*
148+
* @return Variation Entity corresponding to the provided experiment ID and variation ID.
149+
* Dummy entity is returned if key or ID is invalid.
150+
*/
151+
public function getVariationFromIdByExperimentId($experimentId, $variationId);
152+
153+
/**
154+
* @param $experimentId string ID for experiment.
155+
* @param $variationKey string Key for variation.
156+
*
157+
* @return Variation Entity corresponding to the provided experiment ID and variation Key.
158+
* Dummy entity is returned if key or ID is invalid.
159+
*/
160+
public function getVariationFromKeyByExperimentId($experimentId, $variationKey);
161+
144162
/**
145163
* Gets the feature variable instance given feature flag key and variable key
146164
*

0 commit comments

Comments
 (0)