Implementing SearchSong using simple SELECTs. The performance hit is not relevant, makes things simpler

This commit is contained in:
Deluan 2020-01-13 10:44:35 -05:00 committed by Deluan Quintão
parent 0629be5800
commit d3af7e689d
4 changed files with 35 additions and 10 deletions

View File

@ -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)
}

View File

@ -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

View File

@ -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)

View File

@ -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{})