Working implementations

This commit is contained in:
Bryan Culver
2022-12-07 00:30:19 -05:00
parent 002f3e87fd
commit 35a6cf551b
16 changed files with 319 additions and 103 deletions

View File

@@ -653,6 +653,22 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
fetchUnreadCounts(for: webFeeds, completion: completion)
}
public func fetchUnreadArticlesBetween(limit: Int?, before: Date?, after: Date?) throws -> Set<Article> {
return try fetchUnreadArticlesBetween(forContainer: self, limit: limit, before: before, after: after)
}
public func fetchUnreadArticlesBetween(folder: Folder, limit: Int?, before: Date?, after: Date?) throws -> Set<Article> {
return try fetchUnreadArticlesBetween(forContainer: folder, limit: limit, before: before, after: after)
}
public func fetchUnreadArticlesBetween(webFeeds: Set<WebFeed>, limit: Int?, before: Date?, after: Date?) throws -> Set<Article> {
return try fetchUnreadArticlesBetween(feeds: webFeeds, limit: limit, before: before, after: after)
}
public func fetchArticlesBetween(articleIDs: Set<String>, before: Date?, after: Date?) throws -> Set<Article> {
return try database.fetchArticlesBetween(articleIDs: articleIDs, before: before, after: after)
}
public func fetchArticles(_ fetchType: FetchType) throws -> Set<Article> {
switch fetchType {
case .starred(let limit):
@@ -1041,10 +1057,6 @@ private extension Account {
return try fetchUnreadArticles(forContainer: self, limit: limit)
}
func fetchUnreadArticlesBetween(limit: Int?, before: Date?, after: Date?) throws -> Set<Article> {
return try fetchUnreadArticlesBetween(forContainer: self, limit: limit, before: before, after: after)
}
func fetchUnreadArticlesAsync(limit: Int?, _ completion: @escaping ArticleSetResultBlock) {
fetchUnreadArticlesAsync(forContainer: self, limit: limit, completion)
}
@@ -1157,13 +1169,11 @@ private extension Account {
func fetchUnreadArticlesBetween(forContainer container: Container, limit: Int?, before: Date?, after: Date?) throws -> Set<Article> {
let feeds = container.flattenedWebFeeds()
let articles = try database.fetchUnreadArticlesBetween(feeds.webFeedIDs(), limit, before, after)
// We don't validate limit queries because they, by definition, won't correctly match the
// complete unread state for the given container.
if limit == nil {
validateUnreadCountsAfterFetchingUnreadArticles(feeds, articles)
}
return articles
}
func fetchUnreadArticlesBetween(feeds: Set<WebFeed>, limit: Int?, before: Date?, after: Date?) throws -> Set<Article> {
let articles = try database.fetchUnreadArticlesBetween(feeds.webFeedIDs(), limit, before, after)
return articles
}

View File

@@ -396,6 +396,16 @@ public final class AccountManager: UnreadCountProvider {
}
}
}
public func fetchUnreadArticlesBetween(limit: Int? = nil, before: Date? = nil, after: Date? = nil) throws -> Set<Article> {
precondition(Thread.isMainThread)
var articles = Set<Article>()
for account in activeAccounts {
articles.formUnion(try account.fetchUnreadArticlesBetween(limit: limit, before: before, after: after))
}
return articles
}
// MARK: - Fetching Article Counts

View File

@@ -37,9 +37,9 @@ extension WebFeed: ArticleFetcher {
public func fetchUnreadArticles() throws -> Set<Article> {
return try fetchArticles().unreadArticles()
}
public func fetchUnreadArticlesBetween(before: Date? = nil, after: Date? = nil) throws -> Set<Article> {
return try fetchArticles().unreadArticlesBetween(before: before, after: after)
return try account?.fetchUnreadArticlesBetween(webFeeds: [self], limit: nil, before: before, after: after) ?? Set<Article>()
}
public func fetchUnreadArticlesAsync(_ completion: @escaping ArticleSetResultBlock) {
@@ -87,7 +87,11 @@ extension Folder: ArticleFetcher {
}
public func fetchUnreadArticlesBetween(before: Date? = nil, after: Date? = nil) throws -> Set<Article> {
return try fetchArticles().unreadArticlesBetween(before: before, after: after)
guard let account = account else {
assertionFailure("Expected folder.account, but got nil.")
return Set<Article>()
}
return try account.fetchUnreadArticlesBetween(folder: self, limit: nil, before: before, after: after)
}
public func fetchUnreadArticlesAsync(_ completion: @escaping ArticleSetResultBlock) {

View File

@@ -33,7 +33,7 @@ public struct SingleArticleFetcher: ArticleFetcher {
}
public func fetchUnreadArticlesBetween(before: Date? = nil, after: Date? = nil) throws -> Set<Article> {
return try account.fetchArticles(.articleIDs(Set([articleID])))
return try account.fetchArticlesBetween(articleIDs: Set([articleID]), before: before, after: after)
}
public func fetchUnreadArticlesAsync(_ completion: @escaping ArticleSetResultBlock) {