2021-09-18 13:32:39 +00:00
|
|
|
package search
|
2019-12-11 06:37:39 +00:00
|
|
|
|
|
|
|
import (
|
2021-01-20 11:08:48 +00:00
|
|
|
"strings"
|
2019-12-11 06:37:39 +00:00
|
|
|
|
2019-12-11 15:55:18 +00:00
|
|
|
"github.com/photoprism/photoprism/internal/entity"
|
2019-12-11 06:37:39 +00:00
|
|
|
"github.com/photoprism/photoprism/internal/form"
|
2021-12-14 19:01:39 +00:00
|
|
|
"github.com/photoprism/photoprism/pkg/sanitize"
|
2020-05-03 16:00:50 +00:00
|
|
|
"github.com/photoprism/photoprism/pkg/txt"
|
2019-12-11 06:37:39 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Labels searches labels based on their name.
|
2021-11-26 13:28:50 +00:00
|
|
|
func Labels(f form.SearchLabels) (results []Label, err error) {
|
2019-12-11 06:37:39 +00:00
|
|
|
if err := f.ParseQueryString(); err != nil {
|
|
|
|
return results, err
|
|
|
|
}
|
|
|
|
|
2020-05-08 13:41:01 +00:00
|
|
|
s := UnscopedDb()
|
2020-03-28 16:17:41 +00:00
|
|
|
// s.LogMode(true)
|
2019-12-11 06:37:39 +00:00
|
|
|
|
2021-01-20 11:08:48 +00:00
|
|
|
// Base query.
|
2020-03-28 16:17:41 +00:00
|
|
|
s = s.Table("labels").
|
2019-12-16 22:33:52 +00:00
|
|
|
Select(`labels.*`).
|
2019-12-11 06:37:39 +00:00
|
|
|
Where("labels.deleted_at IS NULL").
|
2020-05-10 17:43:49 +00:00
|
|
|
Where("labels.photo_count > 0").
|
2019-12-11 06:37:39 +00:00
|
|
|
Group("labels.id")
|
|
|
|
|
2021-01-20 11:08:48 +00:00
|
|
|
// Limit result count.
|
|
|
|
if f.Count > 0 && f.Count <= MaxResults {
|
|
|
|
s = s.Limit(f.Count).Offset(f.Offset)
|
|
|
|
} else {
|
|
|
|
s = s.Limit(MaxResults).Offset(f.Offset)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set sort order.
|
|
|
|
switch f.Order {
|
|
|
|
case "slug":
|
|
|
|
s = s.Order("labels.label_favorite DESC, custom_slug ASC")
|
|
|
|
default:
|
|
|
|
s = s.Order("labels.label_favorite DESC, custom_slug ASC")
|
|
|
|
}
|
|
|
|
|
2021-12-16 10:42:57 +00:00
|
|
|
if f.UID != "" {
|
|
|
|
s = s.Where("labels.label_uid IN (?)", strings.Split(strings.ToLower(f.UID), txt.Or))
|
2020-01-30 17:19:26 +00:00
|
|
|
|
2020-03-28 16:17:41 +00:00
|
|
|
if result := s.Scan(&results); result.Error != nil {
|
2020-01-30 17:19:26 +00:00
|
|
|
return results, result.Error
|
|
|
|
}
|
|
|
|
|
|
|
|
return results, nil
|
|
|
|
}
|
|
|
|
|
2019-12-11 06:37:39 +00:00
|
|
|
if f.Query != "" {
|
|
|
|
var labelIds []uint
|
2019-12-11 15:55:18 +00:00
|
|
|
var categories []entity.Category
|
|
|
|
var label entity.Label
|
2019-12-11 06:37:39 +00:00
|
|
|
|
2022-03-24 20:46:25 +00:00
|
|
|
slugString := txt.Slug(f.Query)
|
2020-12-15 19:14:06 +00:00
|
|
|
likeString := "%" + f.Query + "%"
|
2019-12-11 06:37:39 +00:00
|
|
|
|
2020-05-08 13:41:01 +00:00
|
|
|
if result := Db().First(&label, "label_slug = ? OR custom_slug = ?", slugString, slugString); result.Error != nil {
|
2021-12-14 19:01:39 +00:00
|
|
|
log.Infof("search: label %s not found", sanitize.Log(f.Query))
|
2019-12-11 06:37:39 +00:00
|
|
|
|
2020-12-15 19:14:06 +00:00
|
|
|
s = s.Where("labels.label_name LIKE ?", likeString)
|
2019-12-11 06:37:39 +00:00
|
|
|
} else {
|
|
|
|
labelIds = append(labelIds, label.ID)
|
|
|
|
|
2020-05-08 13:41:01 +00:00
|
|
|
Db().Where("category_id = ?", label.ID).Find(&categories)
|
2019-12-11 06:37:39 +00:00
|
|
|
|
|
|
|
for _, category := range categories {
|
|
|
|
labelIds = append(labelIds, category.LabelID)
|
|
|
|
}
|
|
|
|
|
2021-12-14 19:01:39 +00:00
|
|
|
log.Infof("search: label %s includes %d categories", sanitize.Log(label.LabelName), len(labelIds))
|
2019-12-11 06:37:39 +00:00
|
|
|
|
2020-03-28 16:17:41 +00:00
|
|
|
s = s.Where("labels.id IN (?)", labelIds)
|
2019-12-11 06:37:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-14 17:03:12 +00:00
|
|
|
if f.Favorite {
|
2020-03-28 16:17:41 +00:00
|
|
|
s = s.Where("labels.label_favorite = 1")
|
2019-12-11 06:37:39 +00:00
|
|
|
}
|
|
|
|
|
2019-12-17 06:13:09 +00:00
|
|
|
if !f.All {
|
2020-03-28 16:17:41 +00:00
|
|
|
s = s.Where("labels.label_priority >= 0 OR labels.label_favorite = 1")
|
2019-12-11 06:37:39 +00:00
|
|
|
}
|
|
|
|
|
2020-03-28 16:17:41 +00:00
|
|
|
if result := s.Scan(&results); result.Error != nil {
|
2019-12-11 06:37:39 +00:00
|
|
|
return results, result.Error
|
|
|
|
}
|
|
|
|
|
|
|
|
return results, nil
|
|
|
|
}
|