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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy