diff --git a/Frameworks/Database/ArticlesTable.swift b/Frameworks/Database/ArticlesTable.swift index 595e5e01c..041d68faf 100644 --- a/Frameworks/Database/ArticlesTable.swift +++ b/Frameworks/Database/ArticlesTable.swift @@ -61,15 +61,13 @@ final class ArticlesTable: DatabaseTable { func fetchArticles(_ feed: Feed) -> Set
{ let feedID = feed.feedID - - var fetchedArticles = Set
() + var articles = Set
() queue.fetchSync { (database: FMDatabase!) -> Void in - - fetchedArticles = self.fetchArticlesForFeedID(feedID, database: database) + articles = self.fetchArticlesForFeedID(feedID, database: database) } - return articleCache.uniquedArticles(fetchedArticles) + return articleCache.uniquedArticles(articles) } func fetchArticlesAsync(_ feed: Feed, _ resultBlock: @escaping ArticleResultBlock) { @@ -87,9 +85,9 @@ final class ArticlesTable: DatabaseTable { } } - func fetchUnreadArticles(_ feeds: Set) -> Set
{ - - return Set
() // TODO + func fetchUnreadArticles(for feeds: Set) -> Set
{ + + return fetchUnreadArticles(feeds.feedIDs()) } // MARK: Updating @@ -184,21 +182,45 @@ private extension ArticlesTable { return articles } - func fetchArticlesWithWhereClause(_ database: FMDatabase, whereClause: String, parameters: [AnyObject]?) -> Set
{ + func fetchArticlesWithWhereClause(_ database: FMDatabase, whereClause: String, parameters: [AnyObject]) -> Set
{ let sql = "select * from articles natural join statuses where \(whereClause);" - - if let resultSet = database.executeQuery(sql, withArgumentsIn: parameters) { - return articlesWithResultSet(resultSet, database) - } - - return Set
() + return articlesWithSQL(sql, parameters, database) } func fetchArticlesForFeedID(_ feedID: String, database: FMDatabase) -> Set
{ return fetchArticlesWithWhereClause(database, whereClause: "articles.feedID = ?", parameters: [feedID as AnyObject]) } + + func fetchUnreadArticles(_ 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 read=0 + + let parameters = feedIDs.map { $0 as AnyObject } + let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(feedIDs.count))! + let whereClause = "feedID in \(placeholders) and read=0" + articles = self.fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters) + } + + return articleCache.uniquedArticles(articles) + } + + func articlesWithSQL(_ sql: String, _ parameters: [AnyObject], _ database: FMDatabase) -> Set
{ + + guard let resultSet = database.executeQuery(sql, withArgumentsIn: parameters) else { + return Set
() + } + return articlesWithResultSet(resultSet, database) + } } // MARK: - diff --git a/Frameworks/Database/Database.swift b/Frameworks/Database/Database.swift index e1ee02480..ca5d2a863 100644 --- a/Frameworks/Database/Database.swift +++ b/Frameworks/Database/Database.swift @@ -55,7 +55,7 @@ public final class Database { public func fetchUnreadArticles(for folder: Folder) -> Set
{ - return articlesTable.fetchUnreadArticles(folder.flattenedFeeds()) + return articlesTable.fetchUnreadArticles(for: folder.flattenedFeeds()) } // MARK: - Unread Counts