Преглед изворни кода

Clean up unified search

- use `provider.id` instead of the name, more reliable
- filter provider to only include file-related or generally supported ones

Signed-off-by: Henrik Storch <henrik.storch@nextcloud.com>
Henrik Storch пре 3 година
родитељ
комит
34b7b379d5

+ 0 - 1
Nextcloud.xcodeproj/project.pbxproj

@@ -1755,7 +1755,6 @@
 		F7F67B9F1A24D27800EE80DA = {
 			isa = PBXGroup;
 			children = (
-				AF4AFF04277382BB00EBE49C /* ios-communication-library */,
 				F7F67BAA1A24D27800EE80DA /* iOSClient */,
 				F7F67BAB1A24D27800EE80DA /* Supporting Files */,
 				F771E3D120E2392D00AFB62D /* File Provider Extension */,

+ 2 - 4
iOSClient/Files/NCFiles.swift

@@ -81,10 +81,8 @@ class NCFiles: NCCollectionViewCommon {
             
             self.dataSource = NCDataSource.init(metadatasSource: self.metadatasSource, sort: self.layoutForView?.sort, ascending: self.layoutForView?.ascending, directoryOnTop: self.layoutForView?.directoryOnTop, favoriteOnTop: true, filterLivePhoto: true)
             
-//            DispatchQueue.main.async { [weak self] in
-                self.refreshControl.endRefreshing()
-                self.collectionView.reloadData()
-//            }
+            self.refreshControl.endRefreshing()
+            self.collectionView.reloadData()
         }
     }
 

+ 6 - 8
iOSClient/Main/Collection Common/NCCollectionViewCommon.swift

@@ -944,7 +944,7 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
             DispatchQueue.main.async { self.refreshControl.endRefreshing() }
             return
         }
-        let completionHanlder: ([tableMetadata]?, Int, String) ->  Void =  { metadatas, errorCode, errorDescription in
+        let completionHandler: ([tableMetadata]?, Int, String) ->  Void =  { metadatas, errorCode, errorDescription in
             DispatchQueue.main.async {
                 if self.searchController?.isActive == true, errorCode == 0, let metadatas = metadatas {
                     self.metadatasSource = metadatas
@@ -959,16 +959,14 @@ class NCCollectionViewCommon: UIViewController, UIGestureRecognizerDelegate, UIS
         collectionView?.reloadData()
         
         let serverVersionMajor = NCManageDatabase.shared.getCapabilitiesServerInt(account: appDelegate.account, elements: NCElementsJSON.shared.capabilitiesVersionMajor)
-        if serverVersionMajor > NCGlobal.shared.nextcloudVersion20 {
+        if serverVersionMajor >= NCGlobal.shared.nextcloudVersion20 {
             NCNetworking.shared.unifiedSearchFiles(urlBase: appDelegate, literal: literalSearch, update: { metadatas in
                 guard let metadatas = metadatas else { return }
-                DispatchQueue.main.async {
-                    self.metadatasSource = Array(metadatas)
-                    self.reloadDataSource()
-                }
-            }, completion: completionHanlder)
+                self.metadatasSource = Array(metadatas)
+                self.reloadDataSource()
+            }, completion: completionHandler)
         } else {
-            NCNetworking.shared.searchFiles(urlBase: appDelegate.urlBase, user: appDelegate.user, literal: literalSearch, completion: completionHanlder)
+            NCNetworking.shared.searchFiles(urlBase: appDelegate, literal: literalSearch, completion: completionHandler)
         }
     }
 

+ 32 - 28
iOSClient/Networking/NCNetworking.swift

@@ -902,14 +902,14 @@ import Queuer
     //MARK: - Search
     
     /// WebDAV search
-    @objc func searchFiles(urlBase: String, user: String, literal: String, completion: @escaping (_ metadatas: [tableMetadata]?, _ errorCode: Int, _ errorDescription: String) -> ()) {
+    @objc func searchFiles(urlBase: NCUserBaseUrl, literal: String, completion: @escaping (_ metadatas: [tableMetadata]?, _ errorCode: Int, _ errorDescription: String) -> ()) {
 
-        NCCommunication.shared.searchLiteral(serverUrl: urlBase, depth: "infinity", literal: literal, showHiddenFiles: CCUtility.getShowHiddenFiles(), queue: NCCommunicationCommon.shared.backgroundQueue) { (account, files, errorCode, errorDescription) in
+        NCCommunication.shared.searchLiteral(serverUrl: urlBase.urlBase, depth: "infinity", literal: literal, showHiddenFiles: CCUtility.getShowHiddenFiles(), queue: NCCommunicationCommon.shared.backgroundQueue) { (account, files, errorCode, errorDescription) in
             guard errorCode != 0 else {
                 return completion(nil, errorCode, errorDescription)
             }
 
-            NCManageDatabase.shared.convertNCCommunicationFilesToMetadatas(files, useMetadataFolder: false, account: account) { (metadataFolder, metadatasFolder, metadatas) in
+            NCManageDatabase.shared.convertNCCommunicationFilesToMetadatas(files, useMetadataFolder: false, account: account) { _, metadatasFolder, metadatas in
 
                 // Update sub directories
                 for folder in metadatasFolder {
@@ -919,7 +919,6 @@ import Queuer
 
                 NCManageDatabase.shared.addMetadatas(metadatas)
                 let metadatas = Array(metadatas.map(tableMetadata.init))
-
                 completion(metadatas, errorCode, errorDescription)
             }
         }
@@ -927,21 +926,37 @@ import Queuer
 
     /// Unified Search (NC>=20)
     @objc func unifiedSearchFiles(urlBase: NCUserBaseUrl, literal: String, update: @escaping (Set<tableMetadata>?) -> Void, completion: @escaping (_ metadatas: [tableMetadata]?, _ errorCode: Int, _ errorDescription: String) -> ()) {
-        var seachFiles = Set<tableMetadata>()
+        var searchFiles = Set<tableMetadata>()
         var errCode = 0
         var errDescr = ""
         let dispatchGroup = DispatchGroup()
         dispatchGroup.enter()
         dispatchGroup.notify(queue: .main) {
-            completion(Array(seachFiles), errCode, errDescr)
+            completion(Array(searchFiles), errCode, errDescr)
         }
 
-        NCCommunication.shared.unifiedSearch(term: literal) { parialResult, provider, errorCode, errorDescription in
-            guard let parialResult = parialResult else { return }
-            print("##ProoviderId", provider.id)
-            // NOTE: FTS could return attributes like files
-            if parialResult.name == "Full Text Search" {
-                parialResult.entries.forEach({ entry in
+        NCCommunication.shared.unifiedSearch(term: literal) { provider in
+            ["files", "fulltextsearch"].contains(provider.id)
+        } update: { partialResult, provider, errorCode, errorDescription in
+            guard let partialResult = partialResult else { return }
+            
+            switch provider.id {
+            case "files":
+                partialResult.entries.forEach({ entry in
+                    if let fileId = entry.fileId,
+                       let result = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && fileId == %@", urlBase.userAccount, String(fileId))) {
+                        searchFiles.insert(result)
+                    } else if let filePath = entry.filePath {
+                        self.loadMetadata(urlBase: urlBase, filePath: filePath, dispatchGroup: dispatchGroup) { newMetadata in
+                            searchFiles.insert(newMetadata)
+                        }
+                    } else { print(#function, "[ERROR]: File search entry has no path: \(entry)") }
+                })
+                break
+            case "fulltextsearch":
+                // NOTE: FTS could also return attributes like files
+                // https://github.com/nextcloud/files_fulltextsearch/issues/143
+                partialResult.entries.forEach({ entry in
                     let url = URLComponents(string: entry.resourceURL)
                     guard let dir = url?.queryItems?["dir"]?.value, let filename = url?.queryItems?["scrollto"]?.value else { return }
                     if let tableFile = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(
@@ -949,27 +964,16 @@ import Queuer
                               urlBase.userAccount,
                               "/remote.php/dav/files/" + urlBase.user + dir,
                               filename)) {
-                        print("##TableFile", tableFile, urlBase.userBaseUrl)
-                        seachFiles.insert(tableFile)
+                        searchFiles.insert(tableFile)
                     } else {
-                        self.loadMetadata(urlBase: urlBase, filePath: "/" + entry.subline, dispatchGroup: dispatchGroup) { newMetadata in
-                            seachFiles.insert(newMetadata)
+                        self.loadMetadata(urlBase: urlBase, filePath: dir + filename, dispatchGroup: dispatchGroup) { newMetadata in
+                            searchFiles.insert(newMetadata)
                         }
                     }
                 })
-            } else if parialResult.name == "Files" {
-                parialResult.entries.forEach({ entry in
-                    if let fileId = entry.fileId,
-                       let result = NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "fileId == %@", String(fileId))) {
-                        seachFiles.insert(result)
-                    } else if let filePath = entry.filePath {
-                        self.loadMetadata(urlBase: urlBase, filePath: filePath, dispatchGroup: dispatchGroup) { newMetadata in
-                            seachFiles.insert(newMetadata)
-                        }
-                    } else { print(#function, "[ERROR]: File search entry has no path: \(entry)") }
-                })
+            default: return     // unknown provider results
             }
-            update(seachFiles)
+            update(searchFiles)
         } completion: { results, errorCode, errorDescription in
             dispatchGroup.leave()
             errCode = errorCode

+ 1 - 1
iOSClient/Networking/NCNetworkingChunkedUpload.swift

@@ -156,7 +156,7 @@ extension NCNetworking {
                             NCUtilityFileSystem.shared.deleteFile(filePath: directoryProviderStorageOcId)
 
                             self.readFile(serverUrlFileName: serverUrlFileNameDestination) { (_, metadata, _, _) in
-                                    
+
                                 if errorCode == 0, let metadata = metadata {
 
                                     metadata.assetLocalIdentifier = assetLocalIdentifier

+ 2 - 2
iOSClient/RichWorkspace/NCViewerRichWorkspace.swift

@@ -59,9 +59,9 @@ import MarkdownKit
 
     override func viewWillAppear(_ animated: Bool) {
         super.viewWillAppear(animated)
-        
+
         NCNetworking.shared.readFile(serverUrlFileName: serverUrl) { (account, metadata, errorCode, errorDescription) in
-            
+
             if errorCode == 0 && account == self.appDelegate.account {
                 guard let metadata = metadata else { return }
                 NCManageDatabase.shared.setDirectory(richWorkspace: metadata.richWorkspace, serverUrl: self.serverUrl, account: account)

+ 1 - 1
iOSClient/Utility/NCUserBaseUrl.swift

@@ -1,5 +1,5 @@
 //
-//  NCUtility.swift
+//  NCUserBaseUrl.swift
 //  Nextcloud
 //
 //  Created by Henrik Storch on 22.11.21.