Merge branch 'mac-candidate'
This commit is contained in:
commit
4667e533fc
|
@ -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) {
|
||||||
|
|
|
@ -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.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue