mirror of https://github.com/grafana/loki
Signed-off-by: Tom Wilkie <tom.wilkie@gmail.com>pull/559/head
parent
5e3630815b
commit
bfb34e4070
@ -0,0 +1,92 @@ |
||||
package logql |
||||
|
||||
import ( |
||||
"fmt" |
||||
"regexp" |
||||
"strings" |
||||
|
||||
"github.com/grafana/loki/pkg/iter" |
||||
"github.com/prometheus/prometheus/pkg/labels" |
||||
) |
||||
|
||||
// QuerierFunc implements Querier.
|
||||
type QuerierFunc func([]*labels.Matcher) (iter.EntryIterator, error) |
||||
|
||||
// Query implements Querier.
|
||||
func (q QuerierFunc) Query(ms []*labels.Matcher) (iter.EntryIterator, error) { |
||||
return q(ms) |
||||
} |
||||
|
||||
// Querier allows a LogQL expression to fetch an EntryIterator for a
|
||||
// set of matchers.
|
||||
type Querier interface { |
||||
Query([]*labels.Matcher) (iter.EntryIterator, error) |
||||
} |
||||
|
||||
// Expr is a LogQL expression.
|
||||
type Expr interface { |
||||
Eval(Querier) (iter.EntryIterator, error) |
||||
} |
||||
|
||||
type matchersExpr struct { |
||||
matchers []*labels.Matcher |
||||
} |
||||
|
||||
func (e *matchersExpr) Eval(q Querier) (iter.EntryIterator, error) { |
||||
return q.Query(e.matchers) |
||||
} |
||||
|
||||
type filterExpr struct { |
||||
left Expr |
||||
ty labels.MatchType |
||||
match string |
||||
} |
||||
|
||||
func (e *filterExpr) Eval(q Querier) (iter.EntryIterator, error) { |
||||
var f func(string) bool |
||||
switch e.ty { |
||||
case labels.MatchRegexp: |
||||
re, err := regexp.Compile(e.match) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
f = re.MatchString |
||||
|
||||
case labels.MatchNotRegexp: |
||||
re, err := regexp.Compile(e.match) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
f = func(line string) bool { |
||||
return !re.MatchString(line) |
||||
} |
||||
|
||||
case labels.MatchEqual: |
||||
f = func(line string) bool { |
||||
return strings.Contains(line, e.match) |
||||
} |
||||
|
||||
case labels.MatchNotEqual: |
||||
f = func(line string) bool { |
||||
return !strings.Contains(line, e.match) |
||||
} |
||||
|
||||
default: |
||||
return nil, fmt.Errorf("unknow matcher: %v", e.match) |
||||
} |
||||
|
||||
left, err := e.left.Eval(q) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return iter.NewFilter(f, left), nil |
||||
} |
||||
|
||||
func mustNewMatcher(t labels.MatchType, n, v string) *labels.Matcher { |
||||
m, err := labels.NewMatcher(t, n, v) |
||||
if err != nil { |
||||
panic(err) |
||||
} |
||||
return m |
||||
} |
Loading…
Reference in new issue