in experiments/client.go [108:228]
func (e *ExperimentClient) MatchExperiment(sceneName string, experimentContext *model.ExperimentContext) *model.ExperimentResult {
sceneData := e.SceneMap
scene, exist := sceneData[sceneName]
if !exist {
e.logError(fmt.Errorf("scene:%s, not found the scene info", sceneName))
return model.NewExperimentResult(sceneName, experimentContext)
}
experimentResult := model.NewExperimentResult(sceneName, experimentContext)
var defaultExperimentRoom *model.ExperimentRoom
var matchExperimentRoom *model.ExperimentRoom
// first find base experiment room
for _, experimentRoom := range scene.ExperimentRooms {
if experimentRoom.Type == common.ExpRoom_Type_Base {
defaultExperimentRoom = experimentRoom
break
}
}
// if experiment room has debug users then matchExperimentRoom
for _, experimentRoom := range scene.ExperimentRooms {
if experimentRoom.MatchDebugUsers(experimentContext) {
matchExperimentRoom = experimentRoom
break
}
}
// if matchExperimentRoom is null, so no debug users found
// then find no base experiment room is match
if matchExperimentRoom == nil {
for _, experimentRoom := range scene.ExperimentRooms {
if experimentRoom.Type != common.ExpRoom_Type_Base {
if experimentRoom.Match(experimentContext) {
matchExperimentRoom = experimentRoom
break
}
}
}
}
if matchExperimentRoom == nil {
matchExperimentRoom = defaultExperimentRoom
}
if matchExperimentRoom != nil {
experimentResult.ExperimentRoom = matchExperimentRoom
experimentResult.Layers = matchExperimentRoom.Layers
for _, layer := range matchExperimentRoom.Layers {
experimentGroup := layer.FindMatchExperimentGroup(experimentContext)
if experimentGroup != nil {
experimentResult.AddMatchExperimentGroup(layer.LayerName, experimentGroup)
var defaultExperiment *model.Experiment
var matchExperiment *model.Experiment
for _, experiment := range experimentGroup.Experiments {
if experiment.Type == common.Experiment_Type_Default {
defaultExperiment = experiment
}
}
// find match experiment
if matchExperiment == nil {
// first match debug users
for _, experiment := range experimentGroup.Experiments {
if experiment.Type != common.Experiment_Type_Default && experiment.MatchDebugUsers(experimentContext) {
matchExperiment = experiment
e.logInfo("match experiment debug users uid:%s", experimentContext.Uid)
break
}
}
if matchExperiment == nil {
var hashKey string
if experimentGroup.DistributionType == common.ExpGroup_Distribution_Type_TimeDuration {
currTime := time.Now()
duration := (currTime.Unix() % 86400) / int64((experimentGroup.DistributionTimeDuration * 60))
hashKey = fmt.Sprintf("%s_%d_EXPROOM%d_LAYER%d_EXPGROUP%d", currTime.Format("20060102"), duration, experimentGroup.ExpRoomId,
experimentGroup.LayerId, experimentGroup.ExpGroupId)
} else {
hashKey = fmt.Sprintf("%s_EXPROOM%d_LAYER%d_EXPGROUP%d", experimentContext.Uid, experimentGroup.ExpRoomId,
experimentGroup.LayerId, experimentGroup.ExpGroupId)
}
hashValue := e.hashValue(hashKey)
//e.logInfo("match experiment hash key:%s, value:%d", hashKey, hashValue)
hashValueStr := strconv.FormatUint(hashValue, 10)
experimentContext.SetExperimentHashString(hashValueStr)
for _, experiment := range experimentGroup.Experiments {
if experiment.Type != common.Experiment_Type_Default && experiment.Match(experimentContext) {
matchExperiment = experiment
break
}
}
}
}
if matchExperiment == nil {
// if defaultExperiment not found ,set baseExperiment is defaultExperiment
if defaultExperiment == nil {
for _, experiment := range experimentGroup.Experiments {
if experiment.Type == common.Experiment_Type_Base {
defaultExperiment = experiment.Clone()
defaultExperiment.Type = common.Experiment_Type_Default
}
}
}
matchExperiment = defaultExperiment
}
if matchExperiment != nil {
experimentResult.AddMatchExperiment(layer.LayerName, matchExperiment)
}
}
}
}
experimentResult.Init()
return experimentResult
}