Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 35 additions & 12 deletions cache/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/MichaelMure/git-bug/bug"
"github.com/MichaelMure/git-bug/entity"
"github.com/MichaelMure/git-bug/query"
)

// resolver has the resolving functions needed by filters.
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -127,8 +123,35 @@ type Filters struct {
NoFilters []Filter
}

// compileMatcher transform a query.Filters into a specialized matcher
// for the cache.
func compileMatcher(filters query.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
}
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand Down
172 changes: 0 additions & 172 deletions cache/query.go

This file was deleted.

41 changes: 0 additions & 41 deletions cache/query_test.go

This file was deleted.

24 changes: 16 additions & 8 deletions cache/repo_cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/MichaelMure/git-bug/bug"
"github.com/MichaelMure/git-bug/entity"
"github.com/MichaelMure/git-bug/identity"
"github.com/MichaelMure/git-bug/query"
"github.com/MichaelMure/git-bug/repository"
"github.com/MichaelMure/git-bug/util/git"
"github.com/MichaelMure/git-bug/util/process"
Expand Down Expand Up @@ -525,37 +526,44 @@ func (c *RepoCache) resolveBugMatcher(f func(*BugExcerpt) bool) (entity.Id, erro
}

// QueryBugs return the id of all Bug matching the given Query
func (c *RepoCache) QueryBugs(query *Query) []entity.Id {
func (c *RepoCache) QueryBugs(q *query.Query) []entity.Id {
c.muBug.RLock()
defer c.muBug.RUnlock()

if query == nil {
if q == nil {
return c.AllBugsIds()
}

matcher := compileMatcher(q.Filters)

var filtered []*BugExcerpt

for _, excerpt := range c.bugExcerpts {
if query.Match(excerpt, c) {
if matcher.Match(excerpt, c) {
filtered = append(filtered, excerpt)
}
}

var sorter sort.Interface

switch query.OrderBy {
case OrderById:
switch q.OrderBy {
case query.OrderById:
sorter = BugsById(filtered)
case OrderByCreation:
case query.OrderByCreation:
sorter = BugsByCreationTime(filtered)
case OrderByEdit:
case query.OrderByEdit:
sorter = BugsByEditTime(filtered)
default:
panic("missing sort type")
}

if query.OrderDirection == OrderDescending {
switch q.OrderDirection {
case query.OrderAscending:
// Nothing to do
case query.OrderDescending:
sorter = sort.Reverse(sorter)
default:
panic("missing sort direction")
}

sort.Sort(sorter)
Expand Down
5 changes: 3 additions & 2 deletions cache/repo_cache_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/stretchr/testify/require"

"github.com/MichaelMure/git-bug/query"
"github.com/MichaelMure/git-bug/repository"
)

Expand Down Expand Up @@ -68,9 +69,9 @@ func TestCache(t *testing.T) {
require.NoError(t, err)

// Querying
query, err := ParseQuery("status:open author:descartes sort:edit-asc")
q, err := query.Parse("status:open author:descartes sort:edit-asc")
require.NoError(t, err)
require.Len(t, cache.QueryBugs(query), 2)
require.Len(t, cache.QueryBugs(q), 2)

// Close
require.NoError(t, cache.Close())
Expand Down
Loading