9 * @author Christian Weiske <cweiske@cweiske.de>
10 * @copyright 2014 Christian Weiske
11 * @license http://www.gnu.org/licenses/agpl.html GNU AGPL v3
12 * @link http://cweiske.de/grauphel.htm
14 namespace OCA\Grauphel\Search;
16 use \OCA\Grauphel\Lib\NoteStorage;
19 * Hook for the site-wide owncloud search.
23 * @author Christian Weiske <cweiske@cweiske.de>
24 * @copyright 2014 Christian Weiske
25 * @license http://www.gnu.org/licenses/agpl.html GNU AGPL v3
26 * @version Release: @package_version@
27 * @link http://cweiske.de/grauphel.htm
29 class Provider extends \OCP\Search\Provider
34 * @param string $query
36 * @return array list of \OCA\Grauphel\Search\Note
38 public function search($query)
40 $urlGen = \OC::$server->getURLGenerator();
41 $notes = new NoteStorage($urlGen);
42 $notes->setUsername(\OC_User::getUser());
43 $rows = $notes->search($this->parseQuery($query));
46 foreach ($rows as $row) {
48 $res->id = $row['note_guid'];
49 $res->name = htmlspecialchars_decode($row['note_title']);
50 $res->link = $urlGen->linkToRoute(
51 'grauphel.gui.note', array('guid' => $row['note_guid'])
59 * Splits the user's query string up into several keywords
60 * that all have to be within the note (AND).
62 * Split by space, quotes are supported:
64 * -> searches for notes that contain "foo" and "bar"
66 * -> searches for notes that contain "foo" and "bar baz"
68 * @param string $query User-given query string
70 * @return array Array of keywords
72 protected function parseQuery($query)
74 $keywords = explode(' ', $query);
75 array_map('trim', $keywords);
79 foreach ($keywords as $key => &$keyword) {
80 if ($keyword{0} != '"') {
83 if (substr($keyword, -1) == '"') {
85 $keyword = trim($keyword, '"');
88 if ($key < count($keywords) -1) {
90 $keyword .= ' ' . $keywords[$key + 1];
91 unset($keywords[$key + 1]);
96 } while ($changed && ++$loop < 20);