Move trending tags queries to Model\Term
This commit is contained in:
		
					parent
					
						
							
								4c45cb864a
							
						
					
				
			
			
				commit
				
					
						9e8ae520b8
					
				
			
		
					 2 changed files with 91 additions and 80 deletions
				
			
		| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue