From 03f95e4788533c3c0cb4d813dd0d42600b5f1f2a Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 8 Dec 2019 17:14:20 -0800 Subject: [PATCH] Make article indexing more efficient. --- Frameworks/ArticlesDatabase/ArticlesTable.swift | 12 ++---------- Frameworks/ArticlesDatabase/SearchTable.swift | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index 864e55711..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) } } } diff --git a/Frameworks/ArticlesDatabase/SearchTable.swift b/Frameworks/ArticlesDatabase/SearchTable.swift index ad3412c03..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) { @@ -93,6 +97,17 @@ final class SearchTable: DatabaseTable { let indexedArticles = articleSearchInfos.filter { $0.searchRowID != nil } 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