diff --git a/Evergreen/SmartFeeds/TodayFeedDelegate.swift b/Evergreen/SmartFeeds/TodayFeedDelegate.swift index 3820ba695..9e74bca7c 100644 --- a/Evergreen/SmartFeeds/TodayFeedDelegate.swift +++ b/Evergreen/SmartFeeds/TodayFeedDelegate.swift @@ -23,8 +23,11 @@ struct TodayFeedDelegate: SmartFeedDelegate { func fetchArticles() -> Set
{ - // TODO - return Set
() + var articles = Set
() + for account in AccountManager.shared.accounts { + articles.formUnion(account.fetchTodayArticles()) + } + return articles } func fetchUnreadArticles() -> Set
{ diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 909e3f11d..44c334222 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -359,6 +359,11 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, return articles } + public func fetchTodayArticles() -> Set
{ + + return database.fetchTodayArticles(for: flattenedFeeds()) + } + private func validateUnreadCount(_ feed: Feed, _ articles: Set
) { // articles must contain all the unread articles for the feed. diff --git a/Frameworks/Database/ArticlesTable.swift b/Frameworks/Database/ArticlesTable.swift index 620978c24..8bc0aeccb 100644 --- a/Frameworks/Database/ArticlesTable.swift +++ b/Frameworks/Database/ArticlesTable.swift @@ -72,6 +72,11 @@ final class ArticlesTable: DatabaseTable { return fetchUnreadArticles(feeds.feedIDs()) } + public func fetchTodayArticles(for feeds: Set) -> Set
{ + + return fetchTodayArticles(feeds.feedIDs()) + } + // MARK: Updating func update(_ feed: Feed, _ parsedFeed: ParsedFeed, _ completion: @escaping UpdateArticlesWithFeedCompletionBlock) { @@ -328,8 +333,14 @@ private extension ArticlesTable { // * Must not be deleted. // * Must be either 1) starred or 2) dateArrived must be newer than cutoff date. - let sql = withLimits ? "select * from articles natural join statuses where \(whereClause) and userDeleted=0 and (starred=1 or dateArrived>?);" : "select * from articles natural join statuses where \(whereClause);" - return articlesWithSQL(sql, parameters + [articleCutoffDate as AnyObject], database) + if withLimits { + let sql = "select * from articles natural join statuses where \(whereClause) and userDeleted=0 and (starred=1 or dateArrived>?);" + return articlesWithSQL(sql, parameters + [articleCutoffDate as AnyObject], database) + } + else { + let sql = "select * from articles natural join statuses where \(whereClause);" + return articlesWithSQL(sql, parameters, database) + } } func fetchUnreadCount(_ feedID: String, _ database: FMDatabase) -> Int { @@ -369,6 +380,31 @@ private extension ArticlesTable { return articles } + func fetchTodayArticles(_ feedIDs: Set) -> Set
{ + + if feedIDs.isEmpty { + return Set
() + } + + var articles = Set
() + + queue.fetchSync { (database) in + + // 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. + + let startOfToday = NSCalendar.startOfToday() + let parameters = feedIDs.map { $0 as AnyObject } + [startOfToday as AnyObject, startOfToday 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" +// let whereClause = "feedID in \(placeholders) and datePublished > ? and userDeleted = 0" + articles = self.fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters, withLimits: false) + } + + return articles + } + func articlesWithSQL(_ sql: String, _ parameters: [AnyObject], _ database: FMDatabase) -> Set
{ guard let resultSet = database.executeQuery(sql, withArgumentsIn: parameters) else { diff --git a/Frameworks/Database/Database.swift b/Frameworks/Database/Database.swift index 42ea758de..9eb372c1c 100644 --- a/Frameworks/Database/Database.swift +++ b/Frameworks/Database/Database.swift @@ -57,6 +57,11 @@ public final class Database { return articlesTable.fetchUnreadArticles(for: feeds) } + public func fetchTodayArticles(for feeds: Set) -> Set
{ + + return articlesTable.fetchTodayArticles(for: feeds) + } + // MARK: - Unread Counts public func fetchUnreadCounts(for feeds: Set, _ completion: @escaping UnreadCountCompletionBlock) { diff --git a/Frameworks/Database/Extensions/Article+Database.swift b/Frameworks/Database/Extensions/Article+Database.swift index bd61718f1..b92f0f1b0 100644 --- a/Frameworks/Database/Extensions/Article+Database.swift +++ b/Frameworks/Database/Extensions/Article+Database.swift @@ -23,7 +23,7 @@ extension Article { let authors = Author.authorsWithParsedAuthors(parsedItem.authors) let attachments = Attachment.attachmentsWithParsedAttachments(parsedItem.attachments) - self.init(accountID: accountID, articleID: parsedItem.syncServiceID, feedID: feedID, uniqueID: parsedItem.uniqueID, title: parsedItem.title, contentHTML: parsedItem.contentHTML, contentText: parsedItem.contentText, url: parsedItem.url, externalURL: parsedItem.externalURL, summary: parsedItem.summary, imageURL: parsedItem.imageURL, bannerImageURL: parsedItem.bannerImageURL, datePublished: parsedItem.datePublished, dateModified: parsedItem.dateModified, authors: authors, attachments: attachments, status: status) + self.init(accountID: accountID, articleID: parsedItem.syncServiceID, feedID: feedID, uniqueID: parsedItem.uniqueID, title: parsedItem.title, contentHTML: parsedItem.contentHTML, contentText: parsedItem.contentText, url: parsedItem.url, externalURL: parsedItem.externalURL, summary: parsedItem.summary, imageURL: parsedItem.imageURL, bannerImageURL: parsedItem.bannerImageURL, datePublished: parsedItem.datePublished ?? parsedItem.dateModified, dateModified: parsedItem.dateModified, authors: authors, attachments: attachments, status: status) } private func addPossibleStringChangeWithKeyPath(_ comparisonKeyPath: KeyPath, _ otherArticle: Article, _ key: String, _ dictionary: NSMutableDictionary) {