new search query parser; support for NOT
[grauphel.git] / lib / search / provider.php
index 8b867bb91bb5e7f2a41c6f2ea2a30ea46d4a09c0..b3957781cb2c6ec66654f0eb73d2b6a340a1f415 100644 (file)
@@ -40,7 +40,9 @@ class Provider extends \OCP\Search\Provider
         $urlGen = \OC::$server->getURLGenerator();
         $notes  = new NoteStorage($urlGen);
         $notes->setUsername(\OC_User::getUser());
-        $rows = $notes->search($this->parseQuery($query));
+
+        $qp = new QueryParser();
+        $rows = $notes->search($qp->parse($query));
 
         $results = array();
         foreach ($rows as $row) {
@@ -54,48 +56,5 @@ class Provider extends \OCP\Search\Provider
         }
         return $results;
     }
-
-    /**
-     * Splits the user's query string up into several keywords
-     * that all have to be within the note (AND).
-     *
-     * Split by space, quotes are supported:
-     * - foo bar
-     *   -> searches for notes that contain "foo" and "bar"
-     * - foo "bar baz"
-     *   -> searches for notes that contain "foo" and "bar baz"
-     *
-     * @param string $query User-given query string
-     *
-     * @return array Array of keywords
-     */
-    protected function parseQuery($query)
-    {
-        $keywords = explode(' ', $query);
-        array_map('trim', $keywords);
-        $loop = 0;
-        do {
-            $changed = false;
-            foreach ($keywords as $key => &$keyword) {
-                if ($keyword{0} != '"') {
-                    continue;
-                }
-                if (substr($keyword, -1) == '"') {
-                    // "foo"
-                    $keyword = trim($keyword, '"');
-                    continue;
-                }
-                if ($key < count($keywords) -1) {
-                    //not at the end
-                    $keyword .= ' ' . $keywords[$key + 1];
-                    unset($keywords[$key + 1]);
-                    $changed = true;
-                    break;
-                }
-            }
-        } while ($changed && ++$loop < 20);
-
-        return $keywords;
-    }
 }
 ?>