From b957753f5c80be08bb179754b70b0346adc252cf Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 24 Feb 2019 18:37:13 -0800 Subject: [PATCH] Revise fetchArticlesMatching function to use FTS. --- .../ArticlesDatabase/ArticlesTable.swift | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index 42970bb5e..41b824c31 100644 --- a/Frameworks/ArticlesDatabase/ArticlesTable.swift +++ b/Frameworks/ArticlesDatabase/ArticlesTable.swift @@ -501,9 +501,37 @@ private extension ArticlesTable { } func fetchArticlesMatching(_ searchString: String, _ database: FMDatabase) -> Set
{ - let whereClause = "(starred=1 or dateArrived>?) and userDeleted=0 and (textMatchesSearchString(title,?) or textMatchesSearchString(contentHTML,?) or textMatchesSearchString(contentText,?) or textMatchesSearchString(summary,?))" - let parameters: [AnyObject] = [articleCutoffDate as AnyObject, searchString as AnyObject, searchString as AnyObject, searchString as AnyObject, searchString as AnyObject] - return self.fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters, withLimits: false) + let sql = "select rowid from search where search match ?;" + let sqlSearchString = sqliteSearchString(with: searchString) + let searchStringParameters = [sqlSearchString] + guard let resultSet = database.executeQuery(sql, withArgumentsIn: searchStringParameters) else { + return Set
() + } + let searchRowIDs = resultSet.mapToSet { $0.longLongInt(forColumn: DatabaseKey.rowID) } + resultSet.close() + if searchRowIDs.isEmpty { + return Set
() + } + + let placeholders = NSString.rs_SQLValueList(withPlaceholders: UInt(searchRowIDs.count))! + let whereClause = "searchRowID in \(placeholders);" + let parameters: [AnyObject] = Array(searchRowIDs) as [AnyObject] + return self.fetchArticlesWithWhereClause(database, whereClause: whereClause, parameters: parameters, withLimits: true) + } + + func sqliteSearchString(with searchString: String) -> String { + var s = "" + searchString.enumerateSubstrings(in: searchString.startIndex.. Set
{