Change the search to look into tags and series (in addition to book title and author).

re #34, #47, #78
This commit is contained in:
Sébastien Lucas 2013-09-27 17:13:31 +02:00
parent acea490e00
commit 3943205b58
3 changed files with 30 additions and 10 deletions

View file

@ -664,18 +664,26 @@ class PageRecentBooks extends Page
class PageQueryResult extends Page class PageQueryResult extends Page
{ {
const SCOPE_TAG = "tag";
const SCOPE_SERIES = "series";
const SCOPE_AUTHOR = "author";
const SCOPE_BOOK = "book";
public function InitializeContent () public function InitializeContent ()
{ {
global $config; global $config;
$this->title = str_format (localize ("search.result"), $this->query); $this->title = str_format (localize ("search.result"), $this->query);
$currentPage = getURLParam ("current", NULL); $scope = getURLParam ("scope");
$crit = "%" . $this->query . "%";
$bad = "QQQQQ";
// Special case when we are doing a search and no database is selected // Special case when we are doing a search and no database is selected
if (is_array ($config['calibre_directory']) && is_null (GetUrlParam (DB))) { if (is_array ($config['calibre_directory']) && is_null (GetUrlParam (DB))) {
$i = 0; $i = 0;
foreach ($config['calibre_directory'] as $key => $value) { foreach ($config['calibre_directory'] as $key => $value) {
Base::clearDb (); Base::clearDb ();
list ($array, $totalNumber) = Book::getBooksByQuery ($this->query, $this->n, $i); list ($array, $totalNumber) = Book::getBooksByQuery (array ($crit, $crit, $crit, $crit), $this->n, $i);
array_push ($this->entryArray, new Entry ($key, DB . ":query:{$i}", array_push ($this->entryArray, new Entry ($key, DB . ":query:{$i}",
str_format (localize ("bookword", count($array)), count($array)), "text", str_format (localize ("bookword", count($array)), count($array)), "text",
array ( new LinkNavigation ("?" . DB . "={$i}&page=9&query=" . $this->query)))); array ( new LinkNavigation ("?" . DB . "={$i}&page=9&query=" . $this->query))));
@ -683,14 +691,23 @@ class PageQueryResult extends Page
} }
return; return;
} }
switch ($scope) {
switch ($currentPage) { case self::SCOPE_AUTHOR :
case Base::PAGE_ALL_AUTHORS :
case Base::PAGE_AUTHORS_FIRST_LETTER :
$this->entryArray = Author::getAuthorsByStartingLetter ('%' . $this->query); $this->entryArray = Author::getAuthorsByStartingLetter ('%' . $this->query);
break; break;
case self::SCOPE_TAG :
$this->entryArray = Tag::getAllTagsByQuery ($this->query);
break;
case self::SCOPE_SERIES :
$this->entryArray = Serie::getAllSeriesByQuery ($this->query);
break;
case self::SCOPE_BOOK :
list ($this->entryArray, $this->totalNumber) = Book::getBooksByQuery (
array ($bad, $bad, $bad, $crit), $this->n);
break;
default: default:
list ($this->entryArray, $this->totalNumber) = Book::getBooksByQuery ($this->query, $this->n); list ($this->entryArray, $this->totalNumber) = Book::getBooksByQuery (
array ($crit, $crit, $crit, $crit), $this->n);
} }
} }
} }

View file

@ -32,7 +32,11 @@ define ('SQL_BOOKS_BY_LANGUAGE', "select {0} from books_languages_link, books "
define ('SQL_BOOKS_BY_CUSTOM', "select {0} from {2}, books " . SQL_BOOKS_LEFT_JOIN . " define ('SQL_BOOKS_BY_CUSTOM', "select {0} from {2}, books " . SQL_BOOKS_LEFT_JOIN . "
where {2}.book = books.id and {2}.{3} = ? {1} order by sort"); where {2}.book = books.id and {2}.{3} = ? {1} order by sort");
define ('SQL_BOOKS_QUERY', "select {0} from books " . SQL_BOOKS_LEFT_JOIN . " define ('SQL_BOOKS_QUERY', "select {0} from books " . SQL_BOOKS_LEFT_JOIN . "
where (exists (select null from authors, books_authors_link where book = books.id and author = authors.id and authors.name like ?) or title like ?) {1} order by books.sort"); where (
exists (select null from authors, books_authors_link where book = books.id and author = authors.id and authors.name like ?) or
exists (select null from tags, books_tags_link where book = books.id and tag = tags.id and tags.name like ?) or
exists (select null from series, books_series_link on book = books.id and books_series_link.series = series.id and series.name like ?) or
title like ?) {1} order by books.sort");
define ('SQL_BOOKS_RECENT', "select {0} from books " . SQL_BOOKS_LEFT_JOIN . " define ('SQL_BOOKS_RECENT', "select {0} from books " . SQL_BOOKS_LEFT_JOIN . "
where 1=1 {1} order by timestamp desc limit "); where 1=1 {1} order by timestamp desc limit ");
@ -524,7 +528,7 @@ where data.book = books.id and data.id = ?');
} }
public static function getBooksByQuery($query, $n, $database = NULL) { public static function getBooksByQuery($query, $n, $database = NULL) {
return self::getEntryArray (self::SQL_BOOKS_QUERY, array ("%" . $query . "%", "%" . $query . "%"), $n, $database); return self::getEntryArray (self::SQL_BOOKS_QUERY, $query, $n, $database);
} }
public static function getAllBooks() { public static function getAllBooks() {

View file

@ -17,7 +17,6 @@
</button> </button>
</div> </div>
<div class="stop"> <div class="stop">
<input type="hidden" name="current" value="{{=it.page}}" />
<input type="hidden" name="page" value="9" /> <input type="hidden" name="page" value="9" />
{{? it.databaseId != ""}} {{? it.databaseId != ""}}
<input type="hidden" name="db" value="{{=it.databaseId}}" /> <input type="hidden" name="db" value="{{=it.databaseId}}" />