Optimize /api/similar
All checks were successful
Alpine 3.20 Success
Debian Bookworm Success

This commit is contained in:
Přemysl Eric Janouch 2024-12-29 18:10:15 +01:00
parent fd192310c7
commit 181ab5a8e7
Signed by: p
GPG Key ID: A0420B94F92B9493

20
main.go
View File

@ -845,15 +845,17 @@ type webSimilarImage struct {
func getSimilar(sha1 string, dhash int64, pixels int64, distance int) ( func getSimilar(sha1 string, dhash int64, pixels int64, distance int) (
result []webSimilarImage, err error) { result []webSimilarImage, err error) {
// For distance ∈ {0, 1}, this query is quite inefficient. // If there's a dhash, there should also be thumbnail dimensions.
// In exchange, it's generic. var rows *sql.Rows
// common := `SELECT sha1, width * height, IFNULL(thumbw, 0), IFNULL(thumbh, 0)
// If there's a dhash, there should also be thumbnail dimensions, FROM image WHERE sha1 <> ? AND `
// so not bothering with IFNULL on them. if distance == 0 {
rows, err := db.Query(` rows, err = db.Query(common+`dhash = ?`, sha1, dhash)
SELECT sha1, width * height, IFNULL(thumbw, 0), IFNULL(thumbh, 0) } else {
FROM image WHERE sha1 <> ? AND dhash IS NOT NULL // This is generic, but quite inefficient for distance ∈ {0, 1}.
AND hamming(dhash, ?) = ?`, sha1, dhash, distance) rows, err = db.Query(common+`dhash IS NOT NULL
AND hamming(dhash, ?) = ?`, sha1, dhash, distance)
}
if err != nil { if err != nil {
return nil, err return nil, err
} }