From 0a45dda375abc527362f8f0fe7a8a0fdac302fc5 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 24 Feb 2019 19:22:16 -0800 Subject: [PATCH] =?UTF-8?q?Create=20SearchFeedDelegate.=20Make=20searching?= =?UTF-8?q?=20synchronous,=20since=20it=E2=80=99s=20fast=20enough.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Frameworks/Account/Account.swift | 12 +++-- .../ArticlesDatabase/ArticlesDatabase.swift | 4 +- .../ArticlesDatabase/ArticlesTable.swift | 12 ++--- NetNewsWire.xcodeproj/project.pbxproj | 6 +++ .../SmartFeeds/SearchFeedDelegate.swift | 46 +++++++++++++++++++ 5 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 NetNewsWire/SmartFeeds/SearchFeedDelegate.swift diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 5ce5534f7..a5135b09b 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -388,6 +388,10 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, return database.fetchStarredArticles(for: flattenedFeeds().feedIDs()) } + public func fetchArticlesMatching(_ searchString: String) -> Set
{ + return database.fetchArticlesMatching(searchString, for: flattenedFeeds().feedIDs()) + } + private func validateUnreadCount(_ feed: Feed, _ articles: Set
) { // articles must contain all the unread articles for the feed. @@ -498,9 +502,11 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, public func debugRunSearch() { #if DEBUG - database.fetchArticlesMatching("Brent Simmons") { (articles) in - print(articles) - } + let t1 = Date() + let articles = fetchArticlesMatching("Brent NetNewsWire") + let t2 = Date() + print(t2.timeIntervalSince(t1)) + print(articles.count) #endif } diff --git a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift index a5df2d103..a7b4e6bda 100644 --- a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift +++ b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift @@ -65,8 +65,8 @@ public final class ArticlesDatabase { return articlesTable.fetchStarredArticles(for: feedIDs) } - public func fetchArticlesMatching(_ searchString: String, _ resultBlock: @escaping ArticleResultBlock) { - articlesTable.fetchArticlesMatching(searchString, resultBlock) + public func fetchArticlesMatching(_ searchString: String, for feedIDs: Set) -> Set
{ + return articlesTable.fetchArticlesMatching(searchString, for: feedIDs) } // MARK: - Unread Counts diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index 41b824c31..6a779cf34 100644 --- a/Frameworks/ArticlesDatabase/ArticlesTable.swift +++ b/Frameworks/ArticlesDatabase/ArticlesTable.swift @@ -83,13 +83,13 @@ final class ArticlesTable: DatabaseTable { return fetchStarredArticles(feedIDs) } - func fetchArticlesMatching(_ searchString: String, _ resultBlock: @escaping ArticleResultBlock) { - queue.fetch { (database) in - let articles = self.fetchArticlesMatching(searchString, database) - DispatchQueue.main.async { - resultBlock(articles) - } + func fetchArticlesMatching(_ searchString: String, for feedIDs: Set) -> Set
{ + var articles: Set
= Set
() + queue.fetchSync { (database) in + articles = self.fetchArticlesMatching(searchString, database) } + articles = articles.filter{ feedIDs.contains($0.feedID) } + return articles } func fetchArticleSearchInfos(_ articleIDs: Set, in database: FMDatabase) -> Set? { diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index d71d647ba..4729f1614 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -219,6 +219,8 @@ 84702AA41FA27AC0006B8943 /* MarkStatusCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84702AA31FA27AC0006B8943 /* MarkStatusCommand.swift */; }; 8472058120142E8900AD578B /* FeedInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8472058020142E8900AD578B /* FeedInspectorViewController.swift */; }; 84754C8A213E471B009CFDFB /* GeneralPrefencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84754C89213E471B009CFDFB /* GeneralPrefencesViewController.swift */; }; + 8477ACBE22238E9500DF7F37 /* SearchFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8477ACBD22238E9500DF7F37 /* SearchFeedDelegate.swift */; }; + 8477ACBF22238E9500DF7F37 /* SearchFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8477ACBD22238E9500DF7F37 /* SearchFeedDelegate.swift */; }; 848B937221C8C5540038DC0D /* CrashReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848B937121C8C5540038DC0D /* CrashReporter.swift */; }; 848D578E21543519005FFAD5 /* PasteboardFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848D578D21543519005FFAD5 /* PasteboardFeed.swift */; }; 848F6AE51FC29CFB002D422E /* FaviconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848F6AE41FC29CFA002D422E /* FaviconDownloader.swift */; }; @@ -809,6 +811,7 @@ 8472058020142E8900AD578B /* FeedInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedInspectorViewController.swift; sourceTree = ""; }; 84754C89213E471B009CFDFB /* GeneralPrefencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GeneralPrefencesViewController.swift; path = NetNewsWire/Preferences/GeneralPrefencesViewController.swift; sourceTree = ""; }; 847752FE2008879500D93690 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; + 8477ACBD22238E9500DF7F37 /* SearchFeedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFeedDelegate.swift; sourceTree = ""; }; 848B930921C8B0BF0038DC0D /* Subscribe-to-Feed-MAS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Subscribe-to-Feed-MAS-Info.plist"; sourceTree = ""; }; 848B937121C8C5540038DC0D /* CrashReporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CrashReporter.swift; sourceTree = ""; }; 848D578D21543519005FFAD5 /* PasteboardFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteboardFeed.swift; sourceTree = ""; }; @@ -1609,6 +1612,7 @@ 845EE7C01FC2488C00854A1F /* SmartFeed.swift */, 84F2D5361FC22FCB00998D64 /* TodayFeedDelegate.swift */, 845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */, + 8477ACBD22238E9500DF7F37 /* SearchFeedDelegate.swift */, 84AD1EB92031649C00BC20B7 /* SmartFeedPasteboardWriter.swift */, ); name = SmartFeeds; @@ -2405,6 +2409,7 @@ 840F7C4621BDA4B40057E851 /* SendToMicroBlogCommand.swift in Sources */, 840F7C4721BDA4B40057E851 /* ArticleStyle.swift in Sources */, 840F7C4821BDA4B40057E851 /* FaviconURLFinder.swift in Sources */, + 8477ACBF22238E9500DF7F37 /* SearchFeedDelegate.swift in Sources */, 840F7C4921BDA4B40057E851 /* SidebarViewController+ContextualMenus.swift in Sources */, 840F7C4A21BDA4B40057E851 /* RSHTMLMetadata+Extension.swift in Sources */, 840F7C4B21BDA4B40057E851 /* SendToMarsEditCommand.swift in Sources */, @@ -2542,6 +2547,7 @@ 84E8E0DB202EC49300562D8F /* TimelineViewController+ContextualMenus.swift in Sources */, 849A97791ED9EC04007D329B /* TimelineStringFormatter.swift in Sources */, 84E185C3203BB12600F69BFA /* MultilineTextFieldSizer.swift in Sources */, + 8477ACBE22238E9500DF7F37 /* SearchFeedDelegate.swift in Sources */, 8472058120142E8900AD578B /* FeedInspectorViewController.swift in Sources */, 84AD1EAA2031617300BC20B7 /* FolderPasteboardWriter.swift in Sources */, 84AD1EBC2032AF5C00BC20B7 /* SidebarOutlineDataSource.swift in Sources */, diff --git a/NetNewsWire/SmartFeeds/SearchFeedDelegate.swift b/NetNewsWire/SmartFeeds/SearchFeedDelegate.swift new file mode 100644 index 000000000..86d54c561 --- /dev/null +++ b/NetNewsWire/SmartFeeds/SearchFeedDelegate.swift @@ -0,0 +1,46 @@ +// +// SearchFeedDelegate.swift +// NetNewsWire +// +// Created by Brent Simmons on 2/24/19. +// Copyright © 2019 Ranchero Software. All rights reserved. +// + +import Foundation +import Account +import Articles + +struct SearchFeedDelegate: SmartFeedDelegate { + + var nameForDisplay: String { + return nameForDisplayPrefix + searchString + } + + let nameForDisplayPrefix = NSLocalizedString("Search: ", comment: "Search smart feed title prefix") + let searchString: String + + init(searchString: String) { + self.searchString = searchString + } + + func fetchUnreadCount(for: Account, callback: @escaping (Int) -> Void) { + // TODO: after 5.0 + } +} + +// MARK: - ArticleFetcher + +extension SearchFeedDelegate: ArticleFetcher { + + func fetchArticles() -> Set
{ + var articles = Set
() + for account in AccountManager.shared.accounts { + articles.formUnion(account.fetchArticlesMatching(searchString)) + } + return articles + } + + func fetchUnreadArticles() -> Set
{ + return fetchArticles().unreadArticles() + } +}