2828
2929namespace OCA \Files \Search ;
3030
31- use OC \Search \Provider \File ;
32- use OC \Search \Result \File as FileResult ;
31+ use OC \Files \Search \SearchComparison ;
32+ use OC \Files \Search \SearchOrder ;
33+ use OC \Files \Search \SearchQuery ;
34+ use OCP \Files \FileInfo ;
3335use OCP \Files \IMimeTypeDetector ;
3436use OCP \Files \IRootFolder ;
37+ use OCP \Files \Search \ISearchComparison ;
38+ use OCP \Files \Node ;
39+ use OCP \Files \Search \ISearchOrder ;
3540use OCP \IL10N ;
3641use OCP \IURLGenerator ;
3742use OCP \IUser ;
4247
4348class FilesSearchProvider implements IProvider {
4449
45- /** @var File */
46- private $ fileSearch ;
47-
4850 /** @var IL10N */
4951 private $ l10n ;
5052
@@ -57,13 +59,13 @@ class FilesSearchProvider implements IProvider {
5759 /** @var IRootFolder */
5860 private $ rootFolder ;
5961
60- public function __construct (File $ fileSearch ,
61- IL10N $ l10n ,
62- IURLGenerator $ urlGenerator ,
63- IMimeTypeDetector $ mimeTypeDetector ,
64- IRootFolder $ rootFolder ) {
62+ public function __construct (
63+ IL10N $ l10n ,
64+ IURLGenerator $ urlGenerator ,
65+ IMimeTypeDetector $ mimeTypeDetector ,
66+ IRootFolder $ rootFolder
67+ ) {
6568 $ this ->l10n = $ l10n ;
66- $ this ->fileSearch = $ fileSearch ;
6769 $ this ->urlGenerator = $ urlGenerator ;
6870 $ this ->mimeTypeDetector = $ mimeTypeDetector ;
6971 $ this ->rootFolder = $ rootFolder ;
@@ -98,43 +100,56 @@ public function getOrder(string $route, array $routeParameters): int {
98100 * @inheritDoc
99101 */
100102 public function search (IUser $ user , ISearchQuery $ query ): SearchResult {
101-
102- // Make sure we setup the users filesystem
103- $ this ->rootFolder ->getUserFolder ($ user ->getUID ());
103+ $ userFolder = $ this ->rootFolder ->getUserFolder ($ user ->getUID ());
104+ $ fileQuery = new SearchQuery (
105+ new SearchComparison (ISearchComparison::COMPARE_LIKE , 'name ' , '% ' . $ query ->getTerm () . '% ' ),
106+ $ query ->getLimit (),
107+ (int )$ query ->getCursor (),
108+ $ query ->getSortOrder () === ISearchQuery::SORT_DATE_DESC ? [
109+ new SearchOrder (ISearchOrder::DIRECTION_DESCENDING , 'mtime ' ),
110+ ] : [],
111+ $ user
112+ );
104113
105114 return SearchResult::paginated (
106115 $ this ->l10n ->t ('Files ' ),
107- array_map (function (FileResult $ result ) {
116+ array_map (function (Node $ result) use ( $ userFolder ) {
108117 // Generate thumbnail url
109- $ thumbnailUrl = $ result ->has_preview
110- ? $ this ->urlGenerator ->linkToRouteAbsolute ('core.Preview.getPreviewByFileId ' , ['x ' => 32 , 'y ' => 32 , 'fileId ' => $ result ->id ])
111- : '' ;
118+ $ thumbnailUrl = $ this ->urlGenerator ->linkToRouteAbsolute ('core.Preview.getPreviewByFileId ' , ['x ' => 32 , 'y ' => 32 , 'fileId ' => $ result ->getId ()]);
119+ $ path = $ userFolder ->getRelativePath ($ result ->getPath ());
120+ $ link = $ this ->urlGenerator ->linkToRoute (
121+ 'files.view.index ' ,
122+ [
123+ 'dir ' => dirname ($ path ),
124+ 'scrollto ' => $ result ->getName (),
125+ ]
126+ );
112127
113128 return new SearchResultEntry (
114129 $ thumbnailUrl ,
115- $ result ->name ,
116- $ this ->formatSubline ($ result ),
117- $ this ->urlGenerator ->getAbsoluteURL ($ result -> link ),
118- $ result ->type === ' folder ' ? 'icon-folder ' : $ this ->mimeTypeDetector ->mimeTypeIcon ($ result ->mime_type )
130+ $ result ->getName () ,
131+ $ this ->formatSubline ($ path ),
132+ $ this ->urlGenerator ->getAbsoluteURL ($ link ),
133+ $ result ->getMimetype () === FileInfo:: MIMETYPE_FOLDER ? 'icon-folder ' : $ this ->mimeTypeDetector ->mimeTypeIcon ($ result ->getMimetype () )
119134 );
120- }, $ this -> fileSearch -> search ($ query -> getTerm (), $ query -> getLimit (), ( int ) $ query -> getCursor () )),
135+ }, $ userFolder -> search ($ fileQuery )),
121136 $ query ->getCursor () + $ query ->getLimit ()
122137 );
123138 }
124139
125140 /**
126141 * Format subline for files
127142 *
128- * @param FileResult $result
143+ * @param string $path
129144 * @return string
130145 */
131- private function formatSubline ($ result ): string {
146+ private function formatSubline (string $ path ): string {
132147 // Do not show the location if the file is in root
133- if ($ result ->path === '/ ' . $ result ->name ) {
148+ if (strrpos ($ path , '/ ' ) > 0 ) {
149+ $ path = ltrim (dirname ($ path ), '/ ' );
150+ return $ this ->l10n ->t ('in %s ' , [$ path ]);
151+ } else {
134152 return '' ;
135153 }
136-
137- $ path = ltrim (dirname ($ result ->path ), '/ ' );
138- return $ this ->l10n ->t ('in %s ' , [$ path ]);
139154 }
140155}
0 commit comments