github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/chunk/opts.go (about)

     1  package chunk
     2  
     3  import (
     4  	"strings"
     5  	"unicode/utf8"
     6  )
     7  
     8  // Bitmap used by func isRegexMetaCharacter to check whether a character needs to be escaped.
     9  var regexMetaCharacterBytes [16]byte
    10  
    11  // isRegexMetaCharacter reports whether byte b needs to be escaped.
    12  func isRegexMetaCharacter(b byte) bool {
    13  	return b < utf8.RuneSelf && regexMetaCharacterBytes[b%16]&(1<<(b/16)) != 0
    14  }
    15  
    16  func init() {
    17  	for _, b := range []byte(`.+*?()|[]{}^$`) {
    18  		regexMetaCharacterBytes[b%16] |= 1 << (b / 16)
    19  	}
    20  }
    21  
    22  // FindSetMatches returns list of values that can be equality matched on.
    23  // copied from Prometheus querier.go, removed check for Prometheus wrapper.
    24  func FindSetMatches(pattern string) []string {
    25  	escaped := false
    26  	sets := []*strings.Builder{{}}
    27  	for i := 0; i < len(pattern); i++ {
    28  		if escaped {
    29  			switch {
    30  			case isRegexMetaCharacter(pattern[i]):
    31  				sets[len(sets)-1].WriteByte(pattern[i])
    32  			case pattern[i] == '\\':
    33  				sets[len(sets)-1].WriteByte('\\')
    34  			default:
    35  				return nil
    36  			}
    37  			escaped = false
    38  		} else {
    39  			switch {
    40  			case isRegexMetaCharacter(pattern[i]):
    41  				if pattern[i] == '|' {
    42  					sets = append(sets, &strings.Builder{})
    43  				} else {
    44  					return nil
    45  				}
    46  			case pattern[i] == '\\':
    47  				escaped = true
    48  			default:
    49  				sets[len(sets)-1].WriteByte(pattern[i])
    50  			}
    51  		}
    52  	}
    53  	matches := make([]string, 0, len(sets))
    54  	for _, s := range sets {
    55  		if s.Len() > 0 {
    56  			matches = append(matches, s.String())
    57  		}
    58  	}
    59  	return matches
    60  }