From 80bbd0477897e5926ce0441b82a1672f09c0b5ad Mon Sep 17 00:00:00 2001
From: Tom Wilkie <tom.wilkie@gmail.com>
Date: Fri, 19 Apr 2019 15:50:13 +0800
Subject: [PATCH] Add an extra filter step if the user specifies a regex using
 old API.

Signed-off-by: Tom Wilkie <tom.wilkie@gmail.com>
---
 pkg/ingester/instance.go | 4 ++++
 pkg/logql/ast.go         | 9 +++++++++
 pkg/logql/expr.go        | 8 ++++----
 pkg/logql/expr.y         | 8 ++++----
 pkg/querier/store.go     | 4 ++++
 5 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/pkg/ingester/instance.go b/pkg/ingester/instance.go
index 7862bad4..cd2e2b34 100644
--- a/pkg/ingester/instance.go
+++ b/pkg/ingester/instance.go
@@ -103,6 +103,10 @@ func (i *instance) Query(req *logproto.QueryRequest, queryServer logproto.Querie
 		return err
 	}
 
+	if req.Regex != "" {
+		expr = logql.NewFilterExpr(expr, labels.MatchRegexp, req.Regex)
+	}
+
 	querier := logql.QuerierFunc(func(matchers []*labels.Matcher) (iter.EntryIterator, error) {
 		iters, err := i.lookupStreams(req, matchers)
 		if err != nil {
diff --git a/pkg/logql/ast.go b/pkg/logql/ast.go
index 256a42e3..95341a0f 100644
--- a/pkg/logql/ast.go
+++ b/pkg/logql/ast.go
@@ -42,6 +42,15 @@ type filterExpr struct {
 	match string
 }
 
+// NewFilterExpr wraps an existing Expr with a next filter expression.
+func NewFilterExpr(left Expr, ty labels.MatchType, match string) Expr {
+	return &filterExpr{
+		left:  left,
+		ty:    ty,
+		match: match,
+	}
+}
+
 func (e *filterExpr) Eval(q Querier) (iter.EntryIterator, error) {
 	var f func(string) bool
 	switch e.ty {
diff --git a/pkg/logql/expr.go b/pkg/logql/expr.go
index 358edb33..70c2cd7a 100644
--- a/pkg/logql/expr.go
+++ b/pkg/logql/expr.go
@@ -478,25 +478,25 @@ exprdefault:
 		exprDollar = exprS[exprpt-3 : exprpt+1]
 //line pkg/logql/expr.y:32
 		{
-			exprVAL.Expr = &filterExpr{exprDollar[1].Expr, labels.MatchRegexp, exprDollar[3].str}
+			exprVAL.Expr = NewFilterExpr(exprDollar[1].Expr, labels.MatchRegexp, exprDollar[3].str)
 		}
 	case 4:
 		exprDollar = exprS[exprpt-3 : exprpt+1]
 //line pkg/logql/expr.y:33
 		{
-			exprVAL.Expr = &filterExpr{exprDollar[1].Expr, labels.MatchEqual, exprDollar[3].str}
+			exprVAL.Expr = NewFilterExpr(exprDollar[1].Expr, labels.MatchEqual, exprDollar[3].str)
 		}
 	case 5:
 		exprDollar = exprS[exprpt-3 : exprpt+1]
 //line pkg/logql/expr.y:34
 		{
-			exprVAL.Expr = &filterExpr{exprDollar[1].Expr, labels.MatchNotRegexp, exprDollar[3].str}
+			exprVAL.Expr = NewFilterExpr(exprDollar[1].Expr, labels.MatchNotRegexp, exprDollar[3].str)
 		}
 	case 6:
 		exprDollar = exprS[exprpt-3 : exprpt+1]
 //line pkg/logql/expr.y:35
 		{
-			exprVAL.Expr = &filterExpr{exprDollar[1].Expr, labels.MatchNotEqual, exprDollar[3].str}
+			exprVAL.Expr = NewFilterExpr(exprDollar[1].Expr, labels.MatchNotEqual, exprDollar[3].str)
 		}
 	case 7:
 		exprDollar = exprS[exprpt-2 : exprpt+1]
diff --git a/pkg/logql/expr.y b/pkg/logql/expr.y
index 4ab96e39..0a958816 100644
--- a/pkg/logql/expr.y
+++ b/pkg/logql/expr.y
@@ -29,10 +29,10 @@ root: expr { exprlex.(*lexer).expr = $1 };
 
 expr:
       OPEN_BRACE matchers CLOSE_BRACE  { $$ = &matchersExpr{ matchers: $2 } }
-    | expr PIPE_MATCH STRING           { $$ = &filterExpr{ $1, labels.MatchRegexp, $3 } }
-    | expr PIPE_EXACT STRING           { $$ = &filterExpr{ $1, labels.MatchEqual, $3 } }
-    | expr NRE STRING                  { $$ = &filterExpr{ $1, labels.MatchNotRegexp, $3 } }
-    | expr NEQ STRING                  { $$ = &filterExpr{ $1, labels.MatchNotEqual, $3 } }
+    | expr PIPE_MATCH STRING           { $$ = NewFilterExpr( $1, labels.MatchRegexp, $3 ) }
+    | expr PIPE_EXACT STRING           { $$ = NewFilterExpr( $1, labels.MatchEqual, $3 ) }
+    | expr NRE STRING                  { $$ = NewFilterExpr( $1, labels.MatchNotRegexp, $3 ) }
+    | expr NEQ STRING                  { $$ = NewFilterExpr( $1, labels.MatchNotEqual, $3 ) }
     | expr PIPE_MATCH                 { exprlex.(*lexer).Error("unexpected end of query, expected string") }
     | expr STRING                     { exprlex.(*lexer).Error("unexpected string, expected pipe") }
     ;
diff --git a/pkg/querier/store.go b/pkg/querier/store.go
index 3e8ca7f0..01500d72 100644
--- a/pkg/querier/store.go
+++ b/pkg/querier/store.go
@@ -21,6 +21,10 @@ func (q Querier) queryStore(ctx context.Context, req *logproto.QueryRequest) (it
 		return nil, err
 	}
 
+	if req.Regex != "" {
+		expr = logql.NewFilterExpr(expr, labels.MatchRegexp, req.Regex)
+	}
+
 	querier := logql.QuerierFunc(func(matchers []*labels.Matcher) (iter.EntryIterator, error) {
 		nameLabelMatcher, err := labels.NewMatcher(labels.MatchEqual, labels.MetricName, "logs")
 		if err != nil {
-- 
GitLab