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); | 		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 | 	 * Update existing post entries | ||||||
| 	 * | 	 * | ||||||
|  |  | ||||||
|  | @ -35,13 +35,11 @@ use Friendica\Core\L10n; | ||||||
| use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; | use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; | ||||||
| use Friendica\Core\Renderer; | use Friendica\Core\Renderer; | ||||||
| use Friendica\Core\Session\Capability\IHandleUserSessions; | use Friendica\Core\Session\Capability\IHandleUserSessions; | ||||||
| use Friendica\Core\Worker; |  | ||||||
| use Friendica\Database\DBA; | use Friendica\Database\DBA; | ||||||
| use Friendica\Database\Database; | use Friendica\Database\Database; | ||||||
| use Friendica\Event\ArrayFilterEvent; | use Friendica\Event\ArrayFilterEvent; | ||||||
| use Friendica\Model\Contact; | use Friendica\Model\Contact; | ||||||
| use Friendica\Model\Circle; | use Friendica\Model\Circle; | ||||||
| use Friendica\Model\Post; |  | ||||||
| use Friendica\Model\Profile; | use Friendica\Model\Profile; | ||||||
| use Friendica\Module\Response; | use Friendica\Module\Response; | ||||||
| use Friendica\Module\Security\Login; | use Friendica\Module\Security\Login; | ||||||
|  | @ -522,16 +520,8 @@ class Network extends Timeline | ||||||
| 			return $items; | 			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; | 		return $items; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ use Friendica\Core\L10n; | ||||||
| use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; | use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; | ||||||
| use Friendica\Core\Renderer; | use Friendica\Core\Renderer; | ||||||
| use Friendica\Core\Session\Capability\IHandleUserSessions; | use Friendica\Core\Session\Capability\IHandleUserSessions; | ||||||
|  | use Friendica\Core\Worker; | ||||||
| use Friendica\Model\Contact; | use Friendica\Model\Contact; | ||||||
| use Friendica\Model\User; | use Friendica\Model\User; | ||||||
| use Friendica\Database\Database; | use Friendica\Database\Database; | ||||||
|  | @ -295,8 +296,7 @@ class Timeline extends BaseModule | ||||||
| 			$selected_items = $items; | 			$selected_items = $items; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		$condition = ['unseen' => true, 'uid' => $uid, 'parent-uri-id' => array_column($selected_items, 'uri-id')]; | 		$this->setItemsSeenForUser($uid); | ||||||
| 		$this->setItemsSeenByCondition($condition); |  | ||||||
| 
 | 
 | ||||||
| 		return $selected_items; | 		return $selected_items; | ||||||
| 	} | 	} | ||||||
|  | @ -443,8 +443,7 @@ class Timeline extends BaseModule | ||||||
| 			$items = array_reverse($items, true); | 			$items = array_reverse($items, true); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		$condition = ['unseen' => true, 'uid' => $uid, 'parent-uri-id' => array_column($items, 'uri-id')]; | 		$this->setItemsSeenForUser($uid); | ||||||
| 		$this->setItemsSeenByCondition($condition); |  | ||||||
| 
 | 
 | ||||||
| 		return $items; | 		return $items; | ||||||
| 	} | 	} | ||||||
|  | @ -701,12 +700,6 @@ class Timeline extends BaseModule | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if ($maxpostperauthor === 0) { | 		if ($maxpostperauthor === 0) { | ||||||
| 			$this->setItemsSeenByCondition([ |  | ||||||
| 				'unseen'        => true, |  | ||||||
| 				'uid'           => $this->session->getLocalUserId(), |  | ||||||
| 				'parent-uri-id' => array_column($items, 'uri-id') |  | ||||||
| 			]); |  | ||||||
| 
 |  | ||||||
| 			return $items; | 			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; | 		return $selected_items; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -834,22 +824,18 @@ class Timeline extends BaseModule | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Sets items as seen | 	 * Sets all unseen items for a user as seen | ||||||
| 	 * | 	 * @param int $uid User ID | ||||||
| 	 * @param array $condition The array with the SQL condition |  | ||||||
| 	 * @throws \Friendica\Network\HTTPException\InternalServerErrorException |  | ||||||
| 	 */ | 	 */ | ||||||
| 	protected function setItemsSeenByCondition(array $condition) | 	protected function setItemsSeenForUser(int $uid) | ||||||
| 	{ | 	{ | ||||||
| 		if (empty($condition) || $this->ping) { | 		$posts = Post::getUnseenPosts($uid); | ||||||
| 			return; | 		if (!empty($posts)) { | ||||||
|  | 			Item::update(['unseen' => false], ['unseen' => true, 'uid' => $uid, 'uri-id' => $posts]); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		$unseen = Post::exists($condition); | 		if (count($posts) == 100) { | ||||||
| 
 | 			Worker::add(Worker::PRIORITY_MEDIUM, 'SetSeen', $uid); | ||||||
| 		if ($unseen) { |  | ||||||
| 			/// @todo handle huge "unseen" updates in the background to avoid timeout errors
 |  | ||||||
| 			Item::update(['unseen' => false], $condition); |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Ładowanie…
	
		Reference in New Issue
	
	 Philipp
						Philipp