Changed omitted related tags (like tagme) to be powered by a setting, allowing any performance-impacting (or just not useful in this context) tags to be omitted
Further tag list performance improvements TagListConfig constants
This commit is contained in:
		
							parent
							
								
									8606c70437
								
							
						
					
					
						commit
						88e6e68d79
					
				| @ -110,6 +110,7 @@ class Tag | |||||||
|         $term = str_replace('_', '\_', $term); |         $term = str_replace('_', '\_', $term); | ||||||
|         $term = str_replace('%', '\%', $term); |         $term = str_replace('%', '\%', $term); | ||||||
|         $term = str_replace('*', '%', $term); |         $term = str_replace('*', '%', $term); | ||||||
|  |         $term = str_replace("?", "_", $term); | ||||||
|         return $term; |         return $term; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -585,7 +585,7 @@ class OuroborosAPI extends Extension | |||||||
|                                                         ORDER BY SCORE_STRNORM(substr(tag, 1, 1)) LIMIT :start, :max_items |                                                         ORDER BY SCORE_STRNORM(substr(tag, 1, 1)) LIMIT :start, :max_items | ||||||
|                                                     " |                                                     " | ||||||
|                     ), |                     ), | ||||||
|                     ['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit] |                     ['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit] | ||||||
|                 ); |                 ); | ||||||
|                 break; |                 break; | ||||||
|             case 'count': |             case 'count': | ||||||
| @ -596,7 +596,7 @@ class OuroborosAPI extends Extension | |||||||
|                                                     WHERE count >= :tags_min |                                                     WHERE count >= :tags_min | ||||||
|                                                     ORDER BY count DESC, tag ASC LIMIT :start, :max_items |                                                     ORDER BY count DESC, tag ASC LIMIT :start, :max_items | ||||||
|                                                     ",
 |                                                     ",
 | ||||||
|                     ['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit] |                     ['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit] | ||||||
|                 ); |                 ); | ||||||
|                 break; |                 break; | ||||||
|             case 'date': |             case 'date': | ||||||
| @ -607,7 +607,7 @@ class OuroborosAPI extends Extension | |||||||
|                                                     WHERE count >= :tags_min |                                                     WHERE count >= :tags_min | ||||||
|                                                     ORDER BY count DESC, tag ASC LIMIT :start, :max_items |                                                     ORDER BY count DESC, tag ASC LIMIT :start, :max_items | ||||||
|                                                     ",
 |                                                     ",
 | ||||||
|                     ['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit] |                     ['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit] | ||||||
|                 ); |                 ); | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|  | |||||||
							
								
								
									
										31
									
								
								ext/tag_list/config.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								ext/tag_list/config.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TagListConfig | ||||||
|  | { | ||||||
|  |     public const LENGTH = "tag_list_length"; | ||||||
|  |     public const POPULAR_TAG_LIST_LENGTH = "popular_tag_list_length"; | ||||||
|  |     public CONSt TAGS_MIN = "tags_min"; | ||||||
|  |     public const INFO_LINK = "info_link"; | ||||||
|  |     public const IMAGE_TYPE = "tag_list_image_type"; | ||||||
|  |     public const RELATED_SORT = "tag_list_related_sort"; | ||||||
|  |     public const POPULAR_SORT = "tag_list_popular_sort"; | ||||||
|  |     public const PAGES = "tag_list_pages"; | ||||||
|  |     public const OMIT_TAGS = "tag_list_omit_tags"; | ||||||
|  | 
 | ||||||
|  |     public const TYPE_RELATED = "related"; | ||||||
|  |     public const TYPE_TAGS= "tags"; | ||||||
|  | 
 | ||||||
|  |     public const TYPE_CHOICES = [ | ||||||
|  |         "Image's tags only" => TagListConfig::TYPE_TAGS, | ||||||
|  |         "Show related" => TagListConfig::TYPE_RELATED | ||||||
|  |     ]; | ||||||
|  | 
 | ||||||
|  |     public const SORT_ALPHABETICAL = "alphabetical"; | ||||||
|  |     public const SORT_TAG_COUNT = "tagcount"; | ||||||
|  | 
 | ||||||
|  |     public const SORT_CHOICES = [ | ||||||
|  |         "Tag Count" => TagListConfig::SORT_TAG_COUNT, | ||||||
|  |         "Alphabetical" => TagListConfig::SORT_ALPHABETICAL | ||||||
|  |     ]; | ||||||
|  | } | ||||||
| @ -1,18 +1,21 @@ | |||||||
| <?php | <?php | ||||||
| 
 | 
 | ||||||
|  | require_once "config.php"; | ||||||
|  | 
 | ||||||
| class TagList extends Extension | class TagList extends Extension | ||||||
| { | { | ||||||
|     public function onInitExt(InitExtEvent $event) |     public function onInitExt(InitExtEvent $event) | ||||||
|     { |     { | ||||||
|         global $config; |         global $config; | ||||||
|         $config->set_default_int("tag_list_length", 15); |         $config->set_default_int(TagListConfig::LENGTH, 15); | ||||||
|         $config->set_default_int("popular_tag_list_length", 15); |         $config->set_default_int(TagListConfig::POPULAR_TAG_LIST_LENGTH, 15); | ||||||
|         $config->set_default_int("tags_min", 3); |         $config->set_default_int(TagListConfig::TAGS_MIN, 3); | ||||||
|         $config->set_default_string("info_link", 'http://en.wikipedia.org/wiki/$tag'); |         $config->set_default_string(TagListConfig::INFO_LINK, 'http://en.wikipedia.org/wiki/$tag'); | ||||||
|         $config->set_default_string("tag_list_image_type", 'related'); |         $config->set_default_string(TagListConfig::OMIT_TAGS, 'tagme*'); | ||||||
|         $config->set_default_string("tag_list_related_sort", 'alphabetical'); |         $config->set_default_string(TagListConfig::IMAGE_TYPE, TagListConfig::TYPE_RELATED); | ||||||
|         $config->set_default_string("tag_list_popular_sort", 'tagcount'); |         $config->set_default_string(TagListConfig::RELATED_SORT, TagListConfig::SORT_ALPHABETICAL); | ||||||
|         $config->set_default_bool("tag_list_pages", false); |         $config->set_default_string(TagListConfig::POPULAR_SORT, TagListConfig::SORT_TAG_COUNT); | ||||||
|  |         $config->set_default_bool(TagListConfig::PAGES, false); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public function onPageRequest(PageRequestEvent $event) |     public function onPageRequest(PageRequestEvent $event) | ||||||
| @ -78,7 +81,7 @@ class TagList extends Extension | |||||||
|     public function onPostListBuilding(PostListBuildingEvent $event) |     public function onPostListBuilding(PostListBuildingEvent $event) | ||||||
|     { |     { | ||||||
|         global $config, $page; |         global $config, $page; | ||||||
|         if ($config->get_int('tag_list_length') > 0) { |         if ($config->get_int(TagListConfig::LENGTH) > 0) { | ||||||
|             if (!empty($event->search_terms)) { |             if (!empty($event->search_terms)) { | ||||||
|                 $this->add_refine_block($page, $event->search_terms); |                 $this->add_refine_block($page, $event->search_terms); | ||||||
|             } else { |             } else { | ||||||
| @ -105,8 +108,8 @@ class TagList extends Extension | |||||||
|     public function onDisplayingImage(DisplayingImageEvent $event) |     public function onDisplayingImage(DisplayingImageEvent $event) | ||||||
|     { |     { | ||||||
|         global $config, $page; |         global $config, $page; | ||||||
|         if ($config->get_int('tag_list_length') > 0) { |         if ($config->get_int(TagListConfig::LENGTH) > 0) { | ||||||
|             if ($config->get_string('tag_list_image_type') == 'related') { |             if ($config->get_string(TagListConfig::IMAGE_TYPE) == TagListConfig::TYPE_RELATED) { | ||||||
|                 $this->add_related_block($page, $event->image); |                 $this->add_related_block($page, $event->image); | ||||||
|             } else { |             } else { | ||||||
|                 if (class_exists("TagCategories") and $config->get_bool(TagCategoriesConfig::SPLIT_ON_VIEW)) { |                 if (class_exists("TagCategories") and $config->get_bool(TagCategoriesConfig::SPLIT_ON_VIEW)) { | ||||||
| @ -121,30 +124,30 @@ class TagList extends Extension | |||||||
|     public function onSetupBuilding(SetupBuildingEvent $event) |     public function onSetupBuilding(SetupBuildingEvent $event) | ||||||
|     { |     { | ||||||
|         $sb = new SetupBlock("Tag Map Options"); |         $sb = new SetupBlock("Tag Map Options"); | ||||||
|         $sb->add_int_option("tags_min", "Only show tags used at least "); |         $sb->add_int_option(TagListConfig::TAGS_MIN, "Only show tags used at least "); | ||||||
|         $sb->add_label(" times"); |         $sb->add_label(" times"); | ||||||
|         $sb->add_bool_option("tag_list_pages", "<br>Paged tag lists: "); |         $sb->add_bool_option(TagListConfig::PAGES, "<br>Paged tag lists: "); | ||||||
|         $event->panel->add_block($sb); |         $event->panel->add_block($sb); | ||||||
| 
 | 
 | ||||||
|         $sb = new SetupBlock("Popular / Related Tag List"); |         $sb = new SetupBlock("Popular / Related Tag List"); | ||||||
|         $sb->add_int_option("tag_list_length", "Show top "); |         $sb->add_int_option(TagListConfig::LENGTH, "Show top "); | ||||||
|         $sb->add_label(" related tags"); |         $sb->add_label(" related tags"); | ||||||
|         $sb->add_int_option("popular_tag_list_length", "<br>Show top "); |         $sb->add_int_option(TagListConfig::POPULAR_TAG_LIST_LENGTH, "<br>Show top "); | ||||||
|         $sb->add_label(" popular tags"); |         $sb->add_label(" popular tags"); | ||||||
|         $sb->add_text_option("info_link", "<br>Tag info link: "); |         $sb->start_table(); | ||||||
|         $sb->add_choice_option("tag_list_image_type", [ |         $sb->add_text_option(TagListConfig::INFO_LINK, "Tag info link", true); | ||||||
|             "Image's tags only" => "tags", |         $sb->add_text_option(TagListConfig::OMIT_TAGS, "Omit tags", true); | ||||||
|             "Show related" => "related" |         $sb->add_choice_option(TagListConfig::IMAGE_TYPE, | ||||||
|         ], "<br>Image tag list: "); |             TagListConfig::TYPE_CHOICES, | ||||||
|         $sb->add_choice_option("tag_list_related_sort", [ |             "Image tag list", true); | ||||||
|             "Tag Count" => "tagcount", |         $sb->add_choice_option(TagListConfig::RELATED_SORT, | ||||||
|             "Alphabetical" => "alphabetical" |             TagListConfig::SORT_CHOICES, | ||||||
|         ], "<br>Sort related list by: "); |             "Sort related list by", true); | ||||||
|         $sb->add_choice_option("tag_list_popular_sort", [ |         $sb->add_choice_option(TagListConfig::POPULAR_SORT, | ||||||
|             "Tag Count" => "tagcount", |             TagListConfig::SORT_CHOICES, | ||||||
|             "Alphabetical" => "alphabetical" |             "Sort popular list by", true); | ||||||
|         ], "<br>Sort popular list by: "); |         $sb->add_bool_option("tag_list_numbers", "Show tag counts", true); | ||||||
|         $sb->add_bool_option("tag_list_numbers", "<br>Show tag counts: "); |         $sb->end_table(); | ||||||
|         $event->panel->add_block($sb); |         $event->panel->add_block($sb); | ||||||
|     } |     } | ||||||
|     // }}}
 |     // }}}
 | ||||||
| @ -165,17 +168,56 @@ class TagList extends Extension | |||||||
|             return int_escape($_GET['mincount']); |             return int_escape($_GET['mincount']); | ||||||
|         } else { |         } else { | ||||||
|             global $config; |             global $config; | ||||||
|             return $config->get_int('tags_min');	// get the default.
 |             return $config->get_int(TagListConfig::TAGS_MIN);	// get the default.
 | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private static function get_omitted_tags(): array | ||||||
|  |     { | ||||||
|  |         global $config, $database; | ||||||
|  |         $tags_config =  $config->get_string(TagListConfig::OMIT_TAGS); | ||||||
|  | 
 | ||||||
|  |         $results = $database->cache->get("tag_list_omitted_tags:".$tags_config); | ||||||
|  | 
 | ||||||
|  |         if($results==null) { | ||||||
|  |             $results = []; | ||||||
|  |             $tags = explode(" ", $tags_config); | ||||||
|  | 
 | ||||||
|  |             if (empty($tags)) { | ||||||
|  |                 return []; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $where = []; | ||||||
|  |             $args = []; | ||||||
|  |             $i = 0; | ||||||
|  |             foreach ($tags as $tag) { | ||||||
|  |                 $i++; | ||||||
|  |                 $arg = "tag$i"; | ||||||
|  |                 $args[$arg] = Tag::sqlify($tag); | ||||||
|  |                 if (strpos($tag, '*') === false | ||||||
|  |                     && strpos($tag, '?') === false) { | ||||||
|  |                     $where[] = " tag = :$arg "; | ||||||
|  |                 } else { | ||||||
|  |                     $where[] = " tag LIKE :$arg "; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $results = $database->get_col("SELECT id FROM tags WHERE " . implode(" OR ", $where), $args); | ||||||
|  | 
 | ||||||
|  |             $database->cache->set("tag_list_omitted_tags:" . $tags_config, $results, 600); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |         return $results; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     private function get_starts_with(): string |     private function get_starts_with(): string | ||||||
|     { |     { | ||||||
|         global $config; |         global $config; | ||||||
|         if (isset($_GET['starts_with'])) { |         if (isset($_GET['starts_with'])) { | ||||||
|             return $_GET['starts_with'] . "%"; |             return $_GET['starts_with'] . "%"; | ||||||
|         } else { |         } else { | ||||||
|             if ($config->get_bool("tag_list_pages")) { |             if ($config->get_bool(TagListConfig::PAGES)) { | ||||||
|                 return "a%"; |                 return "a%"; | ||||||
|             } else { |             } else { | ||||||
|                 return "%"; |                 return "%"; | ||||||
| @ -244,7 +286,7 @@ class TagList extends Extension | |||||||
| 			"), ["tags_min"=>$tags_min, "tags_min2"=>$tags_min, "starts_with"=>$starts_with]);
 | 			"), ["tags_min"=>$tags_min, "tags_min2"=>$tags_min, "starts_with"=>$starts_with]);
 | ||||||
| 
 | 
 | ||||||
|         $html = ""; |         $html = ""; | ||||||
|         if ($config->get_bool("tag_list_pages")) { |         if ($config->get_bool(TagListConfig::PAGES)) { | ||||||
|             $html .= $this->build_az(); |             $html .= $this->build_az(); | ||||||
|         } |         } | ||||||
|         foreach ($tag_data as $row) { |         foreach ($tag_data as $row) { | ||||||
| @ -287,7 +329,7 @@ class TagList extends Extension | |||||||
| 				"), ["tags_min"=>$tags_min, "starts_with"=>$starts_with]);
 | 				"), ["tags_min"=>$tags_min, "starts_with"=>$starts_with]);
 | ||||||
| 
 | 
 | ||||||
|         $html = ""; |         $html = ""; | ||||||
|         if ($config->get_bool("tag_list_pages")) { |         if ($config->get_bool(TagListConfig::PAGES)) { | ||||||
|             $html .= $this->build_az(); |             $html .= $this->build_az(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -407,27 +449,34 @@ class TagList extends Extension | |||||||
|     } |     } | ||||||
|     // }}}
 |     // }}}
 | ||||||
|     // blocks {{{
 |     // blocks {{{
 | ||||||
|     private function add_related_block(Page $page, Image $image) |     private function add_related_block(Page $page, Image $image): void | ||||||
|     { |     { | ||||||
|         global $database, $config; |         global $database, $config; | ||||||
| 
 | 
 | ||||||
|         $query = " |         $omitted_tags = self::get_omitted_tags(); | ||||||
| 			SELECT t3.tag AS tag, t3.count AS calc_count, it3.tag_id |         $starting_tags = $database->get_col("SELECT tag_id FROM image_tags WHERE image_id = :image_id",["image_id" => $image->id]); | ||||||
|             FROM image_tags AS it1 -- Starting image's tags                 | 
 | ||||||
|                 INNER JOIN tags AS t1 ON t1.id = it1.tag_id AND t1.tag NOT LIKE 'tagme%' |         $starting_tags = array_diff($starting_tags,$omitted_tags); | ||||||
|                 -- Get images with the same tags as the starting image | 
 | ||||||
|                 INNER JOIN image_tags AS it2 ON it1.tag_id=it2.tag_id |         if(count($starting_tags) === 0) { | ||||||
|                 -- Get the tags from those other images except the same as the starting tags  |             // No valid starting tags, so can't look anything up
 | ||||||
|                 INNER JOIN image_tags AS it3 ON it2.image_id=it3.image_id  |             return; | ||||||
|                 LEFT JOIN image_tags it4 ON it4.image_id = it1.image_id AND it4.tag_id = it3.tag_id |         } | ||||||
|                 INNER JOIN tags AS t3 ON t3.id = it3.tag_id AND t3.tag NOT LIKE 'tagme%'  | 
 | ||||||
| 			WHERE |         $query = "SELECT tags.* FROM tags INNER JOIN (
 | ||||||
| 				it1.image_id=:image_id |                 SELECT it2.tag_id | ||||||
| 			GROUP BY it3.tag_id, t3.tag, t3.count |                 FROM image_tags AS it1 | ||||||
| 			ORDER BY calc_count DESC |                     INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id | ||||||
|  |                         AND it2.tag_id NOT IN (".implode(",",array_merge($omitted_tags,$starting_tags)).") | ||||||
|  |                 WHERE | ||||||
|  |                     it1.tag_id IN (".implode(",",$starting_tags).") | ||||||
|  |                 GROUP BY it2.tag_id | ||||||
|  |             ) A ON A.tag_id = tags.id | ||||||
|  | 			ORDER BY count DESC | ||||||
| 			LIMIT :tag_list_length | 			LIMIT :tag_list_length | ||||||
| 		";
 | 		";
 | ||||||
|         $args = ["image_id" => $image->id, "tag_list_length" => $config->get_int('tag_list_length')]; | 
 | ||||||
|  |         $args = ["tag_list_length" => $config->get_int(TagListConfig::LENGTH)]; | ||||||
| 
 | 
 | ||||||
|         $tags = $database->get_all($query, $args); |         $tags = $database->get_all($query, $args); | ||||||
|         if (count($tags) > 0) { |         if (count($tags) > 0) { | ||||||
| @ -440,11 +489,11 @@ class TagList extends Extension | |||||||
|         global $database; |         global $database; | ||||||
| 
 | 
 | ||||||
|         $query = " |         $query = " | ||||||
| 			SELECT tags.tag, tags.count as calc_count | 			SELECT tags.tag, tags.count | ||||||
| 			FROM tags, image_tags | 			FROM tags, image_tags | ||||||
| 			WHERE tags.id = image_tags.tag_id | 			WHERE tags.id = image_tags.tag_id | ||||||
| 			AND image_tags.image_id = :image_id | 			AND image_tags.image_id = :image_id | ||||||
| 			ORDER BY calc_count DESC | 			ORDER BY tags.count DESC | ||||||
| 		";
 | 		";
 | ||||||
|         $args = ["image_id"=>$image->id]; |         $args = ["image_id"=>$image->id]; | ||||||
| 
 | 
 | ||||||
| @ -459,11 +508,11 @@ class TagList extends Extension | |||||||
|         global $database; |         global $database; | ||||||
| 
 | 
 | ||||||
|         $query = " |         $query = " | ||||||
| 			SELECT tags.tag, tags.count as calc_count | 			SELECT tags.tag, tags.count | ||||||
| 			FROM tags, image_tags | 			FROM tags, image_tags | ||||||
| 			WHERE tags.id = image_tags.tag_id | 			WHERE tags.id = image_tags.tag_id | ||||||
| 			AND image_tags.image_id = :image_id | 			AND image_tags.image_id = :image_id | ||||||
| 			ORDER BY calc_count DESC | 			ORDER BY tags.count DESC | ||||||
| 		";
 | 		";
 | ||||||
|         $args = ["image_id"=>$image->id]; |         $args = ["image_id"=>$image->id]; | ||||||
| 
 | 
 | ||||||
| @ -479,16 +528,32 @@ class TagList extends Extension | |||||||
| 
 | 
 | ||||||
|         $tags = $database->cache->get("popular_tags"); |         $tags = $database->cache->get("popular_tags"); | ||||||
|         if (empty($tags)) { |         if (empty($tags)) { | ||||||
|             $query = " |             $omitted_tags = self::get_omitted_tags(); | ||||||
| 				SELECT tag, count as calc_count | 
 | ||||||
| 				FROM tags |             if(empty($omitted_tags)) { | ||||||
| 				WHERE count > 0 |                 $query = " | ||||||
| 				ORDER BY count DESC |                     SELECT tag, count | ||||||
| 				LIMIT :popular_tag_list_length |                     FROM tags | ||||||
| 				";
 |                     WHERE count > 0  | ||||||
|             $args = ["popular_tag_list_length"=>$config->get_int('popular_tag_list_length')]; |                     ORDER BY count DESC | ||||||
|  |                     LIMIT :popular_tag_list_length | ||||||
|  |                     ";
 | ||||||
|  | 
 | ||||||
|  |             } else { | ||||||
|  |                 $query = " | ||||||
|  |                     SELECT tag, count | ||||||
|  |                     FROM tags | ||||||
|  |                     WHERE count > 0  | ||||||
|  |                         AND id NOT IN (".(implode(",", $omitted_tags)).") | ||||||
|  |                     ORDER BY count DESC | ||||||
|  |                     LIMIT :popular_tag_list_length | ||||||
|  |                     ";
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $args = ["popular_tag_list_length"=>$config->get_int(TagListConfig::POPULAR_TAG_LIST_LENGTH)]; | ||||||
| 
 | 
 | ||||||
|             $tags = $database->get_all($query, $args); |             $tags = $database->get_all($query, $args); | ||||||
|  | 
 | ||||||
|             $database->cache->set("popular_tags", $tags, 600); |             $database->cache->set("popular_tags", $tags, 600); | ||||||
|         } |         } | ||||||
|         if (count($tags) > 0) { |         if (count($tags) > 0) { | ||||||
| @ -507,6 +572,20 @@ class TagList extends Extension | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         $wild_tags = $search; | ||||||
|  | 
 | ||||||
|  |         $related_tags = self::get_related_tags($search, $config->get_int(TagListConfig::LENGTH)); | ||||||
|  | 
 | ||||||
|  |         if (!empty($related_tags)) { | ||||||
|  |             $this->theme->display_refine_block($page, $related_tags, $wild_tags); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static function get_related_tags(array $search, int $limit): array | ||||||
|  |     { | ||||||
|  |         global $config, $database; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         $wild_tags = $search; |         $wild_tags = $search; | ||||||
|         $str_search = Tag::implode($search); |         $str_search = Tag::implode($search); | ||||||
|         $related_tags = $database->cache->get("related_tags:$str_search"); |         $related_tags = $database->cache->get("related_tags:$str_search"); | ||||||
| @ -514,53 +593,66 @@ class TagList extends Extension | |||||||
|         if (empty($related_tags)) { |         if (empty($related_tags)) { | ||||||
|             // $search_tags = array();
 |             // $search_tags = array();
 | ||||||
| 
 | 
 | ||||||
|             $tag_id_array = []; |             $starting_tags = []; | ||||||
|             $tags_ok = true; |             $tags_ok = true; | ||||||
|             foreach ($wild_tags as $tag) { |             foreach ($wild_tags as $tag) { | ||||||
|                 if ($tag[0] == "-" || strpos($tag, "tagme")===0) { |                 if ($tag[0] == "-") { | ||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|                 $tag = str_replace("*", "%", $tag); | 
 | ||||||
|                 $tag = str_replace("?", "_", $tag); |                 $tag = Tag::sqlify($tag); | ||||||
|  | 
 | ||||||
|                 $tag_ids = $database->get_col("SELECT id FROM tags WHERE tag LIKE :tag AND count < 25000", ["tag" => $tag]); |                 $tag_ids = $database->get_col("SELECT id FROM tags WHERE tag LIKE :tag AND count < 25000", ["tag" => $tag]); | ||||||
|                 // $search_tags = array_merge($search_tags,
 |                 // $search_tags = array_merge($search_tags,
 | ||||||
|                 //                  $database->get_col("SELECT tag FROM tags WHERE tag LIKE :tag", array("tag"=>$tag)));
 |                 //                  $database->get_col("SELECT tag FROM tags WHERE tag LIKE :tag", array("tag"=>$tag)));
 | ||||||
|                 $tag_id_array = array_merge($tag_id_array, $tag_ids); |                 $starting_tags = array_merge($starting_tags, $tag_ids); | ||||||
|                 $tags_ok = count($tag_ids) > 0; |                 $tags_ok = count($tag_ids) > 0; | ||||||
|                 if (!$tags_ok) { |                 if (!$tags_ok) { | ||||||
|                     break; |                     break; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             $tag_id_list = join(', ', $tag_id_array); |  | ||||||
| 
 | 
 | ||||||
|             if (count($tag_id_array) > 5 || count($tag_id_array) == 0) { |             if (count($starting_tags) > 5 || count($starting_tags) === 0) { | ||||||
|                 return; |                 return []; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $omitted_tags = self::get_omitted_tags(); | ||||||
|  | 
 | ||||||
|  |             $starting_tags = array_diff($starting_tags,$omitted_tags); | ||||||
|  | 
 | ||||||
|  |             if(count($starting_tags) === 0) { | ||||||
|  |                 // No valid starting tags, so can't look anything up
 | ||||||
|  |                 return []; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if ($tags_ok) { |             if ($tags_ok) { | ||||||
|                 $query = " |                 $query = "SELECT t.tag, A.calc_count AS count FROM tags t INNER JOIN (
 | ||||||
| 					SELECT t2.tag AS tag, COUNT(it2.image_id) AS calc_count | 					SELECT it2.tag_id, COUNT(it2.image_id) AS calc_count | ||||||
| 					FROM image_tags AS it1 -- Got other images with the same tags | 					FROM image_tags AS it1 -- Got other images with the same tags | ||||||
| 					    -- Get the tags from those images, except those the same as the starting tags | 					    INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id  | ||||||
| 					    INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id AND it2.tag_id NOT IN($tag_id_list) | 					    -- And filter out unwanted tags | ||||||
| 					    -- And filter out anything starting with tagme |                             AND it2.tag_id NOT IN (".implode(",",array_merge($omitted_tags,$starting_tags)).") | ||||||
| 						INNER JOIN tags AS t2 ON it2.tag_id = t2.id  AND t2.tag NOT LIKE 'tagme%' |  | ||||||
| 					WHERE | 					WHERE | ||||||
| 						it1.tag_id IN($tag_id_list) |                     it1.tag_id IN (".implode(",",$starting_tags).") | ||||||
| 					GROUP BY t2.tag | 					GROUP BY it2.tag_id) A ON A.tag_id = t.id | ||||||
| 					ORDER BY calc_count | 					ORDER BY A.calc_count | ||||||
| 					DESC LIMIT :limit | 					DESC LIMIT :limit | ||||||
| 				";
 | 				";
 | ||||||
|                 $args = ["limit"=>$config->get_int('tag_list_length')]; |                 $args = ["limit" => $limit]; | ||||||
| 
 | 
 | ||||||
|                 $related_tags = $database->get_all($query, $args); |                 $related_tags = $database->get_all($query, $args); | ||||||
|                 $database->cache->set("related_tags:$str_search", $related_tags, 60*60); |                 $database->cache->set("related_tags:$str_search", $related_tags, 60 * 60); | ||||||
|             } |             } | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |         if ($related_tags === false) { | ||||||
|  |             return []; | ||||||
|  |         } else { | ||||||
|  |             return $related_tags; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (!empty($related_tags)) { |  | ||||||
|             $this->theme->display_refine_block($page, $related_tags, $wild_tags); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     // }}}
 |     // }}}
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -38,7 +38,7 @@ class TagListTheme extends Themelet | |||||||
|     { |     { | ||||||
|         global $config; |         global $config; | ||||||
| 
 | 
 | ||||||
|         $tag_info_link_is_visible = !is_null($config->get_string('info_link')); |         $tag_info_link_is_visible = !is_null($config->get_string(TagListConfig::INFO_LINK)); | ||||||
|         $tag_count_is_visible = $config->get_bool("tag_list_numbers"); |         $tag_count_is_visible = $config->get_bool("tag_list_numbers"); | ||||||
| 
 | 
 | ||||||
|         return ' |         return ' | ||||||
| @ -68,7 +68,7 @@ class TagListTheme extends Themelet | |||||||
|     { |     { | ||||||
|         global $config; |         global $config; | ||||||
| 
 | 
 | ||||||
|         if ($config->get_string('tag_list_related_sort') == 'alphabetical') { |         if ($config->get_string(TagListConfig::RELATED_SORT) == TagListConfig::SORT_ALPHABETICAL) { | ||||||
|             asort($tag_infos); |             asort($tag_infos); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -117,12 +117,12 @@ class TagListTheme extends Themelet | |||||||
|             $page->add_block(new Block($category_display_name, $tag_categories_html[$category], "left", 9)); |             $page->add_block(new Block($category_display_name, $tag_categories_html[$category], "left", 9)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if ($config->get_string('tag_list_image_type')=="tags") { | 		if ($main_html != null) { | ||||||
|             if ($main_html != null) { | 			if ($config->get_string(TagListConfig::IMAGE_TYPE)==TagListConfig::TYPE_TAGS) { | ||||||
|                 $page->add_block(new Block("Tags", $main_html, "left", 10)); | 				$page->add_block(new Block("Tags", $main_html, "left", 10)); | ||||||
|             } | 			} else { | ||||||
|         } else { | 				$page->add_block(new Block("Related Tags", $main_html, "left", 10)); | ||||||
|             $page->add_block(new Block("Related Tags", $main_html, "left", 10)); | 			} | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -134,7 +134,7 @@ class TagListTheme extends Themelet | |||||||
|      */ |      */ | ||||||
|     private function get_tag_list_html($tag_infos, $sort) |     private function get_tag_list_html($tag_infos, $sort) | ||||||
|     { |     { | ||||||
|         if ($sort == 'alphabetical') { |         if ($sort == TagListConfig::SORT_ALPHABETICAL) { | ||||||
|             asort($tag_infos); |             asort($tag_infos); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -170,10 +170,10 @@ class TagListTheme extends Themelet | |||||||
| 
 | 
 | ||||||
|         $main_html = $this->get_tag_list_html( |         $main_html = $this->get_tag_list_html( | ||||||
|             $tag_infos, |             $tag_infos, | ||||||
|             $config->get_string('tag_list_related_sort') |             $config->get_string(TagListConfig::RELATED_SORT) | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|         if ($config->get_string('tag_list_image_type')=="tags") { |         if ($config->get_string(TagListConfig::IMAGE_TYPE)==TagListConfig::TYPE_TAGS) { | ||||||
|             $page->add_block(new Block("Tags", $main_html, "left", 10)); |             $page->add_block(new Block("Tags", $main_html, "left", 10)); | ||||||
|         } else { |         } else { | ||||||
|             $page->add_block(new Block("Related Tags", $main_html, "left", 10)); |             $page->add_block(new Block("Related Tags", $main_html, "left", 10)); | ||||||
| @ -193,7 +193,7 @@ class TagListTheme extends Themelet | |||||||
| 
 | 
 | ||||||
|         $main_html = $this->get_tag_list_html( |         $main_html = $this->get_tag_list_html( | ||||||
|             $tag_infos, |             $tag_infos, | ||||||
|             $config->get_string('tag_list_popular_sort') |             $config->get_string(TagListConfig::POPULAR_SORT) | ||||||
|         ); |         ); | ||||||
|         $main_html .= " <br><a class='more' href='".make_link("tags")."'>Full List</a>\n"; |         $main_html .= " <br><a class='more' href='".make_link("tags")."'>Full List</a>\n"; | ||||||
| 
 | 
 | ||||||
| @ -213,7 +213,7 @@ class TagListTheme extends Themelet | |||||||
| 
 | 
 | ||||||
|         $main_html = $this->get_tag_list_html( |         $main_html = $this->get_tag_list_html( | ||||||
|             $tag_infos, |             $tag_infos, | ||||||
|             $config->get_string('tag_list_popular_sort') |             $config->get_string(TagListConfig::POPULAR_SORT) | ||||||
|         ); |         ); | ||||||
|         $main_html .= " <br><a class='more' href='".make_link("tags")."'>Full List</a>\n"; |         $main_html .= " <br><a class='more' href='".make_link("tags")."'>Full List</a>\n"; | ||||||
| 
 | 
 | ||||||
| @ -242,10 +242,10 @@ class TagListTheme extends Themelet | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         $h_tag_no_underscores = str_replace("_", " ", $h_tag); |         $h_tag_no_underscores = str_replace("_", " ", $h_tag); | ||||||
|         $count = $row['calc_count']; |         $count = $row['count']; | ||||||
|         // if($n++) $display_html .= "\n<br/>";
 |         // if($n++) $display_html .= "\n<br/>";
 | ||||||
|         if (!is_null($config->get_string('info_link'))) { |         if (!is_null($config->get_string(TagListConfig::INFO_LINK))) { | ||||||
|             $link = html_escape(str_replace('$tag', url_escape($tag), $config->get_string('info_link'))); |             $link = html_escape(str_replace('$tag', url_escape($tag), $config->get_string(TagListConfig::INFO_LINK))); | ||||||
|             $display_html .= '<td class="tag_info_link_cell"> <a class="tag_info_link'.$tag_category_css.'" '.$tag_category_style.'href="'.$link.'">?</a></td>'; |             $display_html .= '<td class="tag_info_link_cell"> <a class="tag_info_link'.$tag_category_css.'" '.$tag_category_style.'href="'.$link.'">?</a></td>'; | ||||||
|         } |         } | ||||||
|         $link = $this->tag_link($row['tag']); |         $link = $this->tag_link($row['tag']); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user