From ea802f4a2440e8e8d942da70fc642c8003fe7dd1 Mon Sep 17 00:00:00 2001 From: Shish Date: Sun, 7 Jul 2019 16:50:55 +0100 Subject: [PATCH] Remove build_ugly_search_querylet now that the accurate search doesn't use subqueries, perhaps mysql can accept it --- core/imageboard/image.php | 89 +-------------------------------------- 1 file changed, 1 insertion(+), 88 deletions(-) diff --git a/core/imageboard/image.php b/core/imageboard/image.php index f24ed48a..b8dee8ff 100644 --- a/core/imageboard/image.php +++ b/core/imageboard/image.php @@ -907,11 +907,7 @@ class Image // more than one positive tag, or more than zero negative tags else { - if ($database->get_driver_name() === DatabaseDriver::MYSQL) { - $query = Image::build_ugly_search_querylet($tag_conditions); - } else { - $query = Image::build_accurate_search_querylet($tag_conditions); - } + $query = Image::build_accurate_search_querylet($tag_conditions); } /* @@ -1036,89 +1032,6 @@ class Image throw new SCoreException("No criteria specified"); } - //throw new SCoreException($sql); return new Querylet($sql); } - - /** - * this function exists because mysql is a turd, see the docs for - * build_accurate_search_querylet() for a full explanation - * - * #param TagQuerylet[] $tag_conditions - */ - private static function build_ugly_search_querylet(array $tag_conditions): Querylet - { - global $database; - - $positive_tag_count = 0; - foreach ($tag_conditions as $tq) { - if ($tq->positive) { - $positive_tag_count++; - } - } - - // only negative tags - shortcut to fail - if ($positive_tag_count == 0) { - // TODO: This isn't currently implemented. - // SEE: https://github.com/shish/shimmie2/issues/66 - return new Querylet(" - SELECT images.* - FROM images - WHERE 1=0 - "); - } - - // merge all the tag querylets into one generic one - $sql = "0"; - $terms = []; - foreach ($tag_conditions as $tq) { - $sign = $tq->positive ? "+" : "-"; - $sql .= ' '.$sign.' IF(SUM(tag LIKE :tag'.Image::$tag_n.'), 1, 0)'; - $terms['tag'.Image::$tag_n] = Tag::sqlify($tq->tag); - Image::$tag_n++; - } - $tag_search = new Querylet($sql, $terms); - - $tag_id_array = []; - - foreach ($tag_conditions as $tq) { - $tag_ids = $database->get_col( - $database->scoreql_to_sql(" - SELECT id - FROM tags - WHERE SCORE_STRNORM(tag) LIKE SCORE_STRNORM(:tag) - "), - ["tag" => Tag::sqlify($tq->tag)] - ); - $tag_id_array = array_merge($tag_id_array, $tag_ids); - - if ($tq->positive && count($tag_ids) == 0) { - # one of the positive tags had zero results, therefor there - # can be no results; "where 1=0" should shortcut things - return new Querylet(" - SELECT images.* - FROM images - WHERE 1=0 - "); - } - } - - Image::$tag_n = 0; - return new Querylet(' - SELECT * - FROM ( - SELECT images.*, ('.$tag_search->sql.') AS score - FROM images - LEFT JOIN image_tags ON image_tags.image_id = images.id - JOIN tags ON image_tags.tag_id = tags.id - WHERE tags.id IN (' . join(', ', $tag_id_array) . ') - GROUP BY images.id - HAVING score = :score - ) AS images - WHERE 1=1 - ', array_merge( - $tag_search->variables, - ["score"=>$positive_tag_count] - )); - } }