diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index bbdddfdac..ef98710d5 100644 --- a/Frameworks/ArticlesDatabase/ArticlesTable.swift +++ b/Frameworks/ArticlesDatabase/ArticlesTable.swift @@ -277,19 +277,11 @@ final class ArticlesTable: DatabaseTable { self.callUpdateArticlesCompletionBlock(newArticles, updatedArticles, completion) //7 // 8. Update search index. - var articlesToIndex = Set
() if let newArticles = newArticles { - articlesToIndex.formUnion(newArticles) + self.searchTable.indexNewArticles(newArticles, database) } if let updatedArticles = updatedArticles { - articlesToIndex.formUnion(updatedArticles) - } - let articleIDsToIndex = articlesToIndex.articleIDs() - if articleIDsToIndex.isEmpty { - return - } - DispatchQueue.main.async { - self.searchTable.ensureIndexedArticles(for: articleIDsToIndex) + self.searchTable.indexUpdatedArticles(updatedArticles, database) } } } @@ -440,6 +432,7 @@ final class ArticlesTable: DatabaseTable { if articleIDs.isEmpty { return } + self.searchTable.ensureIndexedArticles(articleIDs, database) DispatchQueue.main.async { self.indexUnindexedArticles() diff --git a/Frameworks/ArticlesDatabase/SearchTable.swift b/Frameworks/ArticlesDatabase/SearchTable.swift index da0d35d2d..77a83fc5e 100644 --- a/Frameworks/ArticlesDatabase/SearchTable.swift +++ b/Frameworks/ArticlesDatabase/SearchTable.swift @@ -45,6 +45,10 @@ final class ArticleSearchInfo: Hashable { self.searchRowID = searchRowID } + convenience init(article: Article) { + self.init(articleID: article.articleID, title: article.title, contentHTML: article.contentHTML, contentText: article.contentText, summary: article.summary, searchRowID: nil) + } + // MARK: Hashable public func hash(into hasher: inout Hasher) { @@ -77,12 +81,8 @@ final class SearchTable: DatabaseTable { self.ensureIndexedArticles(articleIDs, database) } } -} - -// MARK: - Private - -private extension SearchTable { + /// Add to, or update, the search index for articles with specified IDs. func ensureIndexedArticles(_ articleIDs: Set, _ database: FMDatabase) { guard let articlesTable = articlesTable else { return @@ -98,6 +98,22 @@ private extension SearchTable { updateIndexForArticles(indexedArticles, database) } + /// Index new articles. + func indexNewArticles(_ articles: Set
, _ database: FMDatabase) { + let articleSearchInfos = Set(articles.map{ ArticleSearchInfo(article: $0) }) + performInitialIndexForArticles(articleSearchInfos, database) + } + + /// Index updated articles. + func indexUpdatedArticles(_ articles: Set
, _ database: FMDatabase) { + ensureIndexedArticles(articles.articleIDs(), database) + } +} + +// MARK: - Private + +private extension SearchTable { + func performInitialIndexForArticles(_ articles: Set, _ database: FMDatabase) { articles.forEach { performInitialIndex($0, database) } } diff --git a/xcconfig/common/NetNewsWire_ios_target_common.xcconfig b/xcconfig/common/NetNewsWire_ios_target_common.xcconfig index 4f3304fd8..ac97bad41 100644 --- a/xcconfig/common/NetNewsWire_ios_target_common.xcconfig +++ b/xcconfig/common/NetNewsWire_ios_target_common.xcconfig @@ -1,7 +1,7 @@ // High Level Settings common to both the iOS application and any extensions we bundle with it MARKETING_VERSION = 5.0 -CURRENT_PROJECT_VERSION = 17 +CURRENT_PROJECT_VERSION = 18 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon