@@ -135,6 +135,20 @@ private Dictionary<string, Dictionary<string, Variation>> _VariationKeyMap
135135 = new Dictionary < string , Dictionary < string , Variation > > ( ) ;
136136 public Dictionary < string , Dictionary < string , Variation > > VariationKeyMap { get { return _VariationKeyMap ; } }
137137
138+ /// <summary>
139+ /// Associative array of experiment ID to associative array of variation key to variations
140+ /// </summary>
141+ private Dictionary < string , Dictionary < string , Variation > > _VariationKeyMapByExperimentId
142+ = new Dictionary < string , Dictionary < string , Variation > > ( ) ;
143+ public Dictionary < string , Dictionary < string , Variation > > VariationKeyMapByExperimentId { get { return _VariationKeyMapByExperimentId ; } }
144+
145+ /// <summary>
146+ /// Associative array of experiment ID to associative array of variation key to variations
147+ /// </summary>
148+ private Dictionary < string , Dictionary < string , Variation > > _VariationIdMapByExperimentId
149+ = new Dictionary < string , Dictionary < string , Variation > > ( ) ;
150+ public Dictionary < string , Dictionary < string , Variation > > VariationKeyIdByExperimentId { get { return _VariationIdMapByExperimentId ; } }
151+
138152
139153 /// <summary>
140154 /// Associative array of experiment key to associative array of variation ID to variations
@@ -254,9 +268,10 @@ private void Initialize()
254268 TypedAudiences = TypedAudiences ?? new Audience [ 0 ] ;
255269 FeatureFlags = FeatureFlags ?? new FeatureFlag [ 0 ] ;
256270 Rollouts = Rollouts ?? new Rollout [ 0 ] ;
271+ _ExperimentKeyMap = new Dictionary < string , Experiment > ( ) ;
257272
258273 _GroupIdMap = ConfigParser < Group > . GenerateMap ( entities : Groups , getKey : g => g . Id . ToString ( ) , clone : true ) ;
259- _ExperimentKeyMap = ConfigParser < Experiment > . GenerateMap ( entities : Experiments , getKey : e => e . Key , clone : true ) ;
274+ _ExperimentIdMap = ConfigParser < Experiment > . GenerateMap ( entities : Experiments , getKey : e => e . Id , clone : true ) ;
260275 _EventKeyMap = ConfigParser < Entity . Event > . GenerateMap ( entities : Events , getKey : e => e . Key , clone : true ) ;
261276 _AttributeKeyMap = ConfigParser < Attribute > . GenerateMap ( entities : Attributes , getKey : a => a . Key , clone : true ) ;
262277 _AudienceIdMap = ConfigParser < Audience > . GenerateMap ( entities : Audiences , getKey : a => a . Id . ToString ( ) , clone : true ) ;
@@ -270,7 +285,7 @@ private void Initialize()
270285
271286 foreach ( Group group in Groups )
272287 {
273- var experimentsInGroup = ConfigParser < Experiment > . GenerateMap ( group . Experiments , getKey : e => e . Key , clone : true ) ;
288+ var experimentsInGroup = ConfigParser < Experiment > . GenerateMap ( group . Experiments , getKey : e => e . Id , clone : true ) ;
274289 foreach ( Experiment experiment in experimentsInGroup . Values )
275290 {
276291 experiment . GroupId = group . Id ;
@@ -279,22 +294,27 @@ private void Initialize()
279294
280295 // RJE: I believe that this is equivalent to this:
281296 // $this->_experimentKeyMap = array_merge($this->_experimentKeyMap, $experimentsInGroup);
282- foreach ( string key in experimentsInGroup . Keys )
283- _ExperimentKeyMap [ key ] = experimentsInGroup [ key ] ;
297+ foreach ( var experiment in experimentsInGroup . Values )
298+ _ExperimentIdMap [ experiment . Id ] = experiment ;
284299 }
285300
286- foreach ( Experiment experiment in _ExperimentKeyMap . Values )
301+ foreach ( Experiment experiment in _ExperimentIdMap . Values )
287302 {
288303 _VariationKeyMap [ experiment . Key ] = new Dictionary < string , Variation > ( ) ;
289304 _VariationIdMap [ experiment . Key ] = new Dictionary < string , Variation > ( ) ;
290- _ExperimentIdMap [ experiment . Id ] = experiment ;
305+ _VariationIdMapByExperimentId [ experiment . Id ] = new Dictionary < string , Variation > ( ) ;
306+ _VariationKeyMapByExperimentId [ experiment . Id ] = new Dictionary < string , Variation > ( ) ;
291307
308+ _ExperimentKeyMap [ experiment . Key ] = experiment ;
309+
292310 if ( experiment . Variations != null )
293311 {
294312 foreach ( Variation variation in experiment . Variations )
295313 {
296314 _VariationKeyMap [ experiment . Key ] [ variation . Key ] = variation ;
297315 _VariationIdMap [ experiment . Key ] [ variation . Id ] = variation ;
316+ _VariationKeyMapByExperimentId [ experiment . Id ] [ variation . Key ] = variation ;
317+ _VariationIdMapByExperimentId [ experiment . Id ] [ variation . Id ] = variation ;
298318 }
299319 }
300320 }
@@ -306,13 +326,17 @@ private void Initialize()
306326 {
307327 _VariationKeyMap [ rolloutRule . Key ] = new Dictionary < string , Variation > ( ) ;
308328 _VariationIdMap [ rolloutRule . Key ] = new Dictionary < string , Variation > ( ) ;
329+ _VariationIdMapByExperimentId [ rolloutRule . Id ] = new Dictionary < string , Variation > ( ) ;
330+ _VariationKeyMapByExperimentId [ rolloutRule . Id ] = new Dictionary < string , Variation > ( ) ;
309331
310332 if ( rolloutRule . Variations != null )
311333 {
312334 foreach ( var variation in rolloutRule . Variations )
313335 {
314336 _VariationKeyMap [ rolloutRule . Key ] [ variation . Key ] = variation ;
315337 _VariationIdMap [ rolloutRule . Key ] [ variation . Id ] = variation ;
338+ _VariationKeyMapByExperimentId [ rolloutRule . Id ] [ variation . Key ] = variation ;
339+ _VariationIdMapByExperimentId [ rolloutRule . Id ] [ variation . Id ] = variation ;
316340 }
317341 }
318342 }
@@ -484,8 +508,28 @@ public Variation GetVariationFromKey(string experimentKey, string variationKey)
484508 return new Variation ( ) ;
485509 }
486510
511+
487512 /// <summary>
488- /// Get the Variation from the Key/ID
513+ /// Get the Variation from the keys
514+ /// </summary>
515+ /// <param name="experimentId">Id for Experiment</param>
516+ /// <param name="variationKey">key for Variation</param>
517+ /// <returns>Variation Entity corresponding to the provided experiment key and variation key or a dummy
518+ /// entity if keys are invalid</returns>
519+ public Variation GetVariationFromKeyByExperimentId ( string experimentId , string variationKey )
520+ {
521+ if ( _VariationKeyMapByExperimentId . ContainsKey ( experimentId ) &&
522+ _VariationKeyMapByExperimentId [ experimentId ] . ContainsKey ( variationKey ) )
523+ return _VariationKeyMapByExperimentId [ experimentId ] [ variationKey ] ;
524+
525+ string message = $@ "No variation key ""{ variationKey } "" defined in datafile for experiment ""{ experimentId } "".";
526+ Logger . Log ( LogLevel . ERROR , message ) ;
527+ ErrorHandler . HandleError ( new Exceptions . InvalidVariationException ( "Provided variation is not in datafile." ) ) ;
528+ return new Variation ( ) ;
529+ }
530+
531+ /// <summary>
532+ /// Get the Variation from the Key/Id
489533 /// </summary>
490534 /// <param name="experimentKey">key for Experiment</param>
491535 /// <param name="variationId">ID for Variation</param>
@@ -503,6 +547,25 @@ public Variation GetVariationFromId(string experimentKey, string variationId)
503547 return new Variation ( ) ;
504548 }
505549
550+ /// <summary>
551+ /// Get the Variation from the expId/varId
552+ /// </summary>
553+ /// <param name="experimentId">ID for Experiment</param>
554+ /// <param name="variationId">ID for Variation</param>
555+ /// <returns>Variation Entity corresponding to the provided experiment key and variation ID or a dummy
556+ /// entity if experiment ID or variation ID is invalid</returns>
557+ public Variation GetVariationFromIdByExperimentId ( string experimentId , string variationId )
558+ {
559+ if ( _VariationIdMapByExperimentId . ContainsKey ( experimentId ) &&
560+ _VariationIdMapByExperimentId [ experimentId ] . ContainsKey ( variationId ) )
561+ return _VariationIdMapByExperimentId [ experimentId ] [ variationId ] ;
562+
563+ string message = $@ "No variation ID ""{ variationId } "" defined in datafile for experiment ""{ experimentId } "".";
564+ Logger . Log ( LogLevel . ERROR , message ) ;
565+ ErrorHandler . HandleError ( new Exceptions . InvalidVariationException ( "Provided variation is not in datafile." ) ) ;
566+ return new Variation ( ) ;
567+ }
568+
506569 /// <summary>
507570 /// Get the feature from the key
508571 /// </summary>
0 commit comments