diff --git a/domain/mediafile.go b/domain/mediafile.go index 0293eebab..017f61edb 100644 --- a/domain/mediafile.go +++ b/domain/mediafile.go @@ -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) } diff --git a/engine/search.go b/engine/search.go index a91f93ce5..45a7bf587 100644 --- a/engine/search.go +++ b/engine/search.go @@ -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 diff --git a/persistence/db_ledis/mediafile_repository.go b/persistence/db_ledis/mediafile_repository.go index 73a1ddc57..d4bc0ea42 100644 --- a/persistence/db_ledis/mediafile_repository.go +++ b/persistence/db_ledis/mediafile_repository.go @@ -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) diff --git a/persistence/db_sql/mediafile_repository.go b/persistence/db_sql/mediafile_repository.go index b40ee266d..c88967bc3 100644 --- a/persistence/db_sql/mediafile_repository.go +++ b/persistence/db_sql/mediafile_repository.go @@ -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{})