From 67ed830a68abce81aa11c0000509ea49233b4e60 Mon Sep 17 00:00:00 2001 From: Deluan Date: Thu, 30 Jan 2020 21:48:07 -0500 Subject: [PATCH] refactor: add filters --- engine/list_generator.go | 9 +++++---- model/datastore.go | 7 ++----- persistence/sql_repository.go | 6 ++---- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/engine/list_generator.go b/engine/list_generator.go index 69d424948..70d6d2e0a 100644 --- a/engine/list_generator.go +++ b/engine/list_generator.go @@ -4,6 +4,7 @@ import ( "context" "time" + "github.com/Masterminds/squirrel" "github.com/deluan/navidrome/model" ) @@ -76,19 +77,19 @@ func (g *listGenerator) GetNewest(ctx context.Context, offset int, size int) (En func (g *listGenerator) GetRecent(ctx context.Context, offset int, size int) (Entries, error) { qo := model.QueryOptions{Sort: "PlayDate", Order: "desc", Offset: offset, Max: size, - Filters: map[string]interface{}{"play_date__gt": time.Time{}}} + Filters: squirrel.Gt{"play_date": time.Time{}}} return g.queryByAnnotation(ctx, qo) } func (g *listGenerator) GetFrequent(ctx context.Context, offset int, size int) (Entries, error) { qo := model.QueryOptions{Sort: "PlayCount", Order: "desc", Offset: offset, Max: size, - Filters: map[string]interface{}{"play_count__gt": 0}} + Filters: squirrel.Gt{"play_count": 0}} return g.queryByAnnotation(ctx, qo) } func (g *listGenerator) GetHighest(ctx context.Context, offset int, size int) (Entries, error) { qo := model.QueryOptions{Sort: "Rating", Order: "desc", Offset: offset, Max: size, - Filters: map[string]interface{}{"rating__gt": 0}} + Filters: squirrel.Gt{"rating__gt": 0}} return g.queryByAnnotation(ctx, qo) } @@ -126,7 +127,7 @@ func (g *listGenerator) getAnnotationsForAlbums(ctx context.Context, albums mode func (g *listGenerator) GetRandomSongs(ctx context.Context, size int, genre string) (Entries, error) { options := model.QueryOptions{Max: size} if genre != "" { - options.Filters = map[string]interface{}{"genre": genre} + options.Filters = squirrel.Eq{"genre": genre} } mediaFiles, err := g.ds.MediaFile(ctx).GetRandom(options) if err != nil { diff --git a/model/datastore.go b/model/datastore.go index b8531b4a6..37cd352b9 100644 --- a/model/datastore.go +++ b/model/datastore.go @@ -3,19 +3,16 @@ package model import ( "context" + "github.com/Masterminds/squirrel" "github.com/deluan/rest" ) -// Filters use the same operators as Beego ORM: See https://beego.me/docs/mvc/model/query.md#operators -// Ex: var q = QueryOptions{Filters: Filters{"name__istartswith": "Deluan","age__gt": 25}} -// All conditions will be ANDed together -// TODO Implement filter in repositories' methods type QueryOptions struct { Sort string Order string Max int Offset int - Filters map[string]interface{} + Filters squirrel.Sqlizer } type ResourceRepository interface { diff --git a/persistence/sql_repository.go b/persistence/sql_repository.go index 2f5ff597b..51ea6a4db 100644 --- a/persistence/sql_repository.go +++ b/persistence/sql_repository.go @@ -60,10 +60,8 @@ func (r *sqlRepository) applyOptions(sq SelectBuilder, options ...model.QueryOpt sq = sq.OrderBy(options[0].Sort) } } - if len(options[0].Filters) > 0 { - for f, v := range options[0].Filters { - sq = sq.Where(Eq{f: v}) - } + if options[0].Filters != nil { + sq = sq.Where(options[0].Filters) } } return sq