simplify search a little

This commit is contained in:
Shish 2023-05-25 12:29:41 +01:00
parent 12f0bc3a81
commit ac29324184
1 changed files with 23 additions and 39 deletions

View File

@ -272,26 +272,6 @@ class Image
return (int)ceil(Image::count_images($tags) / $config->get_int(IndexConfig::IMAGES)); return (int)ceil(Image::count_images($tags) / $config->get_int(IndexConfig::IMAGES));
} }
private static function terms_to_conditions(array $terms): array
{
$tag_conditions = [];
$img_conditions = [];
$stpen = 0; // search term parse event number
$order = null;
/*
* Turn a bunch of strings into a bunch of TagCondition
* and ImgCondition objects
*/
foreach (array_merge([null], $terms) as $term) {
$stpe = send_event(new SearchTermParseEvent($stpen++, $term, $terms));
$order ??= $stpe->order;
$img_conditions = array_merge($img_conditions, $stpe->img_conditions);
$tag_conditions = array_merge($tag_conditions, $stpe->tag_conditions);
}
return [$tag_conditions, $img_conditions, $order];
}
/* /*
* Accessors & mutators * Accessors & mutators
*/ */
@ -822,19 +802,24 @@ class Image
): Querylet { ): Querylet {
global $config; global $config;
list($tag_conditions, $img_conditions, $order) = self::terms_to_conditions($terms); $tag_conditions = [];
$order = ($order ?: "images.".$config->get_string(IndexConfig::ORDER)); $img_conditions = [];
$order = null;
$positive_tag_count = 0; /*
$negative_tag_count = 0; * Turn a bunch of strings into a bunch of TagCondition
foreach ($tag_conditions as $tq) { * and ImgCondition objects
if ($tq->positive) { */
$positive_tag_count++; $stpen = 0; // search term parse event number
} else { foreach (array_merge([null], $terms) as $term) {
$negative_tag_count++; $stpe = send_event(new SearchTermParseEvent($stpen++, $term, $terms));
} $order ??= $stpe->order;
$img_conditions = array_merge($img_conditions, $stpe->img_conditions);
$tag_conditions = array_merge($tag_conditions, $stpe->tag_conditions);
} }
$order = ($order ?: "images.".$config->get_string(IndexConfig::ORDER));
/* /*
* Turn a bunch of Querylet objects into a base query * Turn a bunch of Querylet objects into a base query
* *
@ -848,7 +833,7 @@ class Image
*/ */
// no tags, do a simple search // no tags, do a simple search
if ($positive_tag_count === 0 && $negative_tag_count === 0) { if (count($tag_conditions) === 0) {
$query = new Querylet("SELECT images.* FROM images WHERE 1=1"); $query = new Querylet("SELECT images.* FROM images WHERE 1=1");
} }
@ -856,21 +841,20 @@ class Image
// and do the offset / limit there, which is 10x faster than fetching // and do the offset / limit there, which is 10x faster than fetching
// all the image_tags and doing the offset / limit on the result. // all the image_tags and doing the offset / limit on the result.
elseif ( elseif (
( count($tag_conditions) === 1
($positive_tag_count === 1 && $negative_tag_count === 0)
|| ($positive_tag_count === 0 && $negative_tag_count === 1)
)
&& empty($img_conditions) && empty($img_conditions)
&& ($order == "id DESC" || $order == "images.id DESC") && ($order == "id DESC" || $order == "images.id DESC")
&& !is_null($offset) && !is_null($offset)
&& !is_null($limit) && !is_null($limit)
) { ) {
$in = $positive_tag_count === 1 ? "IN" : "NOT IN"; $tc = $tag_conditions[0];
$in = $tc->positive ? "IN" : "NOT IN";
// IN (SELECT id FROM tags) is 100x slower than doing a separate // IN (SELECT id FROM tags) is 100x slower than doing a separate
// query and then a second query for IN(first_query_results)?? // query and then a second query for IN(first_query_results)??
$tag_array = self::tag_or_wildcard_to_ids($tag_conditions[0]->tag); $tag_array = self::tag_or_wildcard_to_ids($tc->tag);
if (count($tag_array) == 0) { if (count($tag_array) == 0) {
if ($positive_tag_count == 1) { // if wildcard expanded to nothing, take a shortcut
if ($tc->positive) {
$query = new Querylet("SELECT images.* FROM images WHERE 1=0"); $query = new Querylet("SELECT images.* FROM images WHERE 1=0");
} else { } else {
$query = new Querylet("SELECT images.* FROM images WHERE 1=1"); $query = new Querylet("SELECT images.* FROM images WHERE 1=1");
@ -896,7 +880,7 @@ class Image
} }
} }
// more than one positive tag, or more than zero negative tags // more than one tag, or more than zero other conditions, or a non-default sort order
else { else {
$positive_tag_id_array = []; $positive_tag_id_array = [];
$positive_wildcard_id_array = []; $positive_wildcard_id_array = [];