kopia lustrzana https://github.com/friendica/friendica
Merge pull request #15051 from annando/issue-15043
Issue 15043: Improved performance for unseen postspull/15032/merge
commit
76f02ee18e
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue