diff --git a/core/js/js.js b/core/js/js.js index 60237a7fe8308ceece204fd650197b16299023ce..9d38a8c77fe59cf0d3d9a0119b6913e3bf718156 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -309,7 +309,7 @@ var OC={ * @param {string} query the search query */ search: function (query) { - OC.Search.search(query) + OC.Search.search(query, 0, 30); }, /** * Dialog helper for jquery dialogs. diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php index fe6aefbb42ee9b7c04b17e913aecc8f8aaf1c44e..b2bf41f751c84b6af2dd24ba05da0ee9b283519c 100644 --- a/lib/private/files/storage/common.php +++ b/lib/private/files/storage/common.php @@ -278,6 +278,7 @@ abstract class Common implements \OC\Files\Storage\Storage { } } } + closedir($dh); return $files; } diff --git a/lib/private/search.php b/lib/private/search.php index 8f04aa8360b2b0a1e47e150e6e42890d1d99a26c..4629d52b40e11d80ab9abc39646b76c6e08760cf 100644 --- a/lib/private/search.php +++ b/lib/private/search.php @@ -21,6 +21,7 @@ */ namespace OC; +use OCP\Search\PagedProvider; use OCP\Search\Provider; use OCP\ISearch; @@ -39,12 +40,34 @@ class Search implements ISearch { * @return array An array of OC\Search\Result's */ public function search($query, array $inApps = array()) { + return $this->searchPaged($query, $inApps, 0, 0); + } + + /** + * Search all providers for $query + * @param string $query + * @param int $page + * @param int $size, 0 = all + * @return array An array of OC\Search\Result's + */ + public function searchPaged($query, $page = 0, $size = 30) { $this->initProviders(); $results = array(); foreach($this->providers as $provider) { /** @var $provider Provider */ - if ($provider->providesResultsFor($inApps)) { - $results = array_merge($results, $provider->search($query)); + if ( ! $provider->providesResultsFor($inApps) ) { + continue; + } + if ($provider instanceof PagedProvider) { + $results = array_merge($results, $provider->searchPaged($query, $page, $size)); + } else if ($provider instanceof Provider) { + $providerResults = $provider->search($query); + if ($size > 0) { + $slicedResults = array_slice($providerResults, $page * $size, $size); + } + $results = array_merge($results, $slicedResults); + } else { + \OC::$server->getLogger()->warning('Ignoring Unknown search provider', array('provider' => $provider)); } } return $results; diff --git a/lib/public/isearch.php b/lib/public/isearch.php index 229376ed3aeab031cdd30d56b0cf7350fe355552..84e450afe6fab66d0ca41d773d108dfe3151b310 100644 --- a/lib/public/isearch.php +++ b/lib/public/isearch.php @@ -34,9 +34,19 @@ interface ISearch { * @param string $query * @param string[] $inApps optionally limit results to the given apps * @return array An array of OCP\Search\Result's + * @deprecated use searchPaged() with page and size */ public function search($query, array $inApps = array()); + /** + * Search all providers for $query + * @param string $query + * @param int $page + * @param int $size + * @return array An array of OCP\Search\Result's + */ + public function searchPaged($query, $page = 0, $size = 30); + /** * Register a new search provider to search with * @param string $class class name of a OCP\Search\Provider diff --git a/lib/public/search/pagedprovider.php b/lib/public/search/pagedprovider.php new file mode 100644 index 0000000000000000000000000000000000000000..97da1dd2c8570835743c46751ccaaaef8a4d81d4 --- /dev/null +++ b/lib/public/search/pagedprovider.php @@ -0,0 +1,58 @@ +<?php +/** + * ownCloud + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Search; + +/** + * Provides a template for search functionality throughout ownCloud; + */ +abstract class PagedProvider extends Provider { + + /** + * List of options (currently unused) + * @var array + */ + private $options; + + /** + * Constructor + * @param array $options + */ + public function __construct($options) { + $this->options = $options; + } + + /** + * Search for $query + * @param string $query + * @return array An array of OCP\Search\Result's + */ + public function search($query) { + $this->searchPaged($query, 0, 0); + } + + /** + * Search for $query + * @param string $query + * @param int $limit, 0 = unlimited + * @param int $offset + * @return array An array of OCP\Search\Result's + */ + abstract public function searchPaged($query, $limit, $offset); +} diff --git a/search/ajax/search.php b/search/ajax/search.php index 21e127e72b1589a3c43ab7c98573b04ce5682c32..9077108465900fa332d1b314257a5dafa158057a 100644 --- a/search/ajax/search.php +++ b/search/ajax/search.php @@ -38,8 +38,18 @@ if (isset($_GET['inApps'])) { } else { $inApps = array(); } +if (isset($_GET['page'])) { + $page = (int)$_GET['page']; +} else { + $page = 0; +} +if (isset($_GET['size'])) { + $size = (int)$_GET['size']; +} else { + $size = 0; +} if($query) { - $result = \OC::$server->getSearch()->search($query, $inApps); + $result = \OC::$server->getSearch()->search($query, $inApps, $page, $size); OC_JSON::encodedPrint($result); } else { diff --git a/search/js/search.js b/search/js/search.js index 372d1d7a055809a5e82bd7d09d08750709342749..06a96fd582ba4b373727c18e92a4053f9e6ad75b 100644 --- a/search/js/search.js +++ b/search/js/search.js @@ -46,10 +46,16 @@ * Do a search query and display the results * @param {string} query the search query */ - search: _.debounce(function(query) { + search: _.debounce(function(query, page, size) { if(query) { exports.addStyle('search','results'); - $.getJSON(exports.filePath('search','ajax','search.php')+'?query=' + encodeURIComponent(query), function(results) { + if (typeof page !== 'number') { + page = 0; + } + if (typeof size !== 'number') { + size = 30; + } + $.getJSON(OC.generateUrl('search/ajax/search.php'), {query:query, page:page, size:size }, function(results) { exports.Search.lastResults = results; exports.Search.showResults(results); });