Skip to content

Commit 0e7cefc

Browse files
authored
feat(ForcedDecisions): add forced-decisions APIs to OptimizelyUserContext (#233)
Add a set of new APIs for forced-decisions to OptimizelyUserContext: setForcedDecision getForcedDecision removeForcedDecision removeAllForcedDecision
1 parent e46fde5 commit 0e7cefc

File tree

12 files changed

+1459
-152
lines changed

12 files changed

+1459
-152
lines changed

src/Optimizely/Config/DatafileProjectConfig.php

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,13 @@ class DatafileProjectConfig implements ProjectConfigInterface
245245
*/
246246
private $_sendFlagDecisions;
247247

248+
/**
249+
* Map indicating variations of flag decisions
250+
*
251+
* @return map
252+
*/
253+
private $_flagVariationsMap;
254+
248255
/**
249256
* DatafileProjectConfig constructor to load and set project configuration data.
250257
*
@@ -376,7 +383,30 @@ public function __construct($datafile, $logger, $errorHandler)
376383
}
377384
}
378385
}
386+
$this->_flagVariationsMap = array();
387+
foreach ($this->_featureFlags as $flag) {
388+
$flagVariations = array();
389+
$flagRules = $this->getAllRulesForFlag($flag);
390+
391+
foreach ($flagRules as $rule) {
392+
$filtered_variations = [];
393+
foreach (array_values($rule->getVariations()) as $variation) {
394+
$exist = false;
395+
foreach ($flagVariations as $flagVariation) {
396+
if ($flagVariation->getId() == $variation->getId()) {
397+
$exist = true;
398+
break;
399+
}
400+
}
401+
if (!$exist) {
402+
array_push($filtered_variations, $variation);
403+
}
404+
}
405+
$flagVariations = array_merge($flagVariations, $filtered_variations);
406+
}
379407

408+
$this->_flagVariationsMap[$flag->getKey()] = $flagVariations;
409+
}
380410
// Add variations for rollout experiments to variationIdMap and variationKeyMap
381411
$this->_variationIdMap = $this->_variationIdMap + $rolloutVariationIdMap;
382412
$this->_variationKeyMap = $this->_variationKeyMap + $rolloutVariationKeyMap;
@@ -404,6 +434,18 @@ public function __construct($datafile, $logger, $errorHandler)
404434
}
405435
}
406436

437+
private function getAllRulesForFlag(FeatureFlag $flag)
438+
{
439+
$rules = array();
440+
foreach ($flag->getExperimentIds() as $experimentId) {
441+
array_push($rules, $this->_experimentIdMap[$experimentId]);
442+
}
443+
if ($this->_rolloutIdMap && key_exists($flag->getRolloutId(), $this->_rolloutIdMap)) {
444+
$rollout = $this->_rolloutIdMap[$flag->getRolloutId()];
445+
$rules = array_merge($rules, $rollout->getExperiments());
446+
}
447+
return $rules;
448+
}
407449
/**
408450
* Create ProjectConfig based on datafile string.
409451
*
@@ -614,6 +656,26 @@ public function getExperimentFromId($experimentId)
614656
return new Experiment();
615657
}
616658

659+
/**
660+
* Gets the variation associated with experiment or rollout in instance of given feature flag key
661+
*
662+
* @param string Feature flag key
663+
* @param string variation key
664+
*
665+
* @return Variation / null
666+
*/
667+
public function getFlagVariationByKey($flagKey, $variationKey)
668+
{
669+
if (array_key_exists($flagKey, $this->_flagVariationsMap)) {
670+
foreach ($this->_flagVariationsMap[$flagKey] as $variation) {
671+
if ($variation->getKey() == $variationKey) {
672+
return $variation;
673+
}
674+
}
675+
}
676+
return null;
677+
}
678+
617679
/**
618680
* @param String $featureKey Key of the feature flag
619681
*
@@ -868,6 +930,16 @@ public function isFeatureExperiment($experimentId)
868930
return array_key_exists($experimentId, $this->_experimentFeatureMap);
869931
}
870932

933+
/**
934+
* Returns map array of Flag key as key and Variations as value
935+
*
936+
* @return array
937+
*/
938+
public function getFlagVariationsMap()
939+
{
940+
return $this->_flagVariationsMap;
941+
}
942+
871943
/**
872944
* Returns if flag decisions should be sent to server or not
873945
*

src/Optimizely/Config/ProjectConfigInterface.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,23 @@ public function getVariationFromKeyByExperimentId($experimentId, $variationKey);
199199
* @return FeatureVariable / null
200200
*/
201201
public function getFeatureVariableFromKey($featureFlagKey, $variableKey);
202-
202+
203+
/**
204+
* Gets the variation associated with experiment or rollout in instance of given feature flag key
205+
*
206+
* @param string Feature flag key
207+
* @param string variation key
208+
*
209+
* @return Variation / null
210+
*/
211+
public function getFlagVariationByKey($flagKey, $variationKey);
212+
213+
/**
214+
* Returns map array of Flag key as key and Variations as value
215+
*
216+
* @return array
217+
*/
218+
public function getFlagVariationsMap();
203219
/**
204220
* Determines if given experiment is a feature test.
205221
*

0 commit comments

Comments
 (0)