Skip to content

Commit

Permalink
Optimize GetAll genres query
Browse files Browse the repository at this point in the history
  • Loading branch information
deluan committed Jul 20, 2021
1 parent 1471e12 commit b6e9ec4
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 17 deletions.
4 changes: 2 additions & 2 deletions model/genre.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ type Genre struct {
type Genres []Genre

type GenreRepository interface {
GetAll() (Genres, error)
Put(m *Genre) error
GetAll(...QueryOptions) (Genres, error)
Put(*Genre) error
}
12 changes: 4 additions & 8 deletions persistence/genre_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,10 @@ func NewGenreRepository(ctx context.Context, o orm.Ormer) model.GenreRepository
return r
}

func (r *genreRepository) GetAll() (model.Genres, error) {
sq := Select("genre.*",
"count(distinct a.album_id) as album_count",
"count(distinct f.media_file_id) as song_count").
From(r.tableName).
LeftJoin("album_genres a on a.genre_id = genre.id").
LeftJoin("media_file_genres f on f.genre_id = genre.id").
GroupBy("genre.id")
func (r *genreRepository) GetAll(opt ...model.QueryOptions) (model.Genres, error) {
sq := r.newSelect(opt...).Columns("genre.id", "genre.name", "a.album_count", "m.song_count").
LeftJoin("(select ag.genre_id, count(ag.album_id) as album_count from album_genres ag group by ag.genre_id) a on a.genre_id = genre.id").
LeftJoin("(select mg.genre_id, count(mg.media_file_id) as song_count from media_file_genres mg group by mg.genre_id) m on m.genre_id = genre.id")
res := model.Genres{}
err := r.queryAll(sq, &res)
return res, err
Expand Down
9 changes: 2 additions & 7 deletions server/subsonic/browsing.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ package subsonic
import (
"context"
"net/http"
"sort"
"strconv"
"strings"
"time"

"github.com/navidrome/navidrome/conf"
Expand Down Expand Up @@ -209,19 +207,16 @@ func (c *BrowsingController) GetSong(w http.ResponseWriter, r *http.Request) (*r

func (c *BrowsingController) GetGenres(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
ctx := r.Context()
genres, err := c.ds.Genre(ctx).GetAll()
genres, err := c.ds.Genre(ctx).GetAll(model.QueryOptions{Sort: "name"})
if err != nil {
log.Error(r, err)
return nil, err
}
for i, g := range genres {
if strings.TrimSpace(g.Name) == "" {
if g.Name == "" {
genres[i].Name = "<Empty>"
}
}
sort.Slice(genres, func(i, j int) bool {
return genres[i].Name < genres[j].Name
})

response := newResponse()
response.Genres = toGenres(genres)
Expand Down

0 comments on commit b6e9ec4

Please sign in to comment.