Browse Source

Aggressivly clean up hidden articles

Notably, starred articles are cleaned up if hidden
rpm
J. King 3 years ago
parent
commit
a81760e39d
  1. 54
      lib/Database.php
  2. 16
      tests/cases/Database/SeriesCleanup.php

54
lib/Database.php

@ -1809,21 +1809,49 @@ class Database {
/** Deletes from the database articles which are beyond the configured clean-up threshold */ /** Deletes from the database articles which are beyond the configured clean-up threshold */
public function articleCleanup(): bool { public function articleCleanup(): bool {
$query = $this->db->prepare( $query = $this->db->prepareArray(
"WITH RECURSIVE "WITH RECURSIVE
exempt_articles as (SELECT id from arsse_articles join (SELECT article, max(id) as edition from arsse_editions group by article) as latest_editions on arsse_articles.id = latest_editions.article where feed = ? order by edition desc limit ?), exempt_articles as (
target_articles as ( SELECT
select id from arsse_articles id
left join (select article, sum(starred) as starred, sum(\"read\") as \"read\", max(arsse_marks.modified) as marked_date from arsse_marks join arsse_subscriptions on arsse_subscriptions.id = arsse_marks.subscription group by article) as mark_stats on mark_stats.article = arsse_articles.id from arsse_articles join (
left join (select feed, count(*) as subs from arsse_subscriptions group by feed) as feed_stats on feed_stats.feed = arsse_articles.feed SELECT article, max(id) as edition from arsse_editions group by article
where arsse_articles.feed = ? and coalesce(starred,0) = 0 and (coalesce(marked_date,modified) <= ? or (coalesce(\"read\",0) = coalesce(subs,0) and coalesce(marked_date,modified) <= ?)) ) as latest_editions on arsse_articles.id = latest_editions.article
) where feed = ? order by edition desc limit ?
),
target_articles as (
SELECT
id
from arsse_articles
join (
select
feed,
count(*) as subs
from arsse_subscriptions
where feed = ?
group by feed
) as feed_stats on feed_stats.feed = arsse_articles.feed
left join (
select
article,
sum(cast((starred = 1 and hidden = 0) as integer)) as starred,
sum(cast((\"read\" = 1 or hidden = 1) as integer)) as \"read\",
max(arsse_marks.modified) as marked_date
from arsse_marks
group by article
) as mark_stats on mark_stats.article = arsse_articles.id
where
coalesce(starred,0) = 0
and (
coalesce(marked_date,modified) <= ?
or (
coalesce(\"read\",0) = coalesce(subs,0)
and coalesce(marked_date,modified) <= ?
)
)
)
DELETE FROM arsse_articles WHERE id not in (select id from exempt_articles) and id in (select id from target_articles)", DELETE FROM arsse_articles WHERE id not in (select id from exempt_articles) and id in (select id from target_articles)",
"int", ["int", "int", "int", "datetime", "datetime"]
"int",
"int",
"datetime",
"datetime"
); );
$limitRead = null; $limitRead = null;
$limitUnread = null; $limitUnread = null;

16
tests/cases/Database/SeriesCleanup.php

@ -148,16 +148,18 @@ trait SeriesCleanup {
'subscription' => "int", 'subscription' => "int",
'read' => "bool", 'read' => "bool",
'starred' => "bool", 'starred' => "bool",
'hidden' => "bool",
'modified' => "datetime", 'modified' => "datetime",
], ],
'rows' => [ 'rows' => [
[3,1,0,1,$weeksago], [3,1,0,1,0,$weeksago],
[4,1,1,0,$daysago], [4,1,1,0,0,$daysago],
[6,1,1,0,$nowish], [6,1,1,0,0,$nowish],
[6,2,1,0,$weeksago], [6,2,1,0,0,$weeksago],
[8,1,1,0,$weeksago], [7,2,0,1,1,$weeksago], // hidden takes precedence over starred
[9,1,1,0,$daysago], [8,1,1,0,0,$weeksago],
[9,2,1,0,$daysago], [9,1,1,0,0,$daysago],
[9,2,0,0,1,$daysago], // hidden is the same as read for the purposes of cleanup
], ],
], ],
]; ];

Loading…
Cancel
Save