diff --git a/CHANGELOG b/CHANGELOG index 3b65066b..a3847c4f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Version 0.9.0 (????-??-??) Bug fixes: - Use icons specified in Atom feeds when available +- Do not return null as subscription unread count Changes: - Explicitly forbid U+003A COLON in usernames, for compatibility with HTTP diff --git a/lib/Database.php b/lib/Database.php index 08e3f050..9ad0eb2c 100644 --- a/lib/Database.php +++ b/lib/Database.php @@ -748,13 +748,20 @@ class Database { i.url as favicon, t.top as top_folder, coalesce(s.title, f.title) as title, - (articles - marked) as unread + coalesce((articles - hidden - marked + hidden_marked), articles) as unread FROM arsse_subscriptions as s left join topmost as t on t.f_id = s.folder join arsse_feeds as f on f.id = s.feed left join arsse_icons as i on i.id = f.icon left join (select feed, count(*) as articles from arsse_articles group by feed) as article_stats on article_stats.feed = s.feed - left join (select subscription, sum(\"read\") as marked from arsse_marks group by subscription) as mark_stats on mark_stats.subscription = s.id" + left join ( + select + subscription, + sum(cast((\"read\" = 1 and hidden = 0) as integer)) as marked, + sum(cast((\"read\" = 0 and hidden = 1) as integer)) as hidden, + sum(cast((\"read\" = 1 and hidden = 1) as integer)) as hidden_marked + from arsse_marks group by subscription + ) as mark_stats on mark_stats.subscription = s.id" ); $q->setWhere("s.owner = ?", ["str"], [$user]); $nocase = $this->db->sqlToken("nocase"); diff --git a/tests/cases/Database/SeriesSubscription.php b/tests/cases/Database/SeriesSubscription.php index 749c8752..0e14a7bf 100644 --- a/tests/cases/Database/SeriesSubscription.php +++ b/tests/cases/Database/SeriesSubscription.php @@ -21,8 +21,9 @@ trait SeriesSubscription { 'num' => 'int', ], 'rows' => [ - ["jane.doe@example.com", "",1], - ["john.doe@example.com", "",2], + ["jane.doe@example.com", "", 1], + ["john.doe@example.com", "", 2], + ["jill.doe@example.com", "", 3] ], ], 'arsse_folders' => [ @@ -81,6 +82,7 @@ trait SeriesSubscription { [1,"john.doe@example.com",2,null,null,1,2], [2,"jane.doe@example.com",2,null,null,0,0], [3,"john.doe@example.com",3,"Ook",2,0,1], + [4,"jill.doe@example.com",2,null,null,0,0], ], ], 'arsse_tags' => [ @@ -291,6 +293,19 @@ trait SeriesSubscription { $this->assertResult($exp, Arsse::$db->subscriptionList($this->user)); $this->assertArraySubset($exp[0], Arsse::$db->subscriptionPropertiesGet($this->user, 1)); $this->assertArraySubset($exp[1], Arsse::$db->subscriptionPropertiesGet($this->user, 3)); + // test that an absence of marks does not corrupt unread count + $exp = [ + [ + 'url' => "http://example.com/feed2", + 'title' => "eek", + 'folder' => null, + 'top_folder' => null, + 'unread' => 5, + 'pinned' => 0, + 'order_type' => 0, + ], + ]; + $this->assertResult($exp, Arsse::$db->subscriptionList("jill.doe@example.com")); } public function testListSubscriptionsInAFolder(): void {