From 181ab5a8e775a70eb14f51f36d52a99b78195052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?=
Date: Sun, 29 Dec 2024 18:10:15 +0100 Subject: [PATCH] Optimize /api/similar --- main.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index f6d4231..0df453e 100644 --- a/main.go +++ b/main.go @@ -845,15 +845,17 @@ type webSimilarImage struct { func getSimilar(sha1 string, dhash int64, pixels int64, distance int) ( result []webSimilarImage, err error) { - // For distance ∈ {0, 1}, this query is quite inefficient. - // In exchange, it's generic. - // - // If there's a dhash, there should also be thumbnail dimensions, - // so not bothering with IFNULL on them. - rows, err := db.Query(` - SELECT sha1, width * height, IFNULL(thumbw, 0), IFNULL(thumbh, 0) - FROM image WHERE sha1 <> ? AND dhash IS NOT NULL - AND hamming(dhash, ?) = ?`, sha1, dhash, distance) + // If there's a dhash, there should also be thumbnail dimensions. + var rows *sql.Rows + common := `SELECT sha1, width * height, IFNULL(thumbw, 0), IFNULL(thumbh, 0) + FROM image WHERE sha1 <> ? AND ` + if distance == 0 { + rows, err = db.Query(common+`dhash = ?`, sha1, dhash) + } else { + // This is generic, but quite inefficient for distance ∈ {0, 1}. + rows, err = db.Query(common+`dhash IS NOT NULL + AND hamming(dhash, ?) = ?`, sha1, dhash, distance) + } if err != nil { return nil, err }