Merge pull request #15051 from annando/issue-15043

Issue 15043: Improved performance for unseen posts
pull/15032/merge
Philipp 2025-08-01 12:19:18 +02:00 zatwierdzone przez GitHub
commit 76f02ee18e
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
3 zmienionych plików z 23 dodań i 36 usunięć

Wyświetl plik

@ -607,6 +607,17 @@ class Post
return self::selectFirstForUser($uid, $original_selected, ['uri-id' => $result['thr-parent-id'], 'uid' => [0, $uid]], $params);
}
/**
* Retrieves a list of up to 100 unseen posts for a user
* @param int $uid User ID
* @return array Array containing the URI IDs of unseen posts
*/
public static function getUnseenPosts(int $uid): array
{
$posts = DBA::selectToArray('post-user', ['uri-id'], ['unseen' => true, 'uid' => $uid], ['limit' => 100]);
return array_column($posts, 'uri-id');
}
/**
* Update existing post entries
*

Wyświetl plik

@ -35,13 +35,11 @@ use Friendica\Core\L10n;
use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
use Friendica\Core\Renderer;
use Friendica\Core\Session\Capability\IHandleUserSessions;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
use Friendica\Database\Database;
use Friendica\Event\ArrayFilterEvent;
use Friendica\Model\Contact;
use Friendica\Model\Circle;
use Friendica\Model\Post;
use Friendica\Model\Profile;
use Friendica\Module\Response;
use Friendica\Module\Security\Login;
@ -522,16 +520,8 @@ class Network extends Timeline
return $items;
}
$this->setItemsSeenByCondition(['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'parent-uri-id' => array_column($items, 'uri-id')]);
$this->setItemsSeenForUser($this->session->getLocalUserId());
$posts = Post::selectToArray(['uri-id'], ['unseen' => true, 'uid' => $this->session->getLocalUserId()], ['limit' => 100]);
if (!empty($posts)) {
$this->setItemsSeenByCondition(['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'uri-id' => array_column($posts, 'uri-id')]);
}
if (count($posts) == 100) {
Worker::add(Worker::PRIORITY_MEDIUM, 'SetSeen', $this->session->getLocalUserId());
}
return $items;
}

Wyświetl plik

@ -23,6 +23,7 @@ use Friendica\Core\L10n;
use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
use Friendica\Core\Renderer;
use Friendica\Core\Session\Capability\IHandleUserSessions;
use Friendica\Core\Worker;
use Friendica\Model\Contact;
use Friendica\Model\User;
use Friendica\Database\Database;
@ -295,8 +296,7 @@ class Timeline extends BaseModule
$selected_items = $items;
}
$condition = ['unseen' => true, 'uid' => $uid, 'parent-uri-id' => array_column($selected_items, 'uri-id')];
$this->setItemsSeenByCondition($condition);
$this->setItemsSeenForUser($uid);
return $selected_items;
}
@ -443,8 +443,7 @@ class Timeline extends BaseModule
$items = array_reverse($items, true);
}
$condition = ['unseen' => true, 'uid' => $uid, 'parent-uri-id' => array_column($items, 'uri-id')];
$this->setItemsSeenByCondition($condition);
$this->setItemsSeenForUser($uid);
return $items;
}
@ -701,12 +700,6 @@ class Timeline extends BaseModule
}
if ($maxpostperauthor === 0) {
$this->setItemsSeenByCondition([
'unseen' => true,
'uid' => $this->session->getLocalUserId(),
'parent-uri-id' => array_column($items, 'uri-id')
]);
return $items;
}
@ -749,9 +742,6 @@ class Timeline extends BaseModule
}
}
$condition = ['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'parent-uri-id' => array_column($selected_items, 'uri-id')];
$this->setItemsSeenByCondition($condition);
return $selected_items;
}
@ -834,22 +824,18 @@ class Timeline extends BaseModule
}
/**
* Sets items as seen
*
* @param array $condition The array with the SQL condition
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* Sets all unseen items for a user as seen
* @param int $uid User ID
*/
protected function setItemsSeenByCondition(array $condition)
protected function setItemsSeenForUser(int $uid)
{
if (empty($condition) || $this->ping) {
return;
$posts = Post::getUnseenPosts($uid);
if (!empty($posts)) {
Item::update(['unseen' => false], ['unseen' => true, 'uid' => $uid, 'uri-id' => $posts]);
}
$unseen = Post::exists($condition);
if ($unseen) {
/// @todo handle huge "unseen" updates in the background to avoid timeout errors
Item::update(['unseen' => false], $condition);
if (count($posts) == 100) {
Worker::add(Worker::PRIORITY_MEDIUM, 'SetSeen', $uid);
}
}
}