func()

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
}