From 9988ebde6f89dd5ae10f7ecdd76939e7ef95cee7 Mon Sep 17 00:00:00 2001 From: David BF Date: Fri, 2 Oct 2020 19:35:17 +0200 Subject: [PATCH] Add Regexp FILTER operator (#558) --- pkg/compiler/compiler_filter_test.go | 35 ++++++++++++++++++++++++++++ pkg/compiler/visitor.go | 6 +++++ 2 files changed, 41 insertions(+) diff --git a/pkg/compiler/compiler_filter_test.go b/pkg/compiler/compiler_filter_test.go index f46dba69..96c3ca8b 100644 --- a/pkg/compiler/compiler_filter_test.go +++ b/pkg/compiler/compiler_filter_test.go @@ -46,6 +46,41 @@ func TestForFilter(t *testing.T) { So(string(out), ShouldEqual, `[2,3,3]`) }) + Convey("Should compile query with a regexp FILTER statement", t, func() { + c := compiler.New() + + p, err := c.Compile(` + LET users = [ + { + age: 31, + gender: "m", + name: "Josh" + }, + { + age: 29, + gender: "f", + name: "Mary" + }, + { + age: 36, + gender: "m", + name: "Peter" + } + ] + FOR u IN users + FILTER u.name =~ "r" + RETURN u + `) + + So(err, ShouldBeNil) + + out, err := p.Run(context.Background()) + + So(err, ShouldBeNil) + + So(string(out), ShouldEqual, `[{"age":29,"gender":"f","name":"Mary"},{"age":36,"gender":"m","name":"Peter"}]`) + }) + Convey("Should compile query with multiple FILTER statements", t, func() { c := compiler.New() diff --git a/pkg/compiler/visitor.go b/pkg/compiler/visitor.go index 85d13d8a..b64e664b 100644 --- a/pkg/compiler/visitor.go +++ b/pkg/compiler/visitor.go @@ -434,6 +434,12 @@ func (v *visitor) doVisitFilterClause(ctx *fql.FilterClauseContext, scope *scope return operators.NewEqualityOperator(v.getSourceMap(ctx), left, right, equalityOp.GetText()) } + regexpOp := exp.RegexpOperator() + + if regexpOp != nil { + return operators.NewRegexpOperator(v.getSourceMap(ctx), left, right, regexpOp.GetText()) + } + logicalAndOp := exp.LogicalAndOperator() if logicalAndOp != nil {