Keywords: Improve indexing and logging
Signed-off-by: Michael Mayer <michael@liquidbytes.net>
This commit is contained in:
parent
46f5fcef40
commit
9a763541ac
2 changed files with 39 additions and 21 deletions
|
@ -1,6 +1,7 @@
|
||||||
package entity
|
package entity
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -92,11 +93,34 @@ func SavePhotoForm(model Photo, form form.Photo, db *gorm.DB, geoApi string) err
|
||||||
model.Description.PhotoKeywords = strings.Join(txt.UniqueWords(w), ", ")
|
model.Description.PhotoKeywords = strings.Join(txt.UniqueWords(w), ", ")
|
||||||
}
|
}
|
||||||
|
|
||||||
model.IndexKeywords(db)
|
if err := model.IndexKeywords(db); err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
return db.Unscoped().Save(&model).Error
|
return db.Unscoped().Save(&model).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Save stored the entity in the database.
|
||||||
|
func (m *Photo) Save(db *gorm.DB) error {
|
||||||
|
labels := m.ClassifyLabels()
|
||||||
|
|
||||||
|
if err := m.UpdateTitle(labels); err != nil {
|
||||||
|
log.Warnf("%s (%s)", err.Error(), m.PhotoUUID)
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.DescriptionLoaded() {
|
||||||
|
w := txt.UniqueKeywords(m.Description.PhotoKeywords)
|
||||||
|
w = append(w, labels.Keywords()...)
|
||||||
|
m.Description.PhotoKeywords = strings.Join(txt.UniqueWords(w), ", ")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := m.IndexKeywords(db); err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return db.Unscoped().Save(m).Error
|
||||||
|
}
|
||||||
|
|
||||||
// ClassifyLabels returns all associated labels as classify.Labels
|
// ClassifyLabels returns all associated labels as classify.Labels
|
||||||
func (m *Photo) ClassifyLabels() classify.Labels {
|
func (m *Photo) ClassifyLabels() classify.Labels {
|
||||||
result := classify.Labels{}
|
result := classify.Labels{}
|
||||||
|
@ -108,23 +132,6 @@ func (m *Photo) ClassifyLabels() classify.Labels {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save stored the entity in the database.
|
|
||||||
func (m *Photo) Save(db *gorm.DB) error {
|
|
||||||
labels := m.ClassifyLabels()
|
|
||||||
|
|
||||||
if err := m.UpdateTitle(labels); err != nil {
|
|
||||||
log.Warn(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.Description.PhotoID == m.ID {
|
|
||||||
w := txt.UniqueKeywords(m.Description.PhotoKeywords)
|
|
||||||
w = append(w, labels.Keywords()...)
|
|
||||||
m.Description.PhotoKeywords = strings.Join(txt.UniqueWords(w), ", ")
|
|
||||||
}
|
|
||||||
|
|
||||||
return db.Unscoped().Save(m).Error
|
|
||||||
}
|
|
||||||
|
|
||||||
// BeforeCreate computes a unique UUID, and set a default takenAt before indexing a new photo
|
// BeforeCreate computes a unique UUID, and set a default takenAt before indexing a new photo
|
||||||
func (m *Photo) BeforeCreate(scope *gorm.Scope) error {
|
func (m *Photo) BeforeCreate(scope *gorm.Scope) error {
|
||||||
if err := scope.SetColumn("PhotoUUID", rnd.PPID('p')); err != nil {
|
if err := scope.SetColumn("PhotoUUID", rnd.PPID('p')); err != nil {
|
||||||
|
@ -164,7 +171,11 @@ func (m *Photo) BeforeSave(scope *gorm.Scope) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IndexKeywords adds given keywords to the photo entry
|
// IndexKeywords adds given keywords to the photo entry
|
||||||
func (m *Photo) IndexKeywords(db *gorm.DB) {
|
func (m *Photo) IndexKeywords(db *gorm.DB) error {
|
||||||
|
if !m.DescriptionLoaded() {
|
||||||
|
return fmt.Errorf("photo: can't index keywords, description not loaded (%s)", m.PhotoUUID)
|
||||||
|
}
|
||||||
|
|
||||||
var keywordIds []uint
|
var keywordIds []uint
|
||||||
var keywords []string
|
var keywords []string
|
||||||
|
|
||||||
|
@ -189,7 +200,7 @@ func (m *Photo) IndexKeywords(db *gorm.DB) {
|
||||||
NewPhotoKeyword(m.ID, kw.ID).FirstOrCreate(db)
|
NewPhotoKeyword(m.ID, kw.ID).FirstOrCreate(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
db.Where("photo_id = ? AND keyword_id NOT IN (?)", m.ID, keywordIds).Delete(&PhotoKeyword{})
|
return db.Where("photo_id = ? AND keyword_id NOT IN (?)", m.ID, keywordIds).Delete(&PhotoKeyword{}).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// PreloadFiles prepares gorm scope to retrieve photo file
|
// PreloadFiles prepares gorm scope to retrieve photo file
|
||||||
|
@ -289,3 +300,8 @@ func (m *Photo) NoCameraSerial() bool {
|
||||||
func (m *Photo) HasTitle() bool {
|
func (m *Photo) HasTitle() bool {
|
||||||
return m.PhotoTitle != ""
|
return m.PhotoTitle != ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DescriptionLoaded returns true if photo description exists.
|
||||||
|
func (m *Photo) DescriptionLoaded() bool {
|
||||||
|
return m.Description.PhotoID == m.ID
|
||||||
|
}
|
||||||
|
|
|
@ -360,7 +360,9 @@ func (ind *Index) MediaFile(m *MediaFile, o IndexOptions, originalName string) (
|
||||||
result.PhotoUUID = photo.PhotoUUID
|
result.PhotoUUID = photo.PhotoUUID
|
||||||
|
|
||||||
if file.FilePrimary && (fileChanged || o.UpdateKeywords) {
|
if file.FilePrimary && (fileChanged || o.UpdateKeywords) {
|
||||||
photo.IndexKeywords(ind.db)
|
if err := photo.IndexKeywords(ind.db); err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.Status = IndexUpdated
|
result.Status = IndexUpdated
|
||||||
|
|
Loading…
Reference in a new issue