Skip to content

Commit

Permalink
cache: provide a generic bug sorting function
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelMure committed Sep 2, 2018
1 parent e3c445f commit 0728c00
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 62 deletions.
67 changes: 12 additions & 55 deletions cache/repo_cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"io/ioutil"
"os"
"path"
"sort"
"strconv"
"strings"

Expand Down Expand Up @@ -154,6 +153,18 @@ func (c *RepoCache) buildAllExcerpt() {
}
}

func (c *RepoCache) allExcerpt() []BugExcerpt {
result := make([]BugExcerpt, len(c.excerpts))

i := 0
for _, val := range c.excerpts {
result[i] = val
i++
}

return result
}

func (c *RepoCache) ResolveBug(id string) (*BugCache, error) {
cached, ok := c.bugs[id]
if ok {
Expand Down Expand Up @@ -204,60 +215,6 @@ func (c *RepoCache) ResolveBugPrefix(prefix string) (*BugCache, error) {
return cached, nil
}

func (c *RepoCache) AllBugOrderById() []string {
result := make([]string, len(c.excerpts))

i := 0
for key := range c.excerpts {
result[i] = key
i++
}

sort.Strings(result)

return result
}

func (c *RepoCache) AllBugsOrderByEdit() []string {
excerpts := make([]BugExcerpt, len(c.excerpts))

i := 0
for _, val := range c.excerpts {
excerpts[i] = val
i++
}

sort.Sort(BugsByEditTime(excerpts))

result := make([]string, len(excerpts))

for i, val := range excerpts {
result[i] = val.Id
}

return result
}

func (c *RepoCache) AllBugsOrderByCreation() []string {
excerpts := make([]BugExcerpt, len(c.excerpts))

i := 0
for _, val := range c.excerpts {
excerpts[i] = val
i++
}

sort.Sort(BugsByCreationTime(excerpts))

result := make([]string, len(excerpts))

for i, val := range excerpts {
result[i] = val.Id
}

return result
}

// ClearAllBugs clear all bugs kept in memory
func (c *RepoCache) ClearAllBugs() {
c.bugs = make(map[string]*BugCache)
Expand Down
73 changes: 73 additions & 0 deletions cache/sorting.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package cache

import "sort"

type OrderBy int

const (
_ OrderBy = iota
OrderById
OrderByCreation
OrderByEdit
)

type OrderDirection int

const (
_ OrderDirection = iota
OrderAscending
OrderDescending
)

func (c *RepoCache) AllBugsId(order OrderBy, direction OrderDirection) []string {
if order == OrderById {
return c.orderIds(direction)
}

excerpts := c.allExcerpt()

var sorter sort.Interface

switch order {
case OrderByCreation:
sorter = BugsByCreationTime(excerpts)
case OrderByEdit:
sorter = BugsByEditTime(excerpts)
default:
panic("missing sort type")
}

if direction == OrderDescending {
sorter = sort.Reverse(sorter)
}

sort.Sort(sorter)

result := make([]string, len(excerpts))

for i, val := range excerpts {
result[i] = val.Id
}

return result
}

func (c *RepoCache) orderIds(direction OrderDirection) []string {
result := make([]string, len(c.excerpts))

i := 0
for key := range c.excerpts {
result[i] = key
i++
}

var sorter sort.Interface = sort.StringSlice(result)

if direction == OrderDescending {
sorter = sort.Reverse(sorter)
}

sort.Sort(sorter)

return result
}
2 changes: 1 addition & 1 deletion commands/ls.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func runLsBug(cmd *cobra.Command, args []string) error {
return err
}

allIds := backend.AllBugsOrderByCreation()
allIds := backend.AllBugsId(cache.OrderByCreation, cache.OrderAscending)

for _, id := range allIds {
b, err := backend.ResolveBug(id)
Expand Down
3 changes: 2 additions & 1 deletion graphql/resolvers/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"

"github.com/MichaelMure/git-bug/bug"
"github.com/MichaelMure/git-bug/cache"
"github.com/MichaelMure/git-bug/graphql/connections"
"github.com/MichaelMure/git-bug/graphql/models"
)
Expand All @@ -19,7 +20,7 @@ func (repoResolver) AllBugs(ctx context.Context, obj *models.Repository, after *
}

// Simply pass a []string with the ids to the pagination algorithm
source := obj.Repo.AllBugOrderById()
source := obj.Repo.AllBugsId(cache.OrderByCreation, cache.OrderAscending)

// The edger create a custom edge holding just the id
edger := func(id string, offset int) connections.Edge {
Expand Down
6 changes: 1 addition & 5 deletions termui/bug_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ func (bt *bugTable) disable(g *gocui.Gui) error {
}

func (bt *bugTable) paginate(max int) error {
bt.allIds = bt.repo.AllBugsOrderByCreation()
bt.allIds = bt.repo.AllBugsId(cache.OrderByCreation, cache.OrderAscending)

return bt.doPaginate(max)
}
Expand Down Expand Up @@ -355,8 +355,6 @@ func (bt *bugTable) cursorClamp(v *gocui.View) error {
func (bt *bugTable) nextPage(g *gocui.Gui, v *gocui.View) error {
_, max := v.Size()

bt.allIds = bt.repo.AllBugsOrderByCreation()

if bt.pageCursor+max >= len(bt.allIds) {
return nil
}
Expand All @@ -369,8 +367,6 @@ func (bt *bugTable) nextPage(g *gocui.Gui, v *gocui.View) error {
func (bt *bugTable) previousPage(g *gocui.Gui, v *gocui.View) error {
_, max := v.Size()

bt.allIds = bt.repo.AllBugsOrderByCreation()

bt.pageCursor = maxInt(0, bt.pageCursor-max)

return bt.doPaginate(max)
Expand Down

0 comments on commit 0728c00

Please sign in to comment.