diff --git a/treatment-service/services/experiment_service.go b/treatment-service/services/experiment_service.go index 0613c908..8792716f 100644 --- a/treatment-service/services/experiment_service.go +++ b/treatment-service/services/experiment_service.go @@ -124,42 +124,41 @@ func (es *experimentService) filterByLookupOrder( segmenters []string, segmenterTypes map[string]schema.SegmenterType, ) []*models.ExperimentMatch { - // Stop search when we have at least 1 match filtered := matches for _, segmenter := range segmenters { orderedValues := filters[segmenter] - if len(orderedValues) == 1 { - continue - } - currentFilteredList := []*models.ExperimentMatch{} segmenterType := segmenterTypes[segmenter] for _, transformedValue := range orderedValues { if len(currentFilteredList) == 0 { - for _, segmenterMatch := range filtered { - segmenterMatchedValue := segmenterMatch.SegmenterMatches[segmenter] + for _, experiment := range filtered { + segmenterMatchedValue := experiment.SegmenterMatches[segmenter] switch segmenterType { case "string": if transformedValue.GetString_() == segmenterMatchedValue.Value.GetString_() { - currentFilteredList = append(currentFilteredList, segmenterMatch) + currentFilteredList = append(currentFilteredList, experiment) } case "integer": if transformedValue.GetInteger() == segmenterMatchedValue.Value.GetInteger() { - currentFilteredList = append(currentFilteredList, segmenterMatch) + currentFilteredList = append(currentFilteredList, experiment) } case "real": if transformedValue.GetReal() == segmenterMatchedValue.Value.GetReal() { - currentFilteredList = append(currentFilteredList, segmenterMatch) + currentFilteredList = append(currentFilteredList, experiment) } case "bool": if transformedValue.GetBool() == segmenterMatchedValue.Value.GetBool() { - currentFilteredList = append(currentFilteredList, segmenterMatch) + currentFilteredList = append(currentFilteredList, experiment) } } } } } - filtered = currentFilteredList + // currentFilteredList could be 0 in case of weak matches, where the segmenter info was + // missing in the original request (i.e., where orderedValues is empty for a given segmenter). + if len(currentFilteredList) > 0 { + filtered = currentFilteredList + } } return filtered diff --git a/treatment-service/services/experiment_service_test.go b/treatment-service/services/experiment_service_test.go index 35b761cb..b6b36b91 100644 --- a/treatment-service/services/experiment_service_test.go +++ b/treatment-service/services/experiment_service_test.go @@ -256,6 +256,12 @@ func (s *ExperimentServiceTestSuite) TestGetExperiment() { expLookupFilters: makeExperimentLookupFilters(s2.CellID(3592210809859604480), 1, 20, "seg-1", 1, 9001, false), expResponse: s.LocalStorage.Experiments[5][0].Experiment, }, + "resolve tiers | no experiment variables": { + projectId: 5, + reqFilter: map[string][]*_segmenters.SegmenterValue{}, + expLookupFilters: makeExperimentLookupFilters(s2.CellID(3592210809859604480), 1, 20, "seg-1", 1, 9001, false), + expResponse: s.LocalStorage.Experiments[5][0].Experiment, + }, "resolve all hierarchy | optional segmenter": { projectId: 6, reqFilter: makeRequestFilter(s2.CellID(3592210809859604480), 1, 20, "seg-1", 1, 9001, false),