aboutsummaryrefslogtreecommitdiff
path: root/app/Models/FeedDAO.php
diff options
context:
space:
mode:
Diffstat (limited to 'app/Models/FeedDAO.php')
-rw-r--r--app/Models/FeedDAO.php35
1 files changed, 28 insertions, 7 deletions
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index 0353f9a05..ddc2057db 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -479,17 +479,38 @@ SQL;
* Update cached values for selected feeds, or all feeds if no feed ID is provided.
*/
public function updateCachedValues(int ...$feedIds): int|false {
- //2 sub-requests with FOREIGN KEY(e.id_feed), INDEX(e.is_read) faster than 1 request with GROUP BY or CASE
+ if (empty($feedIds)) {
+ $whereFeedIds = 'true';
+ $whereEntryIdFeeds = 'true';
+ } else {
+ $whereFeedIds = 'id IN (' . str_repeat('?,', count($feedIds) - 1) . '?)';
+ $whereEntryIdFeeds = 'id_feed IN (' . str_repeat('?,', count($feedIds) - 1) . '?)';
+ }
$sql = <<<SQL
+ WITH entry_counts AS (
+ SELECT
+ id_feed,
+ COUNT(*) AS total_entries,
+ SUM(CASE WHEN is_read = 0 THEN 1 ELSE 0 END) AS unread_entries
+ FROM `_entry`
+ WHERE $whereEntryIdFeeds
+ GROUP BY id_feed
+ )
UPDATE `_feed`
- SET `cache_nbEntries`=(SELECT COUNT(e1.id) FROM `_entry` e1 WHERE e1.id_feed=`_feed`.id),
- `cache_nbUnreads`=(SELECT COUNT(e2.id) FROM `_entry` e2 WHERE e2.id_feed=`_feed`.id AND e2.is_read=0)
+ SET `cache_nbEntries` = COALESCE((
+ SELECT c.total_entries
+ FROM entry_counts AS c
+ WHERE c.id_feed = `_feed`.id
+ ), 0),
+ `cache_nbUnreads` = COALESCE((
+ SELECT c.unread_entries
+ FROM entry_counts AS c
+ WHERE c.id_feed = `_feed`.id
+ ), 0)
+ WHERE $whereFeedIds
SQL;
- if (count($feedIds) > 0) {
- $sql .= ' WHERE id IN (' . str_repeat('?,', count($feedIds) - 1) . '?)';
- }
$stm = $this->pdo->prepare($sql);
- if ($stm !== false && $stm->execute($feedIds)) {
+ if ($stm !== false && $stm->execute(array_merge($feedIds, $feedIds))) {
return $stm->rowCount();
} else {
$info = $stm === false ? $this->pdo->errorInfo() : $stm->errorInfo();