Working implementations

This commit is contained in:
Bryan Culver
2022-12-07 00:30:19 -05:00
parent 002f3e87fd
commit 35a6cf551b
16 changed files with 319 additions and 103 deletions

View File

@@ -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)
}

View File

@@ -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 > ?)
//

View File

@@ -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>()