add paged provider

This commit is contained in:
Jörn Friedrich Dreyer 2014-12-11 12:58:22 +01:00
parent 088323aad5
commit c738359a11
7 changed files with 114 additions and 6 deletions

View File

@ -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.

View File

@ -278,6 +278,7 @@ abstract class Common implements \OC\Files\Storage\Storage {
}
}
}
closedir($dh);
return $files;
}

View File

@ -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;

View File

@ -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

View File

@ -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);
}

View File

@ -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 {

View File

@ -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);
});