mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Working implementations
This commit is contained in:
@@ -106,6 +106,10 @@ public final class ArticlesDatabase {
|
||||
return try articlesTable.fetchUnreadArticles(webFeedIDs, limit)
|
||||
}
|
||||
|
||||
public func fetchArticlesBetween(articleIDs: Set<String>, before: Date?, after: Date?) throws -> Set<Article> {
|
||||
return try articlesTable.fetchArticlesBetween(articleIDs: articleIDs, before: before, after: after)
|
||||
}
|
||||
|
||||
public func fetchUnreadArticlesBetween(_ webFeedIDs: Set<String>, _ limit: Int?, _ before: Date?, _ after: Date?) throws -> Set<Article> {
|
||||
return try articlesTable.fetchUnreadArticlesBetween(webFeedIDs, limit, before, after)
|
||||
}
|
||||
|
||||
@@ -70,12 +70,16 @@ final class ArticlesTable: DatabaseTable {
|
||||
return try fetchArticles{ self.fetchArticles(articleIDs: articleIDs, $0) }
|
||||
}
|
||||
|
||||
func fetchArticlesBetween(articleIDs: Set<String>, before: Date?, after: Date?) throws -> Set<Article> {
|
||||
return try fetchArticles{ self.fetchArticlesBetween(articleIDs: articleIDs, before: before, after: after, $0) }
|
||||
}
|
||||
|
||||
func fetchArticlesAsync(articleIDs: Set<String>, _ completion: @escaping ArticleSetResultBlock) {
|
||||
return fetchArticlesAsync({ self.fetchArticles(articleIDs: articleIDs, $0) }, completion)
|
||||
}
|
||||
|
||||
// MARK: - Fetching Unread Articles
|
||||
|
||||
|
||||
func fetchUnreadArticles(_ webFeedIDs: Set<String>, _ limit: Int?) throws -> Set<Article> {
|
||||
return try fetchArticles{ self.fetchUnreadArticles(webFeedIDs, limit, $0) }
|
||||
}
|
||||
@@ -854,15 +858,22 @@ private extension ArticlesTable {
|
||||
if webFeedIDs.isEmpty {
|
||||
return Set<Article>()
|
||||
}
|
||||
let parameters = webFeedIDs.map { $0 as AnyObject }
|
||||
var parameters = webFeedIDs.map { $0 as AnyObject }
|
||||
|
||||
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(webFeedIDs.count))!
|
||||
var whereClause = "feedID in \(placeholders) and read=0"
|
||||
|
||||
if let before = before {
|
||||
whereClause.append(" and (datePublished < ? or (datePublished is null and dateArrived < ?))")
|
||||
parameters = parameters + [before as AnyObject, before as AnyObject]
|
||||
}
|
||||
if let after = after {
|
||||
whereClause.append(" and (datePublished > ? or (datePublished is null and dateArrived > ?))")
|
||||
parameters = parameters + [after as AnyObject, after as AnyObject]
|
||||
}
|
||||
if let limit = limit {
|
||||
whereClause.append(" order by coalesce(datePublished, dateModified, dateArrived) desc limit \(limit)")
|
||||
}
|
||||
if let before = before {
|
||||
whereClause.append(" and dateArrived <= \(before)")
|
||||
}
|
||||
return fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters)
|
||||
}
|
||||
|
||||
@@ -880,6 +891,26 @@ private extension ArticlesTable {
|
||||
return fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters)
|
||||
}
|
||||
|
||||
func fetchArticlesBetween(articleIDs: Set<String>, before: Date?, after: Date?, _ database: FMDatabase) -> Set<Article> {
|
||||
if articleIDs.isEmpty {
|
||||
return Set<Article>()
|
||||
}
|
||||
var parameters = articleIDs.map { $0 as AnyObject }
|
||||
let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(articleIDs.count))!
|
||||
var whereClause = "articleID in \(placeholders)"
|
||||
|
||||
if let before = before {
|
||||
whereClause.append(" and (datePublished < ? or (datePublished is null and dateArrived < ?))")
|
||||
parameters = parameters + [before as AnyObject, before as AnyObject]
|
||||
}
|
||||
if let after = after {
|
||||
whereClause.append(" and (datePublished > ? or (datePublished is null and dateArrived > ?))")
|
||||
parameters = parameters + [after as AnyObject, after as AnyObject]
|
||||
}
|
||||
|
||||
return fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters)
|
||||
}
|
||||
|
||||
func fetchArticlesSince(_ webFeedIDs: Set<String>, _ cutoffDate: Date, _ limit: Int?, _ 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 > ?)
|
||||
//
|
||||
|
||||
@@ -166,41 +166,6 @@ final class StatusesTable: DatabaseTable {
|
||||
}
|
||||
}
|
||||
|
||||
func fetchArticleIDsArrivedBetweenDates(beforeDate: Date?, afterDate: Date?, completion: @escaping ArticleIDsCompletionBlock) {
|
||||
queue.runInDatabase { databaseResult in
|
||||
|
||||
var error: DatabaseError?
|
||||
var articleIDs = Set<String>()
|
||||
|
||||
var sql = "select artcileID from statuses s"
|
||||
|
||||
func makeDatabaseCall(_ database: FMDatabase) {
|
||||
let sql = "select articleID from statuses s where (starred=1 or dateArrived>?) and not exists (select 1 from articles a where a.articleID = s.articleID);"
|
||||
if let resultSet = database.executeQuery(sql, withArgumentsIn: [cutoffDate]) {
|
||||
articleIDs = resultSet.mapToSet(self.articleIDWithRow)
|
||||
}
|
||||
}
|
||||
|
||||
switch databaseResult {
|
||||
case .success(let database):
|
||||
makeDatabaseCall(database)
|
||||
case .failure(let databaseError):
|
||||
error = databaseError
|
||||
}
|
||||
|
||||
if let error = error {
|
||||
DispatchQueue.main.async {
|
||||
completion(.failure(error))
|
||||
}
|
||||
}
|
||||
else {
|
||||
DispatchQueue.main.async {
|
||||
completion(.success(articleIDs))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func fetchArticleIDs(_ sql: String) throws -> Set<String> {
|
||||
var error: DatabaseError?
|
||||
var articleIDs = Set<String>()
|
||||
|
||||
Reference in New Issue
Block a user