diff --git a/core/js/js.js b/core/js/js.js index 60237a7fe83..9d38a8c77fe 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 fe6aefbb42e..b2bf41f751c 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 8f04aa8360b..4629d52b40e 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 229376ed3ae..84e450afe6f 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 00000000000..97da1dd2c85 --- /dev/null +++ b/lib/public/search/pagedprovider.php @@ -0,0 +1,58 @@ +. + * + */ + +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 21e127e72b1..90771084659 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 372d1d7a055..06a96fd582b 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); });