in model/model_layer.go [26:75]
func (l *Layer) FindMatchExperimentGroup(experimentContext *ExperimentContext) *ExperimentGroup {
// first find debug users
for _, group := range l.ExperimentGroups {
if group.MatchDebugUsers(experimentContext) {
return group
}
}
// find filter or crowdid experiment group
for _, group := range l.ExperimentGroups {
if group.CrowdTargetType == "" {
if group.Filter != "" || group.CrowdId > 0 {
if group.Match(experimentContext) {
return group
}
}
} else if group.CrowdTargetType == common.CrowdTargetType_Filter || group.CrowdTargetType == common.CrowdTargetType_CrowdId {
if group.Match(experimentContext) {
return group
}
}
}
// find random experiment group
for _, group := range l.ExperimentGroups {
if group.CrowdTargetType == common.CrowdTargetType_Random {
hashKey := fmt.Sprintf("%s_EXPROOM%d_LAYER%d", experimentContext.Uid, l.ExpRoomId, l.LayerId)
hashValue := hashValue(hashKey)
//e.logInfo("match experiment hash key:%s, value:%d", hashKey, hashValue)
hashValueStr := strconv.FormatUint(hashValue, 10)
if group.Match(&ExperimentContext{Uid: hashValueStr}) {
return group
}
}
}
for _, group := range l.ExperimentGroups {
if group.CrowdTargetType == "" {
if group.Filter == "" && group.CrowdId == 0 {
return group
}
} else if group.CrowdTargetType == common.CrowdTargetType_ALL {
return group
}
}
return nil
}