diff --git a/src/Content/Widget/TrendingTags.php b/src/Content/Widget/TrendingTags.php index 15a06e029c..e5dd36bb9b 100644 --- a/src/Content/Widget/TrendingTags.php +++ b/src/Content/Widget/TrendingTags.php @@ -19,9 +19,9 @@ class TrendingTags public static function getHTML($content = 'global', int $period = 24) { if ($content == 'local') { - $tags = self::getLocalTrendingTags($period); + $tags = Term::getLocalTrendingHashtags($period, 20); } else { - $tags = self::getGlobalTrendingTags($period); + $tags = Term::getGlobalTrendingHashtags($period, 20); } $tpl = Renderer::getMarkupTemplate('widget/trending_tags.tpl'); @@ -33,82 +33,4 @@ class TrendingTags return $o; } - - /** - * Returns a list of the most frequent global tags over the given period - * - * @param int $period Period in hours to consider posts - * @return array - * @throws \Exception - */ - private static function getGlobalTrendingTags(int $period) - { - $tags = Cache::get('global_trending_tags'); - - if (!$tags) { - $tagsStmt = DBA::p("SELECT t.`term`, COUNT(*) AS `score` -FROM `term` t - JOIN `item` i ON i.`id` = t.`oid` AND i.`uid` = t.`uid` - JOIN `thread` ON `thread`.`iid` = i.`id` -WHERE `thread`.`visible` - AND NOT `thread`.`deleted` - AND NOT `thread`.`moderated` - AND NOT `thread`.`private` - AND t.`uid` = 0 - AND t.`otype` = ? - AND t.`type` = ? - AND t.`term` != '' - AND i.`received` > DATE_SUB(NOW(), INTERVAL ? HOUR) -GROUP BY `term` -ORDER BY `score` DESC -LIMIT 20", Term::OBJECT_TYPE_POST, Term::HASHTAG, $period); - - if (DBA::isResult($tags)) { - $tags = DBA::toArray($tagsStmt); - Cache::set('global_trending_tags', $tags, Cache::HOUR); - } - } - - return $tags ?: []; - } - - /** - * Returns a list of the most frequent local tags over the given period - * - * @param int $period Period in hours to consider posts - * @return array - * @throws \Exception - */ - private static function getLocalTrendingTags(int $period) - { - $tags = Cache::get('local_trending_tags'); - - if (!$tags) { - $tagsStmt = DBA::p("SELECT t.`term`, COUNT(*) AS `score` -FROM `term` t -JOIN `item` i ON i.`id` = t.`oid` AND i.`uid` = t.`uid` -JOIN `thread` ON `thread`.`iid` = i.`id` -JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall` -WHERE `thread`.`visible` - AND NOT `thread`.`deleted` - AND NOT `thread`.`moderated` - AND NOT `thread`.`private` - AND `thread`.`wall` - AND `thread`.`origin` - AND t.`otype` = ? - AND t.`type` = ? - AND t.`term` != '' - AND i.`received` > DATE_SUB(NOW(), INTERVAL ? HOUR) -GROUP BY `term` -ORDER BY `score` DESC -LIMIT 20", Term::OBJECT_TYPE_POST, Term::HASHTAG, $period); - - if (DBA::isResult($tags)) { - $tags = DBA::toArray($tagsStmt); - Cache::set('local_trending_tags', $tags, Cache::HOUR); - } - } - - return $tags ?: []; - } } diff --git a/src/Model/Term.php b/src/Model/Term.php index f196974a8f..4e2b571cef 100644 --- a/src/Model/Term.php +++ b/src/Model/Term.php @@ -4,6 +4,7 @@ */ namespace Friendica\Model; +use Friendica\Core\Cache; use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\Database\DBA; @@ -47,6 +48,94 @@ class Term const OBJECT_TYPE_POST = 1; const OBJECT_TYPE_PHOTO = 2; + /** + * Returns a list of the most frequent global hashtags over the given period + * + * @param int $period Period in hours to consider posts + * @return array + * @throws \Exception + */ + public static function getGlobalTrendingHashtags(int $period, $limit = 10) + { + $tags = Cache::get('global_trending_tags'); + + if (!$tags) { + $tagsStmt = DBA::p("SELECT t.`term`, COUNT(*) AS `score` + FROM `term` t + JOIN `item` i ON i.`id` = t.`oid` AND i.`uid` = t.`uid` + JOIN `thread` ON `thread`.`iid` = i.`id` + WHERE `thread`.`visible` + AND NOT `thread`.`deleted` + AND NOT `thread`.`moderated` + AND NOT `thread`.`private` + AND t.`uid` = 0 + AND t.`otype` = ? + AND t.`type` = ? + AND t.`term` != '' + AND i.`received` > DATE_SUB(NOW(), INTERVAL ? HOUR) + GROUP BY `term` + ORDER BY `score` DESC + LIMIT ?", + Term::OBJECT_TYPE_POST, + Term::HASHTAG, + $period, + $limit + ); + + if (DBA::isResult($tags)) { + $tags = DBA::toArray($tagsStmt); + Cache::set('global_trending_tags', $tags, Cache::HOUR); + } + } + + return $tags ?: []; + } + + /** + * Returns a list of the most frequent local hashtags over the given period + * + * @param int $period Period in hours to consider posts + * @return array + * @throws \Exception + */ + public static function getLocalTrendingHashtags(int $period, $limit = 10) + { + $tags = Cache::get('local_trending_tags'); + + if (!$tags) { + $tagsStmt = DBA::p("SELECT t.`term`, COUNT(*) AS `score` + FROM `term` t + JOIN `item` i ON i.`id` = t.`oid` AND i.`uid` = t.`uid` + JOIN `thread` ON `thread`.`iid` = i.`id` + JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall` + WHERE `thread`.`visible` + AND NOT `thread`.`deleted` + AND NOT `thread`.`moderated` + AND NOT `thread`.`private` + AND `thread`.`wall` + AND `thread`.`origin` + AND t.`otype` = ? + AND t.`type` = ? + AND t.`term` != '' + AND i.`received` > DATE_SUB(NOW(), INTERVAL ? HOUR) + GROUP BY `term` + ORDER BY `score` DESC + LIMIT ?", + Term::OBJECT_TYPE_POST, + Term::HASHTAG, + $period, + $limit + ); + + if (DBA::isResult($tags)) { + $tags = DBA::toArray($tagsStmt); + Cache::set('local_trending_tags', $tags, Cache::HOUR); + } + } + + return $tags ?: []; + } + /** * Generates the legacy item.tag field comma-separated BBCode string from an item ID. * Includes only hashtags, implicit and explicit mentions.