diff --git a/api/graphql/models/face_detection.go b/api/graphql/models/face_detection.go index f3918dbb..7f73ad61 100644 --- a/api/graphql/models/face_detection.go +++ b/api/graphql/models/face_detection.go @@ -11,6 +11,8 @@ import ( "github.com/Kagami/go-face" "github.com/photoview/photoview/api/scanner/image_helpers" + "gorm.io/gorm" + "gorm.io/gorm/schema" ) type FaceGroup struct { @@ -32,8 +34,14 @@ type ImageFace struct { type FaceDescriptor face.Descriptor // GormDataType datatype used in database -func (fd FaceDescriptor) GormDataType() string { - return "BLOB" +func (FaceDescriptor) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "mysql", "sqlite": + return "BLOB" + case "postgres": + return "BYTEA" + } + return "" } // Scan tells GORM how to convert database data to Go format @@ -81,8 +89,13 @@ func (fr FaceRectangle) GormDataType() string { // Scan tells GORM how to convert database data to Go format func (fr *FaceRectangle) Scan(value interface{}) error { - byteArray := value.([]uint8) - slices := strings.Split(string(byteArray), ":") + stringArray, ok := value.(string) + if !ok { + byteArray := value.([]uint8) + stringArray = string(byteArray) + } + + slices := strings.Split(stringArray, ":") if len(slices) != 4 { return fmt.Errorf("Invalid face rectangle format, expected 4 values, got %d", len(slices)) diff --git a/api/graphql/resolvers/faces.go b/api/graphql/resolvers/faces.go index 5983f368..c431a13d 100644 --- a/api/graphql/resolvers/faces.go +++ b/api/graphql/resolvers/faces.go @@ -60,7 +60,7 @@ func (r faceGroupResolver) ImageFaces(ctx context.Context, obj *models.FaceGroup query := r.Database. Joins("Media"). Where("face_group_id = ?", obj.ID). - Where("Media.album_id IN (?)", userAlbumIDs) + Where("album_id IN (?)", userAlbumIDs) query = models.FormatSQL(query, nil, paginate) @@ -91,7 +91,7 @@ func (r faceGroupResolver) ImageFaceCount(ctx context.Context, obj *models.FaceG Model(&models.ImageFace{}). Joins("Media"). Where("face_group_id = ?", obj.ID). - Where("Media.album_id IN (?)", userAlbumIDs) + Where("album_id IN (?)", userAlbumIDs) var count int64 if err := query.Count(&count).Error; err != nil { @@ -148,6 +148,7 @@ func (r *queryResolver) MyFaceGroups(ctx context.Context, paginate *models.Pagin Joins("JOIN image_faces ON image_faces.face_group_id = face_groups.id"). Where("image_faces.media_id IN (?)", r.Database.Select("media.id").Table("media").Where("media.album_id IN (?)", userAlbumIDs)). Group("image_faces.face_group_id"). + Group("face_groups.id"). Order("CASE WHEN label IS NULL THEN 1 ELSE 0 END"). Order("COUNT(image_faces.id) DESC") @@ -371,7 +372,7 @@ func userOwnedFaceGroup(db *gorm.DB, user *models.User, faceGroupID int) (*model imageFaceQuery := db. Select("image_faces.id"). Table("image_faces"). - Joins("LEFT JOIN media ON media.id = image_faces.media_id"). + Joins("JOIN media ON media.id = image_faces.media_id"). Where("media.album_id IN (?)", userAlbumIDs) faceGroupQuery := db. diff --git a/api/graphql/resolvers/search.go b/api/graphql/resolvers/search.go index 3eca2dd4..07829e70 100644 --- a/api/graphql/resolvers/search.go +++ b/api/graphql/resolvers/search.go @@ -31,8 +31,15 @@ func (r *Resolver) Search(ctx context.Context, query string, _limitMedia *int, _ var media []*models.Media + userSubquery := r.Database.Table("user_albums").Where("user_id = ?", user.ID) + if r.Database.Dialector.Name() == "postgres" { + userSubquery = userSubquery.Where("album_id = \"Album\".id") + } else { + userSubquery = userSubquery.Where("album_id = Album.id") + } + err := r.Database.Joins("Album"). - Where("EXISTS (?)", r.Database.Table("user_albums").Where("user_id = ?", user.ID).Where("album_id = Album.id")). + Where("EXISTS (?)", userSubquery). Where("media.title LIKE ? OR media.path LIKE ?", wildQuery, wildQuery). Clauses(clause.OrderBy{ Expression: clause.Expr{ @@ -40,8 +47,7 @@ func (r *Resolver) Search(ctx context.Context, query string, _limitMedia *int, _ Vars: []interface{}{wildQuery, wildQuery}, WithoutParentheses: true}, }). - Limit(limitMedia). - Find(&media).Error + Limit(limitMedia).Find(&media).Error if err != nil { return nil, errors.Wrapf(err, "searching media") diff --git a/ui/src/components/header/Searchbar.js b/ui/src/components/header/Searchbar.js index 9d809d09..cca5811f 100644 --- a/ui/src/components/header/Searchbar.js +++ b/ui/src/components/header/Searchbar.js @@ -192,7 +192,7 @@ const RowTitle = styled.span` const PhotoRow = ({ query, media }) => ( - + {searchHighlighted(query, media.title)} ) @@ -204,7 +204,7 @@ PhotoRow.propTypes = { const AlbumRow = ({ query, album }) => ( - + {searchHighlighted(query, album.title)} )