simplify search a little
This commit is contained in:
parent
12f0bc3a81
commit
ac29324184
1 changed files with 23 additions and 39 deletions
|
@ -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 = [];
|
||||||
|
|
Reference in a new issue