diff --git a/app/Services/SearchService.php b/app/Services/SearchService.php index 6390b8bc4..dfde645a1 100644 --- a/app/Services/SearchService.php +++ b/app/Services/SearchService.php @@ -1,6 +1,7 @@ searchTerm = $searchTerm; + $this->bookshelf = $bookshelf; $this->book = $book; $this->chapter = $chapter; $this->page = $page; $this->db = $db; $this->entities = [ + 'bookshelf' => $this->bookshelf, 'page' => $this->page, 'chapter' => $this->chapter, 'book' => $this->book @@ -65,6 +74,7 @@ class SearchService * @param string $entityType * @param int $page * @param int $count - Count of each entity to search, Total returned could can be larger and not guaranteed. + * @param string $action * @return array[int, Collection]; */ public function searchEntities($searchString, $entityType = 'all', $page = 1, $count = 20, $action = 'view') @@ -370,20 +380,12 @@ class SearchService { $this->searchTerm->truncate(); - // Chunk through all books - $this->book->chunk(1000, function ($books) { - $this->indexEntities($books); - }); - - // Chunk through all chapters - $this->chapter->chunk(1000, function ($chapters) { - $this->indexEntities($chapters); - }); - - // Chunk through all pages - $this->page->chunk(1000, function ($pages) { - $this->indexEntities($pages); - }); + foreach ($this->entities as $entityModel) { + $selectFields = ['id', 'name', $entityModel->textField]; + $entityModel->newQuery()->select($selectFields)->chunk(1000, function ($entities) { + $this->indexEntities($entities); + }); + } } /** diff --git a/resources/assets/js/vues/search.js b/resources/assets/js/vues/search.js index c04104633..2224e8ddd 100644 --- a/resources/assets/js/vues/search.js +++ b/resources/assets/js/vues/search.js @@ -7,7 +7,8 @@ let data = { type: { page: true, chapter: true, - book: true + book: true, + bookshelf: true, }, exactTerms: [], tagTerms: [], @@ -46,11 +47,7 @@ let methods = { exactChange() { let exactFilter = /"(.+?)"/g; this.termString = this.termString.replace(exactFilter, ''); - let matchesTerm = this.search.exactTerms.filter(term => { - return term.trim() !== ''; - }).map(term => { - return `"${term}"` - }).join(' '); + let matchesTerm = this.search.exactTerms.filter(term => term.trim() !== '').map(term => `"${term}"`).join(' '); this.appendTerm(matchesTerm); }, @@ -105,23 +102,24 @@ let methods = { let match = searchString.match(typeFilter); let type = this.search.type; if (!match) { - type.page = type.book = type.chapter = true; + type.page = type.book = type.chapter = type.bookshelf = true; return; } let splitTypes = match[1].replace(/ /g, '').split('|'); type.page = (splitTypes.indexOf('page') !== -1); type.chapter = (splitTypes.indexOf('chapter') !== -1); type.book = (splitTypes.indexOf('book') !== -1); + type.bookshelf = (splitTypes.indexOf('bookshelf') !== -1); }, typeChange() { let typeFilter = /{\s?type:\s?(.*?)\s?}/; let type = this.search.type; - if (type.page === type.chapter && type.page === type.book) { + if (type.page === type.chapter === type.book === type.bookshelf) { this.termString = this.termString.replace(typeFilter, ''); return; } - let selectedTypes = Object.keys(type).filter(type => {return this.search.type[type];}).join('|'); + let selectedTypes = Object.keys(type).filter(type => this.search.type[type]).join('|'); let typeTerm = '{type:'+selectedTypes+'}'; if (this.termString.match(typeFilter)) { this.termString = this.termString.replace(typeFilter, typeTerm); diff --git a/resources/lang/en/entities.php b/resources/lang/en/entities.php index 55fac5d8f..810b25f45 100644 --- a/resources/lang/en/entities.php +++ b/resources/lang/en/entities.php @@ -69,6 +69,7 @@ return [ /** * Shelves */ + 'shelf' => 'Shelf', 'shelves' => 'Shelves', 'shelves_long' => 'Bookshelves', 'shelves_empty' => 'No shelves have been created', diff --git a/resources/views/search/all.blade.php b/resources/views/search/all.blade.php index 8274187e1..a952079d5 100644 --- a/resources/views/search/all.blade.php +++ b/resources/views/search/all.blade.php @@ -22,7 +22,9 @@
+
+
{{ trans('entities.search_exact_matches') }}
diff --git a/tests/Entity/EntitySearchTest.php b/tests/Entity/EntitySearchTest.php index 28c0f1764..4b2fd5663 100644 --- a/tests/Entity/EntitySearchTest.php +++ b/tests/Entity/EntitySearchTest.php @@ -1,6 +1,7 @@ assertSee($page->name); } + public function test_bookshelf_search() + { + $shelf = Bookshelf::first(); + $search = $this->asEditor()->get('/search?term=' . urlencode(mb_substr($shelf->name, 0, 3)) . ' {type:bookshelf}'); + $search->assertStatus(200); + $search->assertSee($shelf->name); + } + public function test_invalid_page_search() { $resp = $this->asEditor()->get('/search?term=' . urlencode('

test

'));