Clone filterer of label filter (#11514)

pull/11500/head^2
Karsten Jeschkies 1 year ago committed by GitHub
parent 8931f4a978
commit 27d21067e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      pkg/logql/log/label_filter.go
  2. 4
      pkg/logql/syntax/clone.go
  3. 26
      pkg/logql/syntax/clone_test.go

@ -366,7 +366,7 @@ func NewStringLabelFilter(m *labels.Matcher) LabelFilterer {
return &LineFilterLabelFilter{
Matcher: m,
filter: f,
Filter: f,
}
}
@ -383,12 +383,12 @@ func (s *StringLabelFilter) RequiredLabelNames() []string {
// LineFilterLabelFilter filters the desired label using an optimized line filter
type LineFilterLabelFilter struct {
*labels.Matcher
filter Filterer
Filter Filterer
}
// overrides the matcher.String() function in case there is a regexpFilter
func (s *LineFilterLabelFilter) String() string {
if unwrappedFilter, ok := s.filter.(regexpFilter); ok {
if unwrappedFilter, ok := s.Filter.(regexpFilter); ok {
rStr := unwrappedFilter.String()
str := fmt.Sprintf("%s%s`%s`", s.Matcher.Name, s.Matcher.Type, rStr)
return str
@ -398,7 +398,7 @@ func (s *LineFilterLabelFilter) String() string {
func (s *LineFilterLabelFilter) Process(_ int64, line []byte, lbs *LabelsBuilder) ([]byte, bool) {
v := labelValue(s.Name, lbs)
return line, s.filter.Filter(unsafeGetBytes(v))
return line, s.Filter.Filter(unsafeGetBytes(v))
}
func (s *LineFilterLabelFilter) isLabelFilterer() {}

@ -230,7 +230,9 @@ func cloneLabelFilterer(filter log.LabelFilterer) log.LabelFilterer {
}
return copied
case *log.LineFilterLabelFilter:
copied := &log.LineFilterLabelFilter{}
copied := &log.LineFilterLabelFilter{
Filter: concrete.Filter,
}
if concrete.Matcher != nil {
copied.Matcher = mustNewMatcher(concrete.Type, concrete.Name, concrete.Value)
}

@ -81,17 +81,35 @@ func TestClone(t *testing.T) {
}
func TestCloneStringLabelFilter(t *testing.T) {
expr := newPipelineExpr(
for name, tc := range map[string]struct {
expr Expr
}{
"pipeline": {
expr: newPipelineExpr(
newMatcherExpr([]*labels.Matcher{mustNewMatcher(labels.MatchEqual, "foo", "bar")}),
MultiStageExpr{
newLogfmtParserExpr(nil),
newLabelFilterExpr(&log.StringLabelFilter{Matcher: labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}),
},
)
actual, err := Clone[Expr](expr)
),
},
"filterer": {
expr: &LabelFilterExpr{
LabelFilterer: &log.LineFilterLabelFilter{
Matcher: mustNewMatcher(labels.MatchEqual, "foo", "bar"),
Filter: log.ExistsFilter,
},
},
},
} {
t.Run(name, func(t *testing.T) {
actual, err := Clone[Expr](tc.expr)
require.NoError(t, err)
require.Equal(t, expr.Pretty(0), actual.Pretty(0))
require.Equal(t, tc.expr.Pretty(0), actual.Pretty(0))
require.Equal(t, tc.expr, actual)
})
}
}
func TestCloneParseTestCases(t *testing.T) {

Loading…
Cancel
Save