From a4cf3deb065825a2bdcdb7c95ff482e5ff266358 Mon Sep 17 00:00:00 2001 From: DariusIII Date: Thu, 19 Nov 2015 09:54:12 +0100 Subject: [PATCH] Rework book, movie, console queries, use ceil instead of round in pager --- Changelog | 1 + newznab/Books.php | 80 ++++------ newznab/Console.php | 85 +++++------ newznab/Movie.php | 139 +++++++++--------- newznab/build/nntmux.xml | 2 +- www/pages/books.php | 4 +- www/pages/console.php | 4 +- www/pages/movies.php | 4 +- .../charisma/templates/frontend/pager.tpl | 2 +- .../nntmux/templates/frontend/pager.tpl | 2 +- .../omicron/templates/frontend/pager.tpl | 2 +- 11 files changed, 144 insertions(+), 181 deletions(-) diff --git a/Changelog b/Changelog index 759798abd..25715595c 100755 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ 2015-11-19 DariusIII + Upd: Rework book, movie, console queries, use ceil instead of round in pager Upd: Add queryCalc function to DB class Upd: Add nfo to api 2015-11-18 DariusIII diff --git a/newznab/Books.php b/newznab/Books.php index 07a602c13..57c2274b2 100644 --- a/newznab/Books.php +++ b/newznab/Books.php @@ -152,28 +152,15 @@ class Books return $res['num']; } - public function getBookCount($cat, $maxage = -1, $excludedcats = []) - { - $res = $this->pdo->query( - sprintf(" - SELECT COUNT(DISTINCT r.bookinfoid) AS num - FROM releases r - INNER JOIN bookinfo boo ON boo.id = r.bookinfoid - WHERE r.nzbstatus = 1 - AND r.passwordstatus %s - AND boo.title != '' - AND boo.cover = 1 - AND %s %s %s %s", - Releases::showPasswords($this->pdo), - $this->getBrowseBy(), - (count($cat) > 0 && $cat[0] != -1 ? (new Category(['Settings' => $this->pdo]))->getCategorySearch($cat) : ''), - ($maxage > 0 ? sprintf(' AND r.postdate > NOW() - INTERVAL %d DAY ', $maxage) : ''), - (count($excludedcats) > 0 ? ' AND r.categoryid NOT IN (' . implode(',', $excludedcats) . ')' : '') - ), true, NN_CACHE_EXPIRY_MEDIUM - ); - return (isset($res[0]["num"]) ? $res[0]["num"] : 0); - } - + /** + * @param $cat + * @param $start + * @param $num + * @param $orderby + * @param array $excludedcats + * + * @return array + */ public function getBookRange($cat, $start, $num, $orderby, $excludedcats = []) { @@ -196,18 +183,19 @@ class Books $order = $this->getBookOrder($orderby); - $books = $this->pdo->query( + $books = $this->pdo->queryCalc( sprintf(" - SELECT boo.id - FROM bookinfo boo - LEFT JOIN releases r ON boo.id = r.bookinfoid - WHERE r.nzbstatus = 1 - AND boo.cover = 1 - AND boo.title != '' - AND r.passwordstatus %s - AND %s %s %s %s - GROUP BY boo.id - ORDER BY %s %s %s", + SELECT SQL_CALC_FOUND_ROWS boo.id, + GROUP_CONCAT(r.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_id + FROM bookinfo boo + LEFT JOIN releases r ON boo.id = r.bookinfoid + WHERE r.nzbstatus = 1 + AND boo.cover = 1 + AND boo.title != '' + AND r.passwordstatus %s + AND %s %s %s %s + GROUP BY boo.id + ORDER BY %s %s %s", Releases::showPasswords($this->pdo), $browseby, $catsrch, @@ -219,11 +207,12 @@ class Books ), true, NN_CACHE_EXPIRY_MEDIUM ); - $bookIDs = false; + $bookIDs = $releaseIDs = false; - if (is_array($books)) { - foreach ($books AS $book => $id) { + if (is_array($books['result'])) { + foreach ($books['result'] AS $book => $id) { $bookIDs[] = $id['id']; + $releaseIDs[] = $id['grp_release_id']; } } @@ -250,25 +239,20 @@ class Books LEFT OUTER JOIN groups g ON g.id = r.groupid LEFT OUTER JOIN releasenfo rn ON rn.releaseid = r.id INNER JOIN bookinfo boo ON boo.id = r.bookinfoid - WHERE r.nzbstatus = 1 - AND boo.id IN (%s) - AND boo.cover = 1 - AND boo.title != '' - AND r.passwordstatus %s - AND %s %s %s %s + WHERE boo.id IN (%s) + AND r.id IN (%s) + AND %s GROUP BY boo.id ORDER BY %s %s", (is_array($bookIDs) ? implode(',', $bookIDs) : -1), - Releases::showPasswords($this->pdo), - $browseby, + (is_array($releaseIDs) ? implode(',', $releaseIDs) : -1), $catsrch, - $maxage, - $exccatlist, $order[0], $order[1] ); - - return $this->pdo->query($sql, true, NN_CACHE_EXPIRY_MEDIUM); + $return = $this->pdo->query($sql, true, NN_CACHE_EXPIRY_MEDIUM); + $return[0]['_totalcount'] = (isset($books['total']) ? $books['total'] : 0); + return $return; } diff --git a/newznab/Console.php b/newznab/Console.php index c8409f46f..ed7771ef7 100644 --- a/newznab/Console.php +++ b/newznab/Console.php @@ -148,35 +148,17 @@ class Console return ($res === false ? 0 : $res['num']); } - public function getConsoleCount($cat, $maxage = -1, $excludedcats = []) - { - $catsrch = ''; - if (count($cat) > 0 && $cat[0] != -1) { - $catsrch = (new Category(['Settings' => $this->pdo]))->getCategorySearch($cat); - } - - $res = $this->pdo->query( - sprintf(" - SELECT COUNT(DISTINCT r.consoleinfoid) AS num - FROM releases r - INNER JOIN consoleinfo con ON con.id = r.consoleinfoid AND con.title != '' AND con.cover = 1 - WHERE r.nzbstatus = 1 - AND r.passwordstatus %s - AND con.title != '' - AND %s %s %s %s", - Releases::showPasswords($this->pdo), - $this->getBrowseBy(), - $catsrch, - ($maxage > 0 ? sprintf(' AND r.postdate > NOW() - INTERVAL %d DAY ', $maxage) : ''), - (count($excludedcats) > 0 ? (' AND r.categoryid NOT IN (' . implode(',', $excludedcats) . ')') : '') - ), true, NN_CACHE_EXPIRY_MEDIUM - ); - return (isset($res[0]["num"]) ? $res[0]["num"] : 0); - } - + /** + * @param $cat + * @param $start + * @param $num + * @param $orderby + * @param array $excludedcats + * + * @return array + */ public function getConsoleRange($cat, $start, $num, $orderby, $excludedcats = []) { - $browseby = $this->getBrowseBy(); $catsrch = ''; @@ -191,18 +173,19 @@ class Console $order = $this->getConsoleOrder($orderby); - $consoles = $this->pdo->query( + $consoles = $this->pdo->queryCalc( sprintf(" - SELECT con.id - FROM consoleinfo con - LEFT JOIN releases r ON con.id = r.consoleinfoid - WHERE r.nzbstatus = 1 - AND con.title != '' - AND con.cover = 1 - AND r.passwordstatus %s - AND %s %s %s - GROUP BY con.id - ORDER BY %s %s %s", + SELECT SQL_CALC_FOUND_ROWS con.id, + GROUP_CONCAT(r.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_id + FROM consoleinfo con + LEFT JOIN releases r ON con.id = r.consoleinfoid + WHERE r.nzbstatus = 1 + AND con.title != '' + AND con.cover = 1 + AND r.passwordstatus %s + AND %s %s %s + GROUP BY con.id + ORDER BY %s %s %s", Releases::showPasswords($this->pdo), $browseby, $catsrch, @@ -213,15 +196,16 @@ class Console ), true, NN_CACHE_EXPIRY_MEDIUM ); - $consoleIDs = false; + $consoleIDs = $releaseIDs = false; - if (is_array($consoles)) { - foreach ($consoles AS $console => $id) { + if (is_array($consoles['result'])) { + foreach ($consoles['result'] AS $console => $id) { $consoleIDs[] = $id['id']; + $releaseIDs[] = $id['grp_release_id']; } } - return $this->pdo->query( + $return = $this->pdo->query( sprintf(" SELECT GROUP_CONCAT(r.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_id, @@ -246,24 +230,21 @@ class Console LEFT OUTER JOIN groups g ON g.id = r.groupid LEFT OUTER JOIN releasenfo rn ON rn.releaseid = r.id INNER JOIN consoleinfo con ON con.id = r.consoleinfoid - INNER JOIN genres ON con.genreid = genres.id - WHERE r.nzbstatus = 1 - AND con.id IN (%s) - AND con.title != '' - AND con.cover = 1 - AND r.passwordstatus %s - AND %s %s %s + INNER JOIN genres ON con.genre_id = genres.id + WHERE con.id IN (%s) + AND r.id IN (%s) + AND %s GROUP BY con.id ORDER BY %s %s", (is_array($consoleIDs) ? implode(',', $consoleIDs) : -1), - Releases::showPasswords($this->pdo), - $browseby, + (is_array($releaseIDs) ? implode(',', $releaseIDs) : -1), $catsrch, - $exccatlist, $order[0], $order[1] ), true, NN_CACHE_EXPIRY_MEDIUM ); + $return[0]['_totalcount'] = (isset($consoles['total']) ? $consoles['total'] : 0); + return $return; } public function getConsoleOrder($orderby) diff --git a/newznab/Movie.php b/newznab/Movie.php index 9cccc9183..c48cedbe5 100644 --- a/newznab/Movie.php +++ b/newznab/Movie.php @@ -243,42 +243,6 @@ class Movie return ($res === false ? 0 : $res['num']); } - /** - * Get count of movies for movies browse page. - * - * @param $cat - * @param $maxAge - * @param array $excludedCats - * - * @return int - */ - public function getMovieCount($cat, $maxAge = -1, $excludedCats = []) - { - $catsrch = ''; - if (count($cat) > 0 && $cat[0] != -1) { - $catsrch = (new Category(['Settings' => $this->pdo]))->getCategorySearch($cat); - } - - $res = $this->pdo->query( - sprintf(" - SELECT COUNT(DISTINCT r.imdbid) AS num - FROM releases r - INNER JOIN movieinfo m ON m.imdbid = r.imdbid - WHERE r.nzbstatus = 1 - AND r.imdbid != '0000000' - AND m.title != '' - AND r.passwordstatus %s - AND %s %s %s %s ", - $this->showPasswords, - $this->getBrowseBy(), - $catsrch, - ($maxAge > 0 ? 'AND r.postdate > NOW() - INTERVAL ' . $maxAge . ' DAY' : ''), - (count($excludedCats) > 0 ? ' AND r.categoryid NOT IN (' . implode(',', $excludedCats) . ')' : '') - ), true, NN_CACHE_EXPIRY_MEDIUM - ); - return (isset($res[0]["num"]) ? $res[0]["num"] : 0); - } - /** * Get movie releases with covers for movie browse page. * @@ -289,7 +253,7 @@ class Movie * @param $maxAge * @param array $excludedCats * - * @return bool PDOStatement + * @return bool|\PDOStatement */ public function getMovieRange($cat, $start, $num, $orderBy, $maxAge = -1, $excludedCats = []) { @@ -299,42 +263,81 @@ class Movie } $order = $this->getMovieOrder($orderBy); + + $movies = $this->pdo->queryCalc( + sprintf(" + SELECT SQL_CALC_FOUND_ROWS + m.imdbid, + GROUP_CONCAT(r.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_id + FROM movieinfo m + LEFT JOIN releases r USING (imdbid) + WHERE r.nzbstatus = 1 + AND m.title != '' + AND m.imdbid != '0000000' + AND r.passwordstatus %s + AND %s %s %s %s + GROUP BY m.imdbid + ORDER BY %s %s %s", + $this->showPasswords, + $this->getBrowseBy(), + $catsrch, + ($maxAge > 0 + ? 'AND r.postdate > NOW() - INTERVAL ' . $maxAge . 'DAY ' + : '' + ), + (count($excludedCats) > 0 ? ' AND r.categoryid NOT IN (' . implode(',', $excludedCats) . ')' : ''), + $order[0], + $order[1], + ($start === false ? '' : ' LIMIT ' . $num . ' OFFSET ' . $start) + ), true, NN_CACHE_EXPIRY_MEDIUM + ); + + $movieIDs = $releaseIDs = false; + + if (is_array($movies['result'])) { + foreach ($movies['result'] AS $movie => $id) { + $movieIDs[] = $id['imdbid']; + $releaseIDs[] = $id['grp_release_id']; + } + } + $sql = sprintf(" SELECT - GROUP_CONCAT(r.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_id, - GROUP_CONCAT(r.rarinnerfilecount ORDER BY r.postdate DESC SEPARATOR ',') as grp_rarinnerfilecount, - GROUP_CONCAT(r.haspreview ORDER BY r.postdate DESC SEPARATOR ',') AS grp_haspreview, - GROUP_CONCAT(r.passwordstatus ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_password, - GROUP_CONCAT(r.guid ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_guid, - GROUP_CONCAT(rn.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_nfoid, - GROUP_CONCAT(groups.name ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_grpname, - GROUP_CONCAT(r.searchname ORDER BY r.postdate DESC SEPARATOR '#') AS grp_release_name, - GROUP_CONCAT(r.postdate ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_postdate, - GROUP_CONCAT(r.size ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_size, - GROUP_CONCAT(r.totalpart ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_totalparts, - GROUP_CONCAT(r.comments ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_comments, - GROUP_CONCAT(r.grabs ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_grabs, - m.*, groups.name AS group_name, rn.id as nfoid FROM releases r - LEFT OUTER JOIN groups ON groups.id = r.groupid + GROUP_CONCAT(r.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_id, + GROUP_CONCAT(r.rarinnerfilecount ORDER BY r.postdate DESC SEPARATOR ',') AS grp_rarinnerfilecount, + GROUP_CONCAT(r.haspreview ORDER BY r.postdate DESC SEPARATOR ',') AS grp_haspreview, + GROUP_CONCAT(r.passwordstatus ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_password, + GROUP_CONCAT(r.guid ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_guid, + GROUP_CONCAT(rn.id ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_nfoid, + GROUP_CONCAT(g.name ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_grpname, + GROUP_CONCAT(r.searchname ORDER BY r.postdate DESC SEPARATOR '#') AS grp_release_name, + GROUP_CONCAT(r.postdate ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_postdate, + GROUP_CONCAT(r.size ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_size, + GROUP_CONCAT(r.totalpart ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_totalparts, + GROUP_CONCAT(r.comments ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_comments, + GROUP_CONCAT(r.grabs ORDER BY r.postdate DESC SEPARATOR ',') AS grp_release_grabs, + m.*, + g.name AS group_name, + rn.id AS nfoid + FROM releases r + LEFT OUTER JOIN groups g ON g.id = r.groupid LEFT OUTER JOIN releasenfo rn ON rn.releaseid = r.id INNER JOIN movieinfo m ON m.imdbid = r.imdbid - WHERE r.nzbstatus = 1 AND r.imdbid != '0000000' - AND m.title != '' - AND r.passwordstatus %s AND %s %s %s %s - GROUP BY m.imdbid ORDER BY %s %s %s", - $this->showPasswords, - $this->getBrowseBy(), - $catsrch, - ($maxAge > 0 - ? 'AND r.postdate > NOW() - INTERVAL ' . $maxAge . 'DAY ' - : '' - ), - (count($excludedCats) > 0 ? ' AND r.categoryid NOT IN (' . implode(',', $excludedCats) . ')' : ''), - $order[0], - $order[1], - ($start === false ? '' : ' LIMIT ' . $num . ' OFFSET ' . $start) + WHERE m.imdbid IN (%s) + AND r.id IN (%s) + AND %s + GROUP BY m.imdbid + ORDER BY %s %s", + (is_array($movieIDs) ? implode(',', $movieIDs) : -1), + (is_array($releaseIDs) ? implode(',', $releaseIDs) : -1), + $catsrch, + $order[0], + $order[1] ); - return $this->pdo->query($sql, true, NN_CACHE_EXPIRY_MEDIUM); + $return = $this->pdo->query($sql, true, NN_CACHE_EXPIRY_MEDIUM); + $return[0]['_totalcount'] = (isset($movies['total']) ? $movies['total'] : 0); + + return $return; } /** diff --git a/newznab/build/nntmux.xml b/newznab/build/nntmux.xml index 939169956..08c0a0d11 100755 --- a/newznab/build/nntmux.xml +++ b/newznab/build/nntmux.xml @@ -12,6 +12,6 @@ 9 - 4405 + 4406 diff --git a/www/pages/books.php b/www/pages/books.php index ef5b00050..fea9ecccd 100644 --- a/www/pages/books.php +++ b/www/pages/books.php @@ -28,8 +28,6 @@ $catarray[] = $category; $page->smarty->assign('catlist', $btmp); $page->smarty->assign('category', $category); -$browsecount = $book->getBookCount($catarray, -1, $page->userdata["categoryexclusions"]); - $offset = (isset($_REQUEST["offset"]) && ctype_digit($_REQUEST['offset'])) ? $_REQUEST["offset"] : 0; $ordering = $book->getBookOrdering(); $orderby = isset($_REQUEST["ob"]) && in_array($_REQUEST['ob'], $ordering) ? $_REQUEST["ob"] : ''; @@ -58,7 +56,7 @@ $page->smarty->assign('title', $title); $browseby_link = '&title=' . $title . '&author=' . $author; -$page->smarty->assign('pagertotalitems', $browsecount); +$page->smarty->assign('pagertotalitems', $results[0]['_totalcount']); $page->smarty->assign('pageroffset', $offset); $page->smarty->assign('pageritemsperpage', ITEMS_PER_COVER_PAGE); $page->smarty->assign('pagerquerybase', WWW_TOP . "/books?t=" . $category . $browseby_link . "&ob=" . $orderby . "&offset="); diff --git a/www/pages/console.php b/www/pages/console.php index dee8d1624..9d06d2af9 100644 --- a/www/pages/console.php +++ b/www/pages/console.php @@ -30,8 +30,6 @@ $catarray[] = $category; $page->smarty->assign('catlist', $ctmp); $page->smarty->assign('category', $category); -$browsecount = $console->getConsoleCount($catarray, -1, $page->userdata["categoryexclusions"]); - $offset = (isset($_REQUEST["offset"]) && ctype_digit($_REQUEST['offset'])) ? $_REQUEST["offset"] : 0; $ordering = $console->getConsoleOrdering(); $orderby = isset($_REQUEST["ob"]) && in_array($_REQUEST['ob'], $ordering) ? $_REQUEST["ob"] : ''; @@ -69,7 +67,7 @@ $page->smarty->assign('genre', $genre); $browseby_link = '&title=' . $title . '&platform=' . $platform; -$page->smarty->assign('pagertotalitems', $browsecount); +$page->smarty->assign('pagertotalitems', $results[0]['_totalcount']); $page->smarty->assign('pageroffset', $offset); $page->smarty->assign('pageritemsperpage', ITEMS_PER_COVER_PAGE); $page->smarty->assign('pagerquerybase', WWW_TOP . "/console?t=" . $category . $browseby_link . "&ob=" . $orderby . "&offset="); diff --git a/www/pages/movies.php b/www/pages/movies.php index c9237a835..83f18215f 100644 --- a/www/pages/movies.php +++ b/www/pages/movies.php @@ -38,8 +38,6 @@ if ($category != -1) { $page->smarty->assign('catlist', $mtmp); $page->smarty->assign('category', $category); -$browsecount = $movie->getMovieCount($catarray, -1, $page->userdata["categoryexclusions"]); - $offset = (isset($_REQUEST["offset"]) && ctype_digit($_REQUEST['offset'])) ? $_REQUEST["offset"] : 0; $ordering = $movie->getMovieOrdering(); $orderby = isset($_REQUEST["ob"]) && in_array($_REQUEST['ob'], $ordering) ? $_REQUEST["ob"] : ''; @@ -83,7 +81,7 @@ $page->smarty->assign('year', $year); $browseby_link = '&title='.$title.'&actors='.$actors.'&director='.$director.'&rating='.$rating.'&genre='.$genre.'&year='.$year; -$page->smarty->assign('pagertotalitems',$browsecount); +$page->smarty->assign('pagertotalitems', $results[0]['_totalcount']); $page->smarty->assign('pageroffset',$offset); $page->smarty->assign('pageritemsperpage',ITEMS_PER_COVER_PAGE); $page->smarty->assign('pagerquerybase', WWW_TOP."/movies?t=".$category.$browseby_link."&ob=".$orderby."&offset="); diff --git a/www/themes/charisma/templates/frontend/pager.tpl b/www/themes/charisma/templates/frontend/pager.tpl index 15a1f8d9b..3657eb7cf 100644 --- a/www/themes/charisma/templates/frontend/pager.tpl +++ b/www/themes/charisma/templates/frontend/pager.tpl @@ -1,4 +1,4 @@ -{assign var="pages" value=($pagertotalitems/$pageritemsperpage)|round} +{assign var="pages" value=($pagertotalitems/$pageritemsperpage)|ceil} {assign var="currentpage" value=($pageroffset+$pageritemsperpage)/$pageritemsperpage} {assign var="upperhalfwaypoint" value=((($pages-$currentpage)/2)|round)+$currentpage} {if $pages > 1} diff --git a/www/themes/nntmux/templates/frontend/pager.tpl b/www/themes/nntmux/templates/frontend/pager.tpl index 15a1f8d9b..3657eb7cf 100644 --- a/www/themes/nntmux/templates/frontend/pager.tpl +++ b/www/themes/nntmux/templates/frontend/pager.tpl @@ -1,4 +1,4 @@ -{assign var="pages" value=($pagertotalitems/$pageritemsperpage)|round} +{assign var="pages" value=($pagertotalitems/$pageritemsperpage)|ceil} {assign var="currentpage" value=($pageroffset+$pageritemsperpage)/$pageritemsperpage} {assign var="upperhalfwaypoint" value=((($pages-$currentpage)/2)|round)+$currentpage} {if $pages > 1} diff --git a/www/themes/omicron/templates/frontend/pager.tpl b/www/themes/omicron/templates/frontend/pager.tpl index 15a1f8d9b..3657eb7cf 100644 --- a/www/themes/omicron/templates/frontend/pager.tpl +++ b/www/themes/omicron/templates/frontend/pager.tpl @@ -1,4 +1,4 @@ -{assign var="pages" value=($pagertotalitems/$pageritemsperpage)|round} +{assign var="pages" value=($pagertotalitems/$pageritemsperpage)|ceil} {assign var="currentpage" value=($pageroffset+$pageritemsperpage)/$pageritemsperpage} {assign var="upperhalfwaypoint" value=((($pages-$currentpage)/2)|round)+$currentpage} {if $pages > 1}