mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-17 12:32:24 +03:00
Implementing SearchSong using simple SELECTs. The performance hit is not relevant, makes things simpler
This commit is contained in:
parent
0629be5800
commit
d3af7e689d
@ -53,4 +53,5 @@ type MediaFileRepository interface {
|
||||
GetStarred(options ...QueryOptions) (MediaFiles, error)
|
||||
PurgeInactive(active MediaFiles) ([]string, error)
|
||||
GetAllIds() ([]string, error)
|
||||
Search(q string, offset int, size int) (MediaFiles, error)
|
||||
}
|
||||
|
@ -130,19 +130,18 @@ func (s *search) SearchAlbum(ctx context.Context, q string, offset int, size int
|
||||
func (s *search) SearchSong(ctx context.Context, q string, offset int, size int) (Entries, error) {
|
||||
q = sanitize.Accents(strings.ToLower(strings.TrimSuffix(q, "*")))
|
||||
min := offset
|
||||
max := min + size - 1
|
||||
resp, err := s.sSong.Search(q, min, max)
|
||||
max := min + size
|
||||
resp, err := s.mfileRepo.Search(q, min, max)
|
||||
if err != nil {
|
||||
return nil, nil
|
||||
}
|
||||
res := make(Entries, 0, len(resp))
|
||||
for _, id := range resp {
|
||||
mf, err := s.mfileRepo.Get(id)
|
||||
if criticalError(ctx, "Song", id, err) {
|
||||
for _, mf := range resp {
|
||||
if criticalError(ctx, "Song", mf.ID, err) {
|
||||
return nil, err
|
||||
}
|
||||
if err == nil {
|
||||
res = append(res, FromMediaFile(mf))
|
||||
res = append(res, FromMediaFile(&mf))
|
||||
}
|
||||
}
|
||||
return res, nil
|
||||
|
@ -73,4 +73,8 @@ func (r *mediaFileRepository) PurgeInactive(active domain.MediaFiles) ([]string,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *mediaFileRepository) Search(q string, offset int, size int) (domain.MediaFiles, error) {
|
||||
return nil, errors.New("not implemented")
|
||||
}
|
||||
|
||||
var _ domain.MediaFileRepository = (*mediaFileRepository)(nil)
|
||||
|
@ -1,6 +1,7 @@
|
||||
package db_sql
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/astaxie/beego/orm"
|
||||
@ -63,12 +64,12 @@ func (r *mediaFileRepository) Get(id string) (*domain.MediaFile, error) {
|
||||
return &a, nil
|
||||
}
|
||||
|
||||
func (r *mediaFileRepository) toMediaFiles(all []MediaFile) (domain.MediaFiles, error) {
|
||||
func (r *mediaFileRepository) toMediaFiles(all []MediaFile) domain.MediaFiles {
|
||||
result := make(domain.MediaFiles, len(all))
|
||||
for i, m := range all {
|
||||
result[i] = domain.MediaFile(m)
|
||||
}
|
||||
return result, nil
|
||||
return result
|
||||
}
|
||||
|
||||
func (r *mediaFileRepository) FindByAlbum(albumId string) (domain.MediaFiles, error) {
|
||||
@ -77,7 +78,7 @@ func (r *mediaFileRepository) FindByAlbum(albumId string) (domain.MediaFiles, er
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return r.toMediaFiles(mfs)
|
||||
return r.toMediaFiles(mfs), nil
|
||||
}
|
||||
|
||||
func (r *mediaFileRepository) GetStarred(options ...domain.QueryOptions) (domain.MediaFiles, error) {
|
||||
@ -86,7 +87,7 @@ func (r *mediaFileRepository) GetStarred(options ...domain.QueryOptions) (domain
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return r.toMediaFiles(starred)
|
||||
return r.toMediaFiles(starred), nil
|
||||
}
|
||||
|
||||
func (r *mediaFileRepository) PurgeInactive(activeList domain.MediaFiles) ([]string, error) {
|
||||
@ -95,5 +96,25 @@ func (r *mediaFileRepository) PurgeInactive(activeList domain.MediaFiles) ([]str
|
||||
})
|
||||
}
|
||||
|
||||
func (r *mediaFileRepository) Search(q string, offset int, size int) (domain.MediaFiles, error) {
|
||||
parts := strings.Split(q, " ")
|
||||
if len(parts) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
qs := r.newQuery(Db(), domain.QueryOptions{Offset: offset, Size: size})
|
||||
cond := orm.NewCondition()
|
||||
for _, part := range parts {
|
||||
c := orm.NewCondition()
|
||||
cond = cond.AndCond(c.Or("title__istartswith", part).Or("title__icontains", " "+part))
|
||||
}
|
||||
qs = qs.SetCond(cond).OrderBy("-rating", "-starred", "-play_count")
|
||||
var results []MediaFile
|
||||
_, err := qs.All(&results)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return r.toMediaFiles(results), nil
|
||||
}
|
||||
|
||||
var _ domain.MediaFileRepository = (*mediaFileRepository)(nil)
|
||||
var _ = domain.MediaFile(MediaFile{})
|
||||
|
Loading…
x
Reference in New Issue
Block a user