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