Fix lint issues.

This commit is contained in:
Brent Simmons 2025-01-22 22:08:12 -08:00
parent 03e9bbff34
commit 962d5fa45c
14 changed files with 120 additions and 128 deletions

View File

@ -9,13 +9,13 @@ let package = Package(
.library( .library(
name: "ArticlesDatabase", name: "ArticlesDatabase",
type: .dynamic, type: .dynamic,
targets: ["ArticlesDatabase"]), targets: ["ArticlesDatabase"])
], ],
dependencies: [ dependencies: [
.package(path: "../RSDatabase"), .package(path: "../RSDatabase"),
.package(path: "../Parser"), .package(path: "../Parser"),
.package(path: "../RSCore"), .package(path: "../RSCore"),
.package(path: "../Articles"), .package(path: "../Articles")
], ],
targets: [ targets: [
.target( .target(
@ -24,9 +24,9 @@ let package = Package(
"RSCore", "RSCore",
"RSDatabase", "RSDatabase",
"Parser", "Parser",
"Articles", "Articles"
], ],
swiftSettings: [.unsafeFlags(["-warnings-as-errors"])] swiftSettings: [.unsafeFlags(["-warnings-as-errors"])]
), )
] ]
) )

View File

@ -18,7 +18,7 @@ import Articles
// Main thread only. // Main thread only.
public typealias UnreadCountDictionary = [String: Int] // feedID: unreadCount public typealias UnreadCountDictionary = [String: Int] // feedID: unreadCount
public typealias UnreadCountDictionaryCompletionResult = Result<UnreadCountDictionary,DatabaseError> public typealias UnreadCountDictionaryCompletionResult = Result<UnreadCountDictionary, DatabaseError>
public typealias UnreadCountDictionaryCompletionBlock = (UnreadCountDictionaryCompletionResult) -> Void public typealias UnreadCountDictionaryCompletionBlock = (UnreadCountDictionaryCompletionResult) -> Void
public typealias SingleUnreadCountResult = Result<Int, DatabaseError> public typealias SingleUnreadCountResult = Result<Int, DatabaseError>

View File

@ -49,7 +49,7 @@ final class ArticlesTable: DatabaseTable {
// MARK: - Fetching Articles for Feed // MARK: - Fetching Articles for Feed
func fetchArticles(_ feedID: String) throws -> Set<Article> { func fetchArticles(_ feedID: String) throws -> Set<Article> {
return try fetchArticles{ self.fetchArticlesForFeedID(feedID, $0) } return try fetchArticles { self.fetchArticlesForFeedID(feedID, $0) }
} }
func fetchArticlesAsync(_ feedID: String, _ completion: @escaping ArticleSetResultBlock) { func fetchArticlesAsync(_ feedID: String, _ completion: @escaping ArticleSetResultBlock) {
@ -57,7 +57,7 @@ final class ArticlesTable: DatabaseTable {
} }
func fetchArticles(_ feedIDs: Set<String>) throws -> Set<Article> { func fetchArticles(_ feedIDs: Set<String>) throws -> Set<Article> {
return try fetchArticles{ self.fetchArticles(feedIDs, $0) } return try fetchArticles { self.fetchArticles(feedIDs, $0) }
} }
func fetchArticlesAsync(_ feedIDs: Set<String>, _ completion: @escaping ArticleSetResultBlock) { func fetchArticlesAsync(_ feedIDs: Set<String>, _ completion: @escaping ArticleSetResultBlock) {
@ -67,7 +67,7 @@ final class ArticlesTable: DatabaseTable {
// MARK: - Fetching Articles by articleID // MARK: - Fetching Articles by articleID
func fetchArticles(articleIDs: Set<String>) throws -> Set<Article> { func fetchArticles(articleIDs: Set<String>) throws -> Set<Article> {
return try fetchArticles{ self.fetchArticles(articleIDs: articleIDs, $0) } return try fetchArticles { self.fetchArticles(articleIDs: articleIDs, $0) }
} }
func fetchArticlesAsync(articleIDs: Set<String>, _ completion: @escaping ArticleSetResultBlock) { func fetchArticlesAsync(articleIDs: Set<String>, _ completion: @escaping ArticleSetResultBlock) {
@ -77,7 +77,7 @@ final class ArticlesTable: DatabaseTable {
// MARK: - Fetching Unread Articles // MARK: - Fetching Unread Articles
func fetchUnreadArticles(_ feedIDs: Set<String>, _ limit: Int?) throws -> Set<Article> { func fetchUnreadArticles(_ feedIDs: Set<String>, _ limit: Int?) throws -> Set<Article> {
return try fetchArticles{ self.fetchUnreadArticles(feedIDs, limit, $0) } return try fetchArticles { self.fetchUnreadArticles(feedIDs, limit, $0) }
} }
func fetchUnreadArticlesAsync(_ feedIDs: Set<String>, _ limit: Int?, _ completion: @escaping ArticleSetResultBlock) { func fetchUnreadArticlesAsync(_ feedIDs: Set<String>, _ limit: Int?, _ completion: @escaping ArticleSetResultBlock) {
@ -87,7 +87,7 @@ final class ArticlesTable: DatabaseTable {
// MARK: - Fetching Today Articles // MARK: - Fetching Today Articles
func fetchArticlesSince(_ feedIDs: Set<String>, _ cutoffDate: Date, _ limit: Int?) throws -> Set<Article> { func fetchArticlesSince(_ feedIDs: Set<String>, _ cutoffDate: Date, _ limit: Int?) throws -> Set<Article> {
return try fetchArticles{ self.fetchArticlesSince(feedIDs, cutoffDate, limit, $0) } return try fetchArticles { self.fetchArticlesSince(feedIDs, cutoffDate, limit, $0) }
} }
func fetchArticlesSinceAsync(_ feedIDs: Set<String>, _ cutoffDate: Date, _ limit: Int?, _ completion: @escaping ArticleSetResultBlock) { func fetchArticlesSinceAsync(_ feedIDs: Set<String>, _ cutoffDate: Date, _ limit: Int?, _ completion: @escaping ArticleSetResultBlock) {
@ -97,7 +97,7 @@ final class ArticlesTable: DatabaseTable {
// MARK: - Fetching Starred Articles // MARK: - Fetching Starred Articles
func fetchStarredArticles(_ feedIDs: Set<String>, _ limit: Int?) throws -> Set<Article> { func fetchStarredArticles(_ feedIDs: Set<String>, _ limit: Int?) throws -> Set<Article> {
return try fetchArticles{ self.fetchStarredArticles(feedIDs, limit, $0) } return try fetchArticles { self.fetchStarredArticles(feedIDs, limit, $0) }
} }
func fetchStarredArticlesAsync(_ feedIDs: Set<String>, _ limit: Int?, _ completion: @escaping ArticleSetResultBlock) { func fetchStarredArticlesAsync(_ feedIDs: Set<String>, _ limit: Int?, _ completion: @escaping ArticleSetResultBlock) {
@ -105,14 +105,14 @@ final class ArticlesTable: DatabaseTable {
} }
func fetchStarredArticlesCount(_ feedIDs: Set<String>) throws -> Int { func fetchStarredArticlesCount(_ feedIDs: Set<String>) throws -> Int {
return try fetchArticlesCount{ self.fetchStarredArticlesCount(feedIDs, $0) } return try fetchArticlesCount { self.fetchStarredArticlesCount(feedIDs, $0) }
} }
// MARK: - Fetching Search Articles // MARK: - Fetching Search Articles
func fetchArticlesMatching(_ searchString: String) throws -> Set<Article> { func fetchArticlesMatching(_ searchString: String) throws -> Set<Article> {
var articles: Set<Article> = Set<Article>() var articles: Set<Article> = Set<Article>()
var error: DatabaseError? = nil var error: DatabaseError?
queue.runInDatabaseSync { (databaseResult) in queue.runInDatabaseSync { (databaseResult) in
switch databaseResult { switch databaseResult {
@ -131,13 +131,13 @@ final class ArticlesTable: DatabaseTable {
func fetchArticlesMatching(_ searchString: String, _ feedIDs: Set<String>) throws -> Set<Article> { func fetchArticlesMatching(_ searchString: String, _ feedIDs: Set<String>) throws -> Set<Article> {
var articles = try fetchArticlesMatching(searchString) var articles = try fetchArticlesMatching(searchString)
articles = articles.filter{ feedIDs.contains($0.feedID) } articles = articles.filter { feedIDs.contains($0.feedID) }
return articles return articles
} }
func fetchArticlesMatchingWithArticleIDs(_ searchString: String, _ articleIDs: Set<String>) throws -> Set<Article> { func fetchArticlesMatchingWithArticleIDs(_ searchString: String, _ articleIDs: Set<String>) throws -> Set<Article> {
var articles = try fetchArticlesMatching(searchString) var articles = try fetchArticlesMatching(searchString)
articles = articles.filter{ articleIDs.contains($0.articleID) } articles = articles.filter { articleIDs.contains($0.articleID) }
return articles return articles
} }
@ -182,7 +182,7 @@ final class ArticlesTable: DatabaseTable {
let authorsNames = row.string(forColumn: DatabaseKey.authors) let authorsNames = row.string(forColumn: DatabaseKey.authors)
let searchRowIDObject = row.object(forColumnName: DatabaseKey.searchRowID) let searchRowIDObject = row.object(forColumnName: DatabaseKey.searchRowID)
var searchRowID: Int? = nil var searchRowID: Int?
if searchRowIDObject != nil && !(searchRowIDObject is NSNull) { if searchRowIDObject != nil && !(searchRowIDObject is NSNull) {
searchRowID = Int(row.longLongInt(forColumn: DatabaseKey.searchRowID)) searchRowID = Int(row.longLongInt(forColumn: DatabaseKey.searchRowID))
} }
@ -217,20 +217,20 @@ final class ArticlesTable: DatabaseTable {
func makeDatabaseCalls(_ database: FMDatabase) { func makeDatabaseCalls(_ database: FMDatabase) {
let articleIDs = parsedItems.articleIDs() let articleIDs = parsedItems.articleIDs()
let (statusesDictionary, _) = self.statusesTable.ensureStatusesForArticleIDs(articleIDs, false, database) //1 let (statusesDictionary, _) = self.statusesTable.ensureStatusesForArticleIDs(articleIDs, false, database) // 1
assert(statusesDictionary.count == articleIDs.count) assert(statusesDictionary.count == articleIDs.count)
let incomingArticles = Article.articlesWithParsedItems(parsedItems, feedID, self.accountID, statusesDictionary) //2 let incomingArticles = Article.articlesWithParsedItems(parsedItems, feedID, self.accountID, statusesDictionary) // 2
if incomingArticles.isEmpty { if incomingArticles.isEmpty {
self.callUpdateArticlesCompletionBlock(nil, nil, nil, completion) self.callUpdateArticlesCompletionBlock(nil, nil, nil, completion)
return return
} }
let fetchedArticles = self.fetchArticlesForFeedID(feedID, database) //4 let fetchedArticles = self.fetchArticlesForFeedID(feedID, database) // 4
let fetchedArticlesDictionary = fetchedArticles.dictionary() let fetchedArticlesDictionary = fetchedArticles.dictionary()
let newArticles = self.findAndSaveNewArticles(incomingArticles, fetchedArticlesDictionary, database) //5 let newArticles = self.findAndSaveNewArticles(incomingArticles, fetchedArticlesDictionary, database) // 5
let updatedArticles = self.findAndSaveUpdatedArticles(incomingArticles, fetchedArticlesDictionary, database) //6 let updatedArticles = self.findAndSaveUpdatedArticles(incomingArticles, fetchedArticlesDictionary, database) // 6
// Articles to delete are 1) not starred and 2) older than 30 days and 3) no longer in feed. // Articles to delete are 1) not starred and 2) older than 30 days and 3) no longer in feed.
let articlesToDelete: Set<Article> let articlesToDelete: Set<Article>
@ -243,7 +243,7 @@ final class ArticlesTable: DatabaseTable {
articlesToDelete = Set<Article>() articlesToDelete = Set<Article>()
} }
self.callUpdateArticlesCompletionBlock(newArticles, updatedArticles, articlesToDelete, completion) //7 self.callUpdateArticlesCompletionBlock(newArticles, updatedArticles, articlesToDelete, completion) // 7
self.addArticlesToCache(newArticles) self.addArticlesToCache(newArticles)
self.addArticlesToCache(updatedArticles) self.addArticlesToCache(updatedArticles)
@ -299,29 +299,29 @@ final class ArticlesTable: DatabaseTable {
articleIDs.formUnion(parsedItems.articleIDs()) articleIDs.formUnion(parsedItems.articleIDs())
} }
let (statusesDictionary, _) = self.statusesTable.ensureStatusesForArticleIDs(articleIDs, read, database) //1 let (statusesDictionary, _) = self.statusesTable.ensureStatusesForArticleIDs(articleIDs, read, database) // 1
assert(statusesDictionary.count == articleIDs.count) assert(statusesDictionary.count == articleIDs.count)
let allIncomingArticles = Article.articlesWithFeedIDsAndItems(feedIDsAndItems, self.accountID, statusesDictionary) //2 let allIncomingArticles = Article.articlesWithFeedIDsAndItems(feedIDsAndItems, self.accountID, statusesDictionary) // 2
if allIncomingArticles.isEmpty { if allIncomingArticles.isEmpty {
self.callUpdateArticlesCompletionBlock(nil, nil, nil, completion) self.callUpdateArticlesCompletionBlock(nil, nil, nil, completion)
return return
} }
let incomingArticles = self.filterIncomingArticles(allIncomingArticles) //3 let incomingArticles = self.filterIncomingArticles(allIncomingArticles) // 3
if incomingArticles.isEmpty { if incomingArticles.isEmpty {
self.callUpdateArticlesCompletionBlock(nil, nil, nil, completion) self.callUpdateArticlesCompletionBlock(nil, nil, nil, completion)
return return
} }
let incomingArticleIDs = incomingArticles.articleIDs() let incomingArticleIDs = incomingArticles.articleIDs()
let fetchedArticles = self.fetchArticles(articleIDs: incomingArticleIDs, database) //4 let fetchedArticles = self.fetchArticles(articleIDs: incomingArticleIDs, database) // 4
let fetchedArticlesDictionary = fetchedArticles.dictionary() let fetchedArticlesDictionary = fetchedArticles.dictionary()
let newArticles = self.findAndSaveNewArticles(incomingArticles, fetchedArticlesDictionary, database) //5 let newArticles = self.findAndSaveNewArticles(incomingArticles, fetchedArticlesDictionary, database) // 5
let updatedArticles = self.findAndSaveUpdatedArticles(incomingArticles, fetchedArticlesDictionary, database) //6 let updatedArticles = self.findAndSaveUpdatedArticles(incomingArticles, fetchedArticlesDictionary, database) // 6
self.callUpdateArticlesCompletionBlock(newArticles, updatedArticles, nil, completion) //7 self.callUpdateArticlesCompletionBlock(newArticles, updatedArticles, nil, completion) // 7
self.addArticlesToCache(newArticles) self.addArticlesToCache(newArticles)
self.addArticlesToCache(updatedArticles) self.addArticlesToCache(updatedArticles)
@ -492,7 +492,7 @@ final class ArticlesTable: DatabaseTable {
queue.runInTransaction { databaseResult in queue.runInTransaction { databaseResult in
switch databaseResult { switch databaseResult {
case .success(let database): case .success(let database):
let _ = self.statusesTable.ensureStatusesForArticleIDs(articleIDs, true, database) _ = self.statusesTable.ensureStatusesForArticleIDs(articleIDs, true, database)
DispatchQueue.main.async { DispatchQueue.main.async {
completion(nil) completion(nil)
} }
@ -514,7 +514,7 @@ final class ArticlesTable: DatabaseTable {
guard let resultSet = database.executeQuery(sql, withArgumentsIn: nil) else { guard let resultSet = database.executeQuery(sql, withArgumentsIn: nil) else {
return return
} }
let articleIDs = resultSet.mapToSet{ $0.string(forColumn: DatabaseKey.articleID) } let articleIDs = resultSet.mapToSet { $0.string(forColumn: DatabaseKey.articleID) }
if articleIDs.isEmpty { if articleIDs.isEmpty {
return return
} }
@ -622,7 +622,7 @@ final class ArticlesTable: DatabaseTable {
guard let resultSet = database.executeQuery(sql, withArgumentsIn: parameters) else { guard let resultSet = database.executeQuery(sql, withArgumentsIn: parameters) else {
return return
} }
let articleIDs = resultSet.mapToSet{ $0.string(forColumn: DatabaseKey.articleID) } let articleIDs = resultSet.mapToSet { $0.string(forColumn: DatabaseKey.articleID) }
if articleIDs.isEmpty { if articleIDs.isEmpty {
return return
} }
@ -645,7 +645,7 @@ private extension ArticlesTable {
private func fetchArticles(_ fetchMethod: @escaping ArticlesFetchMethod) throws -> Set<Article> { private func fetchArticles(_ fetchMethod: @escaping ArticlesFetchMethod) throws -> Set<Article> {
var articles = Set<Article>() var articles = Set<Article>()
var error: DatabaseError? = nil var error: DatabaseError?
queue.runInDatabaseSync { databaseResult in queue.runInDatabaseSync { databaseResult in
switch databaseResult { switch databaseResult {
case .success(let database): case .success(let database):
@ -662,7 +662,7 @@ private extension ArticlesTable {
private func fetchArticlesCount(_ fetchMethod: @escaping ArticlesCountFetchMethod) throws -> Int { private func fetchArticlesCount(_ fetchMethod: @escaping ArticlesCountFetchMethod) throws -> Int {
var articlesCount = 0 var articlesCount = 0
var error: DatabaseError? = nil var error: DatabaseError?
queue.runInDatabaseSync { databaseResult in queue.runInDatabaseSync { databaseResult in
switch databaseResult { switch databaseResult {
case .success(let database): case .success(let database):
@ -784,7 +784,7 @@ private extension ArticlesTable {
func sqliteSearchString(with searchString: String) -> String { func sqliteSearchString(with searchString: String) -> String {
var s = "" var s = ""
searchString.enumerateSubstrings(in: searchString.startIndex..<searchString.endIndex, options: .byWords) { (word, range, enclosingRange, stop) in searchString.enumerateSubstrings(in: searchString.startIndex..<searchString.endIndex, options: .byWords) { (word, _, _, _) in
guard let word = word else { guard let word = word else {
return return
} }
@ -887,13 +887,13 @@ private extension ArticlesTable {
func fetchArticlesMatching(_ searchString: String, _ feedIDs: Set<String>, _ database: FMDatabase) -> Set<Article> { func fetchArticlesMatching(_ searchString: String, _ feedIDs: Set<String>, _ database: FMDatabase) -> Set<Article> {
let articles = fetchArticlesMatching(searchString, database) let articles = fetchArticlesMatching(searchString, database)
// TODO: include the feedIDs in the SQL rather than filtering here. // TODO: include the feedIDs in the SQL rather than filtering here.
return articles.filter{ feedIDs.contains($0.feedID) } return articles.filter { feedIDs.contains($0.feedID) }
} }
func fetchArticlesMatchingWithArticleIDs(_ searchString: String, _ articleIDs: Set<String>, _ database: FMDatabase) -> Set<Article> { func fetchArticlesMatchingWithArticleIDs(_ searchString: String, _ articleIDs: Set<String>, _ database: FMDatabase) -> Set<Article> {
let articles = fetchArticlesMatching(searchString, database) let articles = fetchArticlesMatching(searchString, database)
// TODO: include the articleIDs in the SQL rather than filtering here. // TODO: include the articleIDs in the SQL rather than filtering here.
return articles.filter{ articleIDs.contains($0.articleID) } return articles.filter { articleIDs.contains($0.articleID) }
} }
// MARK: - Saving Parsed Items // MARK: - Saving Parsed Items
@ -912,7 +912,7 @@ private extension ArticlesTable {
return newArticles.isEmpty ? nil : newArticles return newArticles.isEmpty ? nil : newArticles
} }
func findAndSaveNewArticles(_ incomingArticles: Set<Article>, _ fetchedArticlesDictionary: [String: Article], _ database: FMDatabase) -> Set<Article>? { //5 func findAndSaveNewArticles(_ incomingArticles: Set<Article>, _ fetchedArticlesDictionary: [String: Article], _ database: FMDatabase) -> Set<Article>? { // 5
guard let newArticles = findNewArticles(incomingArticles, fetchedArticlesDictionary) else { guard let newArticles = findNewArticles(incomingArticles, fetchedArticlesDictionary) else {
return nil return nil
} }
@ -936,11 +936,11 @@ private extension ArticlesTable {
// MARK: - Updating Existing Articles // MARK: - Updating Existing Articles
func articlesWithRelatedObjectChanges<T>(_ comparisonKeyPath: KeyPath<Article, Set<T>?>, _ updatedArticles: Set<Article>, _ fetchedArticles: [String: Article]) -> Set<Article> { func articlesWithRelatedObjectChanges<T>(_ comparisonKeyPath: KeyPath<Article, Set<T>?>, _ updatedArticles: Set<Article>, _ fetchedArticles: [String: Article]) -> Set<Article> {
return updatedArticles.filter{ (updatedArticle) -> Bool in return updatedArticles.filter { (updatedArticle) -> Bool in
if let fetchedArticle = fetchedArticles[updatedArticle.articleID] { if let fetchedArticle = fetchedArticles[updatedArticle.articleID] {
return updatedArticle[keyPath: comparisonKeyPath] != fetchedArticle[keyPath: comparisonKeyPath] return updatedArticle[keyPath: comparisonKeyPath] != fetchedArticle[keyPath: comparisonKeyPath]
} }
assertionFailure("Expected to find matching fetched article."); assertionFailure("Expected to find matching fetched article.")
return true return true
} }
} }
@ -957,7 +957,7 @@ private extension ArticlesTable {
} }
func findUpdatedArticles(_ incomingArticles: Set<Article>, _ fetchedArticlesDictionary: [String: Article]) -> Set<Article>? { func findUpdatedArticles(_ incomingArticles: Set<Article>, _ fetchedArticlesDictionary: [String: Article]) -> Set<Article>? {
let updatedArticles = incomingArticles.filter{ (incomingArticle) -> Bool in //6 let updatedArticles = incomingArticles.filter { (incomingArticle) -> Bool in // 6
if let existingArticle = fetchedArticlesDictionary[incomingArticle.articleID] { if let existingArticle = fetchedArticlesDictionary[incomingArticle.articleID] {
if existingArticle != incomingArticle { if existingArticle != incomingArticle {
return true return true
@ -969,7 +969,7 @@ private extension ArticlesTable {
return updatedArticles.isEmpty ? nil : updatedArticles return updatedArticles.isEmpty ? nil : updatedArticles
} }
func findAndSaveUpdatedArticles(_ incomingArticles: Set<Article>, _ fetchedArticlesDictionary: [String: Article], _ database: FMDatabase) -> Set<Article>? { //6 func findAndSaveUpdatedArticles(_ incomingArticles: Set<Article>, _ fetchedArticlesDictionary: [String: Article], _ database: FMDatabase) -> Set<Article>? { // 6
guard let updatedArticles = findUpdatedArticles(incomingArticles, fetchedArticlesDictionary) else { guard let updatedArticles = findUpdatedArticles(incomingArticles, fetchedArticlesDictionary) else {
return nil return nil
} }
@ -977,7 +977,6 @@ private extension ArticlesTable {
return updatedArticles return updatedArticles
} }
func saveUpdatedArticles(_ updatedArticles: Set<Article>, _ fetchedArticles: [String: Article], _ database: FMDatabase) { func saveUpdatedArticles(_ updatedArticles: Set<Article>, _ fetchedArticles: [String: Article], _ database: FMDatabase) {
saveUpdatedRelatedObjects(updatedArticles, fetchedArticles, database) saveUpdatedRelatedObjects(updatedArticles, fetchedArticles, database)
@ -991,7 +990,7 @@ private extension ArticlesTable {
// Untested theory: this gets us better performance and less database fragmentation. // Untested theory: this gets us better performance and less database fragmentation.
guard let fetchedArticle = fetchedArticles[updatedArticle.articleID] else { guard let fetchedArticle = fetchedArticles[updatedArticle.articleID] else {
assertionFailure("Expected to find matching fetched article."); assertionFailure("Expected to find matching fetched article.")
saveNewArticles(Set([updatedArticle]), database) saveNewArticles(Set([updatedArticle]), database)
return return
} }
@ -1028,7 +1027,7 @@ private extension ArticlesTable {
func filterIncomingArticles(_ articles: Set<Article>) -> Set<Article> { func filterIncomingArticles(_ articles: Set<Article>) -> Set<Article> {
// Drop Articles that we can ignore. // Drop Articles that we can ignore.
precondition(retentionStyle == .syncSystem) precondition(retentionStyle == .syncSystem)
return Set(articles.filter{ !articleIsIgnorable($0) }) return Set(articles.filter { !articleIsIgnorable($0) })
} }
func removeArticles(_ articleIDs: Set<String>, _ database: FMDatabase) { func removeArticles(_ articleIDs: Set<String>, _ database: FMDatabase) {

View File

@ -17,7 +17,6 @@ import Articles
// CREATE TABLE if not EXISTS authors (authorID TEXT NOT NULL PRIMARY KEY, name TEXT, url TEXT, avatarURL TEXT, emailAddress TEXT); // CREATE TABLE if not EXISTS authors (authorID TEXT NOT NULL PRIMARY KEY, name TEXT, url TEXT, avatarURL TEXT, emailAddress TEXT);
// CREATE TABLE if not EXISTS authorLookup (authorID TEXT NOT NULL, articleID TEXT NOT NULL, PRIMARY KEY(authorID, articleID)); // CREATE TABLE if not EXISTS authorLookup (authorID TEXT NOT NULL, articleID TEXT NOT NULL, PRIMARY KEY(authorID, articleID));
final class AuthorsTable: DatabaseRelatedObjectsTable { final class AuthorsTable: DatabaseRelatedObjectsTable {
let name: String let name: String
@ -37,4 +36,3 @@ final class AuthorsTable: DatabaseRelatedObjectsTable {
return nil return nil
} }
} }

View File

@ -61,7 +61,7 @@ extension Article {
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, datePublished: datePublished, dateModified: dateModified, authors: authors, 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, datePublished: datePublished, dateModified: dateModified, authors: authors, status: status)
} }
private func addPossibleStringChangeWithKeyPath(_ comparisonKeyPath: KeyPath<Article,String?>, _ otherArticle: Article, _ key: String, _ dictionary: inout DatabaseDictionary) { private func addPossibleStringChangeWithKeyPath(_ comparisonKeyPath: KeyPath<Article, String?>, _ otherArticle: Article, _ key: String, _ dictionary: inout DatabaseDictionary) {
if self[keyPath: comparisonKeyPath] != otherArticle[keyPath: comparisonKeyPath] { if self[keyPath: comparisonKeyPath] != otherArticle[keyPath: comparisonKeyPath] {
dictionary[key] = self[keyPath: comparisonKeyPath] ?? "" dictionary[key] = self[keyPath: comparisonKeyPath] ?? ""
} }
@ -132,7 +132,7 @@ extension Article {
static func articlesWithParsedItems(_ parsedItems: Set<ParsedItem>, _ feedID: String, _ accountID: String, _ statusesDictionary: [String: ArticleStatus]) -> Set<Article> { static func articlesWithParsedItems(_ parsedItems: Set<ParsedItem>, _ feedID: String, _ accountID: String, _ statusesDictionary: [String: ArticleStatus]) -> Set<Article> {
let maximumDateAllowed = _maximumDateAllowed() let maximumDateAllowed = _maximumDateAllowed()
return Set(parsedItems.map{ Article(parsedItem: $0, maximumDateAllowed: maximumDateAllowed, accountID: accountID, feedID: feedID, status: statusesDictionary[$0.articleID]!) }) return Set(parsedItems.map { Article(parsedItem: $0, maximumDateAllowed: maximumDateAllowed, accountID: accountID, feedID: feedID, status: statusesDictionary[$0.articleID]!) })
} }
} }
@ -211,7 +211,7 @@ extension Set where Element == Article {
} }
func databaseObjects() -> [DatabaseObject] { func databaseObjects() -> [DatabaseObject] {
return self.map{ $0 as DatabaseObject } return self.map { $0 as DatabaseObject }
} }
func databaseDictionaries() -> [DatabaseDictionary]? { func databaseDictionaries() -> [DatabaseDictionary]? {

View File

@ -32,4 +32,3 @@ extension ArticleStatus: @retroactive DatabaseObject {
return [DatabaseKey.articleID: articleID, DatabaseKey.read: read, DatabaseKey.starred: starred, DatabaseKey.dateArrived: dateArrived] return [DatabaseKey.articleID: articleID, DatabaseKey.read: read, DatabaseKey.starred: starred, DatabaseKey.dateArrived: dateArrived]
} }
} }

View File

@ -63,4 +63,3 @@ extension Author: @retroactive DatabaseObject {
return d return d
} }
} }

View File

@ -117,7 +117,7 @@ final class SearchTable: DatabaseTable {
/// Index new articles. /// Index new articles.
func indexNewArticles(_ articles: Set<Article>, _ database: FMDatabase) { func indexNewArticles(_ articles: Set<Article>, _ database: FMDatabase) {
let articleSearchInfos = Set(articles.map{ ArticleSearchInfo(article: $0) }) let articleSearchInfos = Set(articles.map { ArticleSearchInfo(article: $0) })
performInitialIndexForArticles(articleSearchInfos, database) performInitialIndexForArticles(articleSearchInfos, database)
} }

View File

@ -35,7 +35,7 @@ final class StatusesTable: DatabaseTable {
defer { defer {
if let resultSet = self.selectRowsWhere(key: DatabaseKey.articleID, inValues: Array(articleIDs), in: database) { if let resultSet = self.selectRowsWhere(key: DatabaseKey.articleID, inValues: Array(articleIDs), in: database) {
let fetchedStatuses = resultSet.mapToSet(statusWithRow) let fetchedStatuses = resultSet.mapToSet(statusWithRow)
let fetchedArticleIDs = Set(fetchedStatuses.map{ $0.articleID }) let fetchedArticleIDs = Set(fetchedStatuses.map { $0.articleID })
assert(fetchedArticleIDs == articleIDs) assert(fetchedArticleIDs == articleIDs)
} }
} }
@ -117,7 +117,7 @@ final class StatusesTable: DatabaseTable {
return return
} }
let articleIDs = resultSet.mapToSet{ $0.string(forColumnIndex: 0) } let articleIDs = resultSet.mapToSet { $0.string(forColumnIndex: 0) }
DispatchQueue.main.async { DispatchQueue.main.async {
completion(.success(articleIDs)) completion(.success(articleIDs))
} }
@ -158,8 +158,7 @@ final class StatusesTable: DatabaseTable {
DispatchQueue.main.async { DispatchQueue.main.async {
completion(.failure(error)) completion(.failure(error))
} }
} } else {
else {
DispatchQueue.main.async { DispatchQueue.main.async {
completion(.success(articleIDs)) completion(.success(articleIDs))
} }
@ -198,7 +197,7 @@ final class StatusesTable: DatabaseTable {
return statusWithRow(row, articleID: articleID) return statusWithRow(row, articleID: articleID)
} }
func statusWithRow(_ row: FMResultSet, articleID: String) ->ArticleStatus? { func statusWithRow(_ row: FMResultSet, articleID: String) -> ArticleStatus? {
if let cachedStatus = cache[articleID] { if let cachedStatus = cache[articleID] {
return cachedStatus return cachedStatus
} }
@ -316,5 +315,3 @@ private final class StatusCache {
} }
} }
} }