diff options
author | Michael Muré <batolettre@gmail.com> | 2020-03-14 16:47:38 +0100 |
---|---|---|
committer | Michael Muré <batolettre@gmail.com> | 2020-03-28 17:13:27 +0100 |
commit | 5e4dc87ffec7f87bbf3ebfcf256777ad773e8450 (patch) | |
tree | 04553cfb7ab8ea279c7415586ce1d0fe5c819996 /cache/filter.go | |
parent | 58abc6b0a35b679ac0c34579ff1cb53c8fa71af4 (diff) | |
download | git-bug-5e4dc87ffec7f87bbf3ebfcf256777ad773e8450.tar.gz |
cache: replace the all-in-one query parser by a complete one with AST/lexer/parser
Diffstat (limited to 'cache/filter.go')
-rw-r--r-- | cache/filter.go | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/cache/filter.go b/cache/filter.go index ebe774ac..021962a7 100644 --- a/cache/filter.go +++ b/cache/filter.go @@ -5,6 +5,7 @@ import ( "github.com/MichaelMure/git-bug/bug" "github.com/MichaelMure/git-bug/entity" + "github.com/MichaelMure/git-bug/query/ast" ) // resolver has the resolving functions needed by filters. @@ -17,15 +18,10 @@ type resolver interface { type Filter func(excerpt *BugExcerpt, resolver resolver) bool // StatusFilter return a Filter that match a bug status -func StatusFilter(query string) (Filter, error) { - status, err := bug.StatusFromString(query) - if err != nil { - return nil, err - } - +func StatusFilter(status bug.Status) Filter { return func(excerpt *BugExcerpt, resolver resolver) bool { return excerpt.Status == status - }, nil + } } // AuthorFilter return a Filter that match a bug author @@ -116,8 +112,8 @@ func NoLabelFilter() Filter { } } -// Filters is a collection of Filter that implement a complex filter -type Filters struct { +// Matcher is a collection of Filter that implement a complex filter +type Matcher struct { Status []Filter Author []Filter Actor []Filter @@ -127,8 +123,35 @@ type Filters struct { NoFilters []Filter } +// compileMatcher transform an ast.Filters into a specialized matcher +// for the cache. +func compileMatcher(filters ast.Filters) *Matcher { + result := &Matcher{} + + for _, value := range filters.Status { + result.Status = append(result.Status, StatusFilter(value)) + } + for _, value := range filters.Author { + result.Author = append(result.Author, AuthorFilter(value)) + } + for _, value := range filters.Actor { + result.Actor = append(result.Actor, ActorFilter(value)) + } + for _, value := range filters.Participant { + result.Participant = append(result.Participant, ParticipantFilter(value)) + } + for _, value := range filters.Label { + result.Label = append(result.Label, LabelFilter(value)) + } + for _, value := range filters.Title { + result.Title = append(result.Title, TitleFilter(value)) + } + + return result +} + // Match check if a bug match the set of filters -func (f *Filters) Match(excerpt *BugExcerpt, resolver resolver) bool { +func (f *Matcher) Match(excerpt *BugExcerpt, resolver resolver) bool { if match := f.orMatch(f.Status, excerpt, resolver); !match { return false } @@ -161,7 +184,7 @@ func (f *Filters) Match(excerpt *BugExcerpt, resolver resolver) bool { } // Check if any of the filters provided match the bug -func (*Filters) orMatch(filters []Filter, excerpt *BugExcerpt, resolver resolver) bool { +func (*Matcher) orMatch(filters []Filter, excerpt *BugExcerpt, resolver resolver) bool { if len(filters) == 0 { return true } @@ -175,7 +198,7 @@ func (*Filters) orMatch(filters []Filter, excerpt *BugExcerpt, resolver resolver } // Check if all of the filters provided match the bug -func (*Filters) andMatch(filters []Filter, excerpt *BugExcerpt, resolver resolver) bool { +func (*Matcher) andMatch(filters []Filter, excerpt *BugExcerpt, resolver resolver) bool { if len(filters) == 0 { return true } |