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. 38
      pkg/logql/syntax/clone_test.go

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

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

@ -81,17 +81,35 @@ func TestClone(t *testing.T) {
} }
func TestCloneStringLabelFilter(t *testing.T) { func TestCloneStringLabelFilter(t *testing.T) {
expr := newPipelineExpr( for name, tc := range map[string]struct {
newMatcherExpr([]*labels.Matcher{mustNewMatcher(labels.MatchEqual, "foo", "bar")}), expr Expr
MultiStageExpr{ }{
newLogfmtParserExpr(nil), "pipeline": {
newLabelFilterExpr(&log.StringLabelFilter{Matcher: labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}), expr: newPipelineExpr(
}, newMatcherExpr([]*labels.Matcher{mustNewMatcher(labels.MatchEqual, "foo", "bar")}),
) MultiStageExpr{
actual, err := Clone[Expr](expr) newLogfmtParserExpr(nil),
require.NoError(t, err) newLabelFilterExpr(&log.StringLabelFilter{Matcher: labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}),
},
),
},
"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) { func TestCloneParseTestCases(t *testing.T) {

Loading…
Cancel
Save