Merge branch 'mac-candidate'

This commit is contained in:
Brent Simmons 2019-07-24 09:27:34 -07:00
commit 4667e533fc
3 changed files with 18 additions and 11 deletions

View File

@ -557,8 +557,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
} }
public func fetchUnreadCountForToday(_ callback: @escaping (Int) -> Void) { public func fetchUnreadCountForToday(_ callback: @escaping (Int) -> Void) {
let startOfToday = NSCalendar.startOfToday() database.fetchUnreadCountForToday(for: flattenedFeeds().feedIDs(), callback: callback)
database.fetchUnreadCount(for: flattenedFeeds().feedIDs(), since: startOfToday, callback: callback)
} }
public func fetchUnreadCountForStarredArticles(_ callback: @escaping (Int) -> Void) { public func fetchUnreadCountForStarredArticles(_ callback: @escaping (Int) -> Void) {

View File

@ -57,7 +57,7 @@ public final class ArticlesDatabase {
} }
public func fetchTodayArticles(_ feedIDs: Set<String>) -> Set<Article> { public func fetchTodayArticles(_ feedIDs: Set<String>) -> Set<Article> {
return articlesTable.fetchTodayArticles(feedIDs) return articlesTable.fetchArticlesSince(feedIDs, todayCutoffDate())
} }
public func fetchStarredArticles(_ feedIDs: Set<String>) -> Set<Article> { public func fetchStarredArticles(_ feedIDs: Set<String>) -> Set<Article> {
@ -83,7 +83,7 @@ public final class ArticlesDatabase {
} }
public func fetchTodayArticlesAsync(_ feedIDs: Set<String>, _ callback: @escaping ArticleSetBlock) { public func fetchTodayArticlesAsync(_ feedIDs: Set<String>, _ callback: @escaping ArticleSetBlock) {
articlesTable.fetchTodayArticlesAsync(feedIDs, callback) articlesTable.fetchArticlesSinceAsync(feedIDs, todayCutoffDate(), callback)
} }
public func fetchedStarredArticlesAsync(_ feedIDs: Set<String>, _ callback: @escaping ArticleSetBlock) { public func fetchedStarredArticlesAsync(_ feedIDs: Set<String>, _ callback: @escaping ArticleSetBlock) {
@ -100,6 +100,10 @@ public final class ArticlesDatabase {
articlesTable.fetchUnreadCounts(feedIDs, callback) articlesTable.fetchUnreadCounts(feedIDs, callback)
} }
public func fetchUnreadCountForToday(for feedIDs: Set<String>, callback: @escaping (Int) -> Void) {
fetchUnreadCount(for: feedIDs, since: todayCutoffDate(), callback: callback)
}
public func fetchUnreadCount(for feedIDs: Set<String>, since: Date, callback: @escaping (Int) -> Void) { public func fetchUnreadCount(for feedIDs: Set<String>, since: Date, callback: @escaping (Int) -> Void) {
articlesTable.fetchUnreadCount(feedIDs, since, callback) 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; 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.
}
} }

View File

@ -102,23 +102,22 @@ final class ArticlesTable: DatabaseTable {
// MARK: - Fetching Today Articles // MARK: - Fetching Today Articles
func fetchTodayArticles(_ feedIDs: Set<String>) -> Set<Article> { func fetchArticlesSince(_ feedIDs: Set<String>, _ cutoffDate: Date) -> Set<Article> {
return fetchArticles{ self.fetchTodayArticles(feedIDs, $0) } return fetchArticles{ self.fetchArticlesSince(feedIDs, cutoffDate, $0) }
} }
func fetchTodayArticlesAsync(_ feedIDs: Set<String>, _ callback: @escaping ArticleSetBlock) { func fetchArticlesSinceAsync(_ feedIDs: Set<String>, _ cutoffDate: Date, _ callback: @escaping ArticleSetBlock) {
fetchArticlesAsync({ self.fetchTodayArticles(feedIDs, $0) }, callback) fetchArticlesAsync({ self.fetchArticlesSince(feedIDs, cutoffDate, $0) }, callback)
} }
private func fetchTodayArticles(_ feedIDs: Set<String>, _ database: FMDatabase) -> Set<Article> { private func fetchArticlesSince(_ feedIDs: Set<String>, _ cutoffDate: Date, _ database: FMDatabase) -> Set<Article> {
// select * from articles natural join statuses where feedID in ('http://ranchero.com/xml/rss.xml') and (datePublished > ? || (datePublished is null and dateArrived > ?) // 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. // datePublished may be nil, so we fall back to dateArrived.
if feedIDs.isEmpty { if feedIDs.isEmpty {
return Set<Article>() return Set<Article>()
} }
let startOfToday = NSCalendar.startOfToday() let parameters = feedIDs.map { $0 as AnyObject } + [cutoffDate as AnyObject, cutoffDate as AnyObject]
let parameters = feedIDs.map { $0 as AnyObject } + [startOfToday as AnyObject, startOfToday as AnyObject]
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(feedIDs.count))! 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" 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) return fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters, withLimits: false)