Some more "term" to "tag" conversion
This commit is contained in:
parent
2b8dabcd95
commit
ac2957c4dd
6 changed files with 70 additions and 101 deletions
12
mod/item.php
12
mod/item.php
|
@ -101,7 +101,7 @@ function item_post(App $a) {
|
||||||
$toplevel_item_id = intval($_REQUEST['parent'] ?? 0);
|
$toplevel_item_id = intval($_REQUEST['parent'] ?? 0);
|
||||||
$thr_parent_uri = trim($_REQUEST['parent_uri'] ?? '');
|
$thr_parent_uri = trim($_REQUEST['parent_uri'] ?? '');
|
||||||
|
|
||||||
$thread_parent_id = 0;
|
$thread_parent_uriid = 0;
|
||||||
$thread_parent_contact = null;
|
$thread_parent_contact = null;
|
||||||
|
|
||||||
$toplevel_item = null;
|
$toplevel_item = null;
|
||||||
|
@ -123,7 +123,7 @@ function item_post(App $a) {
|
||||||
// if this isn't the top-level parent of the conversation, find it
|
// if this isn't the top-level parent of the conversation, find it
|
||||||
if (DBA::isResult($toplevel_item)) {
|
if (DBA::isResult($toplevel_item)) {
|
||||||
// The URI and the contact is taken from the direct parent which needn't to be the top parent
|
// The URI and the contact is taken from the direct parent which needn't to be the top parent
|
||||||
$thread_parent_id = $toplevel_item['id'];
|
$thread_parent_uriid = $toplevel_item['uri-id'];
|
||||||
$thr_parent_uri = $toplevel_item['uri'];
|
$thr_parent_uri = $toplevel_item['uri'];
|
||||||
$thread_parent_contact = Contact::getDetailsByURL($toplevel_item["author-link"]);
|
$thread_parent_contact = Contact::getDetailsByURL($toplevel_item["author-link"]);
|
||||||
|
|
||||||
|
@ -381,8 +381,8 @@ function item_post(App $a) {
|
||||||
|
|
||||||
$tags = BBCode::getTags($body);
|
$tags = BBCode::getTags($body);
|
||||||
|
|
||||||
if ($thread_parent_id && !\Friendica\Content\Feature::isEnabled($uid, 'explicit_mentions')) {
|
if ($thread_parent_uriid && !\Friendica\Content\Feature::isEnabled($uid, 'explicit_mentions')) {
|
||||||
$tags = item_add_implicit_mentions($tags, $thread_parent_contact, $thread_parent_id);
|
$tags = item_add_implicit_mentions($tags, $thread_parent_contact, $thread_parent_uriid);
|
||||||
}
|
}
|
||||||
|
|
||||||
$tagged = [];
|
$tagged = [];
|
||||||
|
@ -1044,7 +1044,7 @@ function handle_tag(&$body, &$inform, &$str_tags, $profile_uid, $tag, $network =
|
||||||
return ['replaced' => $replaced, 'contact' => $contact];
|
return ['replaced' => $replaced, 'contact' => $contact];
|
||||||
}
|
}
|
||||||
|
|
||||||
function item_add_implicit_mentions(array $tags, array $thread_parent_contact, $thread_parent_id)
|
function item_add_implicit_mentions(array $tags, array $thread_parent_contact, $thread_parent_uriid)
|
||||||
{
|
{
|
||||||
if (DI::config()->get('system', 'disable_implicit_mentions')) {
|
if (DI::config()->get('system', 'disable_implicit_mentions')) {
|
||||||
// Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them)
|
// Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them)
|
||||||
|
@ -1059,7 +1059,7 @@ function item_add_implicit_mentions(array $tags, array $thread_parent_contact, $
|
||||||
$thread_parent_contact['url'] => $thread_parent_contact['nick']
|
$thread_parent_contact['url'] => $thread_parent_contact['nick']
|
||||||
];
|
];
|
||||||
|
|
||||||
$parent_terms = Term::tagArrayFromItemId($thread_parent_id, [Tag::MENTION, Tag::IMPLICIT_MENTION]);
|
$parent_terms = Tag::getByURIId($thread_parent_uriid, [Tag::MENTION, Tag::IMPLICIT_MENTION]);
|
||||||
|
|
||||||
foreach ($parent_terms as $parent_term) {
|
foreach ($parent_terms as $parent_term) {
|
||||||
$implicit_mentions[$parent_term['url']] = $parent_term['term'];
|
$implicit_mentions[$parent_term['url']] = $parent_term['term'];
|
||||||
|
|
|
@ -24,7 +24,6 @@ namespace Friendica\Content\Widget;
|
||||||
use Friendica\Core\Renderer;
|
use Friendica\Core\Renderer;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Friendica\Model\Tag;
|
use Friendica\Model\Tag;
|
||||||
use Friendica\Model\Term;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trending tags aside widget for the community pages, handles both local and global scopes
|
* Trending tags aside widget for the community pages, handles both local and global scopes
|
||||||
|
@ -42,9 +41,9 @@ class TrendingTags
|
||||||
public static function getHTML($content = 'global', int $period = 24)
|
public static function getHTML($content = 'global', int $period = 24)
|
||||||
{
|
{
|
||||||
if ($content == 'local') {
|
if ($content == 'local') {
|
||||||
$tags = Term::getLocalTrendingHashtags($period, 20);
|
$tags = Tag::getLocalTrendingHashtags($period, 20);
|
||||||
} else {
|
} else {
|
||||||
$tags = Term::getGlobalTrendingHashtags($period, 20);
|
$tags = Tag::getGlobalTrendingHashtags($period, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
$tpl = Renderer::getMarkupTemplate('widget/trending_tags.tpl');
|
$tpl = Renderer::getMarkupTemplate('widget/trending_tags.tpl');
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
namespace Friendica\Model;
|
namespace Friendica\Model;
|
||||||
|
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Text\BBCode;
|
||||||
|
use Friendica\Core\Cache\Duration;
|
||||||
use Friendica\Core\Logger;
|
use Friendica\Core\Logger;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
|
@ -416,4 +417,58 @@ class Tag
|
||||||
|
|
||||||
return $uriids;
|
return $uriids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 = DI::cache()->get('global_trending_tags');
|
||||||
|
|
||||||
|
if (empty($tags)) {
|
||||||
|
$tagsStmt = DBA::p("SELECT `name` AS `term`, COUNT(*) AS `score`
|
||||||
|
FROM `tag-search-view`
|
||||||
|
WHERE `private` = ? AND `received` > DATE_SUB(NOW(), INTERVAL ? HOUR)
|
||||||
|
GROUP BY `term` ORDER BY `score` DESC LIMIT ?",
|
||||||
|
Item::PUBLIC, $period, $limit);
|
||||||
|
|
||||||
|
if (DBA::isResult($tagsStmt)) {
|
||||||
|
$tags = DBA::toArray($tagsStmt);
|
||||||
|
DI::cache()->set('global_trending_tags', $tags, Duration::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 = DI::cache()->get('local_trending_tags');
|
||||||
|
|
||||||
|
if (empty($tags)) {
|
||||||
|
$tagsStmt = DBA::p("SELECT `name` AS `term`, COUNT(*) AS `score`
|
||||||
|
FROM `tag-search-view`
|
||||||
|
WHERE `private` = ? AND `wall` AND `origin` AND `received` > DATE_SUB(NOW(), INTERVAL ? HOUR)
|
||||||
|
GROUP BY `term` ORDER BY `score` DESC LIMIT ?",
|
||||||
|
Item::PUBLIC, $period, $limit);
|
||||||
|
|
||||||
|
if (DBA::isResult($tagsStmt)) {
|
||||||
|
$tags = DBA::toArray($tagsStmt);
|
||||||
|
DI::cache()->set('local_trending_tags', $tags, Duration::HOUR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tags ?: [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,95 +60,6 @@ class Term
|
||||||
const OBJECT_TYPE_POST = 1;
|
const OBJECT_TYPE_POST = 1;
|
||||||
const OBJECT_TYPE_PHOTO = 2;
|
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 = DI::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 `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 ?",
|
|
||||||
Item::PUBLIC,
|
|
||||||
self::OBJECT_TYPE_POST,
|
|
||||||
self::HASHTAG,
|
|
||||||
$period,
|
|
||||||
$limit
|
|
||||||
);
|
|
||||||
|
|
||||||
if (DBA::isResult($tagsStmt)) {
|
|
||||||
$tags = DBA::toArray($tagsStmt);
|
|
||||||
DI::cache()->set('global_trending_tags', $tags, Duration::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 = DI::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`
|
|
||||||
WHERE `thread`.`visible`
|
|
||||||
AND NOT `thread`.`deleted`
|
|
||||||
AND NOT `thread`.`moderated`
|
|
||||||
AND `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 ?",
|
|
||||||
Item::PUBLIC,
|
|
||||||
self::OBJECT_TYPE_POST,
|
|
||||||
self::HASHTAG,
|
|
||||||
$period,
|
|
||||||
$limit
|
|
||||||
);
|
|
||||||
|
|
||||||
if (DBA::isResult($tagsStmt)) {
|
|
||||||
$tags = DBA::toArray($tagsStmt);
|
|
||||||
DI::cache()->set('local_trending_tags', $tags, Duration::HOUR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $tags ?: [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the legacy item.tag field comma-separated BBCode string from an item ID.
|
* Generates the legacy item.tag field comma-separated BBCode string from an item ID.
|
||||||
* Includes only hashtags, implicit and explicit mentions.
|
* Includes only hashtags, implicit and explicit mentions.
|
||||||
|
@ -176,7 +87,7 @@ class Term
|
||||||
* @return array
|
* @return array
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
public static function tagArrayFromItemId($item_id, $type = [self::HASHTAG, self::MENTION])
|
private static function tagArrayFromItemId($item_id, $type = [self::HASHTAG, self::MENTION])
|
||||||
{
|
{
|
||||||
$condition = ['otype' => self::OBJECT_TYPE_POST, 'oid' => $item_id, 'type' => $type];
|
$condition = ['otype' => self::OBJECT_TYPE_POST, 'oid' => $item_id, 'type' => $type];
|
||||||
$tags = DBA::select('term', ['type', 'term', 'url'], $condition);
|
$tags = DBA::select('term', ['type', 'term', 'url'], $condition);
|
||||||
|
|
|
@ -48,14 +48,14 @@ class Source extends BaseAdmin
|
||||||
$item_id = '';
|
$item_id = '';
|
||||||
$terms = [];
|
$terms = [];
|
||||||
if (!empty($guid)) {
|
if (!empty($guid)) {
|
||||||
$item = Model\Item::selectFirst(['id', 'guid', 'uri'], ['guid' => $guid]);
|
$item = Model\Item::selectFirst(['id', 'uri-id', 'guid', 'uri'], ['guid' => $guid]);
|
||||||
|
|
||||||
$conversation = Model\Conversation::getByItemUri($item['uri']);
|
$conversation = Model\Conversation::getByItemUri($item['uri']);
|
||||||
|
|
||||||
$item_id = $item['id'];
|
$item_id = $item['id'];
|
||||||
$item_uri = $item['uri'];
|
$item_uri = $item['uri'];
|
||||||
$source = $conversation['source'];
|
$source = $conversation['source'];
|
||||||
$terms = Model\Term::tagArrayFromItemId($item['id'], [Model\Term::HASHTAG, Model\Term::MENTION, Model\Term::IMPLICIT_MENTION]);
|
$terms = Model\Tag::getByURIId($item['uri-id'], [Model\Tag::HASHTAG, Model\Tag::MENTION, Model\Tag::IMPLICIT_MENTION]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$tpl = Renderer::getMarkupTemplate('admin/item/source.tpl');
|
$tpl = Renderer::getMarkupTemplate('admin/item/source.tpl');
|
||||||
|
|
|
@ -228,6 +228,10 @@ return [
|
||||||
"guid" => ["item", "guid"],
|
"guid" => ["item", "guid"],
|
||||||
"uid" => ["item", "uid"],
|
"uid" => ["item", "uid"],
|
||||||
"private" => ["item", "private"],
|
"private" => ["item", "private"],
|
||||||
|
"wall" => ["item", "wall"],
|
||||||
|
"origin" => ["item", "origin"],
|
||||||
|
"gravity" => ["item", "gravity"],
|
||||||
|
"received" => ["item", "received"],
|
||||||
"name" => ["tag", "name"],
|
"name" => ["tag", "name"],
|
||||||
],
|
],
|
||||||
"query" => "FROM `post-tag`
|
"query" => "FROM `post-tag`
|
||||||
|
|
Loading…
Reference in a new issue