mirror of
https://github.com/navidrome/navidrome.git
synced 2025-06-13 22:02:15 +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)
|
GetStarred(options ...QueryOptions) (MediaFiles, error)
|
||||||
PurgeInactive(active MediaFiles) ([]string, error)
|
PurgeInactive(active MediaFiles) ([]string, error)
|
||||||
GetAllIds() ([]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) {
|
func (s *search) SearchSong(ctx context.Context, q string, offset int, size int) (Entries, error) {
|
||||||
q = sanitize.Accents(strings.ToLower(strings.TrimSuffix(q, "*")))
|
q = sanitize.Accents(strings.ToLower(strings.TrimSuffix(q, "*")))
|
||||||
min := offset
|
min := offset
|
||||||
max := min + size - 1
|
max := min + size
|
||||||
resp, err := s.sSong.Search(q, min, max)
|
resp, err := s.mfileRepo.Search(q, min, max)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
res := make(Entries, 0, len(resp))
|
res := make(Entries, 0, len(resp))
|
||||||
for _, id := range resp {
|
for _, mf := range resp {
|
||||||
mf, err := s.mfileRepo.Get(id)
|
if criticalError(ctx, "Song", mf.ID, err) {
|
||||||
if criticalError(ctx, "Song", id, err) {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
res = append(res, FromMediaFile(mf))
|
res = append(res, FromMediaFile(&mf))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res, nil
|
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)
|
var _ domain.MediaFileRepository = (*mediaFileRepository)(nil)
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package db_sql
|
package db_sql
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/astaxie/beego/orm"
|
"github.com/astaxie/beego/orm"
|
||||||
@ -63,12 +64,12 @@ func (r *mediaFileRepository) Get(id string) (*domain.MediaFile, error) {
|
|||||||
return &a, nil
|
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))
|
result := make(domain.MediaFiles, len(all))
|
||||||
for i, m := range all {
|
for i, m := range all {
|
||||||
result[i] = domain.MediaFile(m)
|
result[i] = domain.MediaFile(m)
|
||||||
}
|
}
|
||||||
return result, nil
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *mediaFileRepository) FindByAlbum(albumId string) (domain.MediaFiles, error) {
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return r.toMediaFiles(mfs)
|
return r.toMediaFiles(mfs), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *mediaFileRepository) GetStarred(options ...domain.QueryOptions) (domain.MediaFiles, error) {
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return r.toMediaFiles(starred)
|
return r.toMediaFiles(starred), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *mediaFileRepository) PurgeInactive(activeList domain.MediaFiles) ([]string, error) {
|
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.MediaFileRepository = (*mediaFileRepository)(nil)
|
||||||
var _ = domain.MediaFile(MediaFile{})
|
var _ = domain.MediaFile(MediaFile{})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user