diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 92875a79c..74c165694 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -557,8 +557,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, } public func fetchUnreadCountForToday(_ callback: @escaping (Int) -> Void) { - let startOfToday = NSCalendar.startOfToday() - database.fetchUnreadCount(for: flattenedFeeds().feedIDs(), since: startOfToday, callback: callback) + database.fetchUnreadCountForToday(for: flattenedFeeds().feedIDs(), callback: callback) } public func fetchUnreadCountForStarredArticles(_ callback: @escaping (Int) -> Void) { diff --git a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift index 19ba89f6a..40faca001 100644 --- a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift +++ b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift @@ -57,7 +57,7 @@ public final class ArticlesDatabase { } public func fetchTodayArticles(_ feedIDs: Set) -> Set
{ - return articlesTable.fetchTodayArticles(feedIDs) + return articlesTable.fetchArticlesSince(feedIDs, todayCutoffDate()) } public func fetchStarredArticles(_ feedIDs: Set) -> Set
{ @@ -83,7 +83,7 @@ public final class ArticlesDatabase { } public func fetchTodayArticlesAsync(_ feedIDs: Set, _ callback: @escaping ArticleSetBlock) { - articlesTable.fetchTodayArticlesAsync(feedIDs, callback) + articlesTable.fetchArticlesSinceAsync(feedIDs, todayCutoffDate(), callback) } public func fetchedStarredArticlesAsync(_ feedIDs: Set, _ callback: @escaping ArticleSetBlock) { @@ -100,6 +100,10 @@ public final class ArticlesDatabase { articlesTable.fetchUnreadCounts(feedIDs, callback) } + public func fetchUnreadCountForToday(for feedIDs: Set, callback: @escaping (Int) -> Void) { + fetchUnreadCount(for: feedIDs, since: todayCutoffDate(), callback: callback) + } + public func fetchUnreadCount(for feedIDs: Set, since: Date, callback: @escaping (Int) -> Void) { articlesTable.fetchUnreadCount(feedIDs, since, callback) } @@ -164,4 +168,9 @@ private extension ArticlesDatabase { CREATE TRIGGER if not EXISTS articles_after_delete_trigger_delete_search_text after delete on articles begin delete from search where rowid = OLD.searchRowID; end; """ + + func todayCutoffDate() -> Date { + // 28 hours previous. This is used by the Today smart feed, which should not actually empty out at midnight. + return Date(timeIntervalSinceNow: -(60 * 60 * 28)) // This does not need to be more precise. + } } diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index 9b33a3289..444337e20 100644 --- a/Frameworks/ArticlesDatabase/ArticlesTable.swift +++ b/Frameworks/ArticlesDatabase/ArticlesTable.swift @@ -102,23 +102,22 @@ final class ArticlesTable: DatabaseTable { // MARK: - Fetching Today Articles - func fetchTodayArticles(_ feedIDs: Set) -> Set
{ - return fetchArticles{ self.fetchTodayArticles(feedIDs, $0) } + func fetchArticlesSince(_ feedIDs: Set, _ cutoffDate: Date) -> Set
{ + return fetchArticles{ self.fetchArticlesSince(feedIDs, cutoffDate, $0) } } - func fetchTodayArticlesAsync(_ feedIDs: Set, _ callback: @escaping ArticleSetBlock) { - fetchArticlesAsync({ self.fetchTodayArticles(feedIDs, $0) }, callback) + func fetchArticlesSinceAsync(_ feedIDs: Set, _ cutoffDate: Date, _ callback: @escaping ArticleSetBlock) { + fetchArticlesAsync({ self.fetchArticlesSince(feedIDs, cutoffDate, $0) }, callback) } - private func fetchTodayArticles(_ feedIDs: Set, _ database: FMDatabase) -> Set
{ + private func fetchArticlesSince(_ feedIDs: Set, _ cutoffDate: Date, _ database: FMDatabase) -> Set
{ // select * from articles natural join statuses where feedID in ('http://ranchero.com/xml/rss.xml') and (datePublished > ? || (datePublished is null and dateArrived > ?) // // datePublished may be nil, so we fall back to dateArrived. if feedIDs.isEmpty { return Set
() } - let startOfToday = NSCalendar.startOfToday() - let parameters = feedIDs.map { $0 as AnyObject } + [startOfToday as AnyObject, startOfToday as AnyObject] + let parameters = feedIDs.map { $0 as AnyObject } + [cutoffDate as AnyObject, cutoffDate as AnyObject] let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(feedIDs.count))! let whereClause = "feedID in \(placeholders) and (datePublished > ? or (datePublished is null and dateArrived > ?)) and userDeleted = 0" return fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters, withLimits: false)