Create statusWithRow(_ row: FMResultSet, articleID: String) — it allows us to avoid pulling articleID from the row twice every time we’re creating a DatabaseArticle.

This commit is contained in:
Brent Simmons 2019-09-28 12:18:08 -07:00
parent d7b45a1413
commit 2b491217f3
2 changed files with 12 additions and 9 deletions

View File

@ -475,16 +475,15 @@ private extension ArticlesTable {
func makeDatabaseArticles(with resultSet: FMResultSet) -> Set<DatabaseArticle> { func makeDatabaseArticles(with resultSet: FMResultSet) -> Set<DatabaseArticle> {
let articles = resultSet.mapToSet { (row) -> DatabaseArticle? in let articles = resultSet.mapToSet { (row) -> DatabaseArticle? in
// The resultSet is a result of a JOIN query with the statuses table, guard let articleID = row.string(forColumn: DatabaseKey.articleID) else {
// so we can get the statuses at the same time and avoid additional database lookups. assertionFailure("Expected articleID.")
guard let status = statusesTable.statusWithRow(resultSet) else {
assertionFailure("Expected status.")
return nil return nil
} }
guard let articleID = row.string(forColumn: DatabaseKey.articleID) else { // The resultSet is a result of a JOIN query with the statuses table,
assertionFailure("Expected articleID.") // so we can get the statuses at the same time and avoid additional database lookups.
guard let status = statusesTable.statusWithRow(resultSet, articleID: articleID) else {
assertionFailure("Expected status.")
return nil return nil
} }
guard let feedID = row.string(forColumn: DatabaseKey.feedID) else { guard let feedID = row.string(forColumn: DatabaseKey.feedID) else {

View File

@ -105,17 +105,21 @@ final class StatusesTable: DatabaseTable {
guard let articleID = row.string(forColumn: DatabaseKey.articleID) else { guard let articleID = row.string(forColumn: DatabaseKey.articleID) else {
return nil return nil
} }
return statusWithRow(row, articleID: articleID)
}
func statusWithRow(_ row: FMResultSet, articleID: String) ->ArticleStatus? {
if let cachedStatus = cache[articleID] { if let cachedStatus = cache[articleID] {
return cachedStatus return cachedStatus
} }
guard let dateArrived = row.date(forColumn: DatabaseKey.dateArrived) else { guard let dateArrived = row.date(forColumn: DatabaseKey.dateArrived) else {
return nil return nil
} }
let articleStatus = ArticleStatus(articleID: articleID, dateArrived: dateArrived, row: row) let articleStatus = ArticleStatus(articleID: articleID, dateArrived: dateArrived, row: row)
cache.addStatusIfNotCached(articleStatus) cache.addStatusIfNotCached(articleStatus)
return articleStatus return articleStatus
} }