lib/logstorage: make sure that getCommonTokens returns common tokens in the original order of tokens inside tokenSets arg

This fixes flaky test TestGetCommonTokensForOrFilters:

    filter_or_test.go:143: unexpected tokens for field "_msg"; got ["foo" "bar"]; want ["bar" "foo"]
This commit is contained in:
Aliaksandr Valialkin 2024-09-19 15:56:34 +02:00
parent c00b64726c
commit a3d8077959
No known key found for this signature in database
GPG key ID: 52C003EE2BCDB9EB

View file

@ -496,33 +496,27 @@ func getCommonTokensAndTokenSets(values []string) ([]string, [][]string) {
return commonTokens, tokenSets
}
// getCommonTokens returns common tokens seen at every set of tokens inside tokenSets.
//
// The returned common tokens preserve the original order seen in tokenSets.
func getCommonTokens(tokenSets [][]string) []string {
if len(tokenSets) == 0 {
return nil
}
m := make(map[string]struct{}, len(tokenSets[0]))
for _, token := range tokenSets[0] {
m[token] = struct{}{}
}
commonTokens := append([]string{}, tokenSets[0]...)
for _, tokens := range tokenSets[1:] {
if len(m) == 0 {
if len(commonTokens) == 0 {
return nil
}
for token := range m {
if !slices.Contains(tokens, token) {
delete(m, token)
dst := commonTokens[:0]
for _, token := range commonTokens {
if slices.Contains(tokens, token) {
dst = append(dst, token)
}
}
commonTokens = dst
}
if len(m) == 0 {
return nil
}
tokens := make([]string, 0, len(m))
for token := range m {
tokens = append(tokens, token)
}
return tokens
return commonTokens
}