]> BookStack Code Mirror - bookstack/blobdiff - app/Services/SearchService.php
Removes some unused code.
[bookstack] / app / Services / SearchService.php
index 7ecfb95c776bdff48ba0335995da4eab828ec2e8..3d1d45c3b77d47ab356285f0f45ffa9c58b90115 100644 (file)
@@ -8,6 +8,7 @@ use BookStack\SearchTerm;
 use Illuminate\Database\Connection;
 use Illuminate\Database\Query\Builder;
 use Illuminate\Database\Query\JoinClause;
+use Illuminate\Support\Collection;
 
 class SearchService
 {
@@ -49,6 +50,15 @@ class SearchService
         $this->permissionService = $permissionService;
     }
 
+    /**
+     * Set the database connection
+     * @param Connection $connection
+     */
+    public function setConnection(Connection $connection)
+    {
+        $this->db = $connection;
+    }
+
     /**
      * Search all entities in the system.
      * @param string $searchString
@@ -86,6 +96,41 @@ class SearchService
         ];
     }
 
+
+    /**
+     * Search a book for entities
+     * @param integer $bookId
+     * @param string $searchString
+     * @return Collection
+     */
+    public function searchBook($bookId, $searchString)
+    {
+        $terms = $this->parseSearchString($searchString);
+        $entityTypes = ['page', 'chapter'];
+        $entityTypesToSearch = isset($terms['filters']['type']) ? explode('|', $terms['filters']['type']) : $entityTypes;
+
+        $results = collect();
+        foreach ($entityTypesToSearch as $entityType) {
+            if (!in_array($entityType, $entityTypes)) continue;
+            $search = $this->buildEntitySearchQuery($terms, $entityType)->where('book_id', '=', $bookId)->take(20)->get();
+            $results = $results->merge($search);
+        }
+        return $results->sortByDesc('score')->take(20);
+    }
+
+    /**
+     * Search a book for entities
+     * @param integer $chapterId
+     * @param string $searchString
+     * @return Collection
+     */
+    public function searchChapter($chapterId, $searchString)
+    {
+        $terms = $this->parseSearchString($searchString);
+        $pages = $this->buildEntitySearchQuery($terms, 'page')->where('chapter_id', '=', $chapterId)->take(20)->get();
+        return $pages->sortByDesc('score');
+    }
+
     /**
      * Search across a particular entity type.
      * @param array $terms
@@ -96,6 +141,21 @@ class SearchService
      * @return \Illuminate\Database\Eloquent\Collection|int|static[]
      */
     public function searchEntityTable($terms, $entityType = 'page', $page = 1, $count = 20, $getCount = false)
+    {
+        $query = $this->buildEntitySearchQuery($terms, $entityType);
+        if ($getCount) return $query->count();
+
+        $query = $query->skip(($page-1) * $count)->take($count);
+        return $query->get();
+    }
+
+    /**
+     * Create a search query for an entity
+     * @param array $terms
+     * @param string $entityType
+     * @return \Illuminate\Database\Eloquent\Builder
+     */
+    protected function buildEntitySearchQuery($terms, $entityType = 'page')
     {
         $entity = $this->getEntity($entityType);
         $entitySelect = $entity->newQuery();
@@ -103,6 +163,7 @@ class SearchService
         // Handle normal search terms
         if (count($terms['search']) > 0) {
             $subQuery = $this->db->table('search_terms')->select('entity_id', 'entity_type', \DB::raw('SUM(score) as score'));
+            $subQuery->where('entity_type', '=', 'BookStack\\' . ucfirst($entityType));
             $subQuery->where(function(Builder $query) use ($terms) {
                 foreach ($terms['search'] as $inputTerm) {
                     $query->orWhere('term', 'like', $inputTerm .'%');
@@ -137,11 +198,7 @@ class SearchService
             if (method_exists($this, $functionName)) $this->$functionName($entitySelect, $entity, $filterValue);
         }
 
-        $query = $this->permissionService->enforceEntityRestrictions($entityType, $entitySelect, 'view');
-        if ($getCount) return $query->count();
-
-        $query = $query->skip(($page-1) * $count)->take($count);
-        return $query->get();
+        return $this->permissionService->enforceEntityRestrictions($entityType, $entitySelect, 'view');
     }