/packages/Books/BooksAnalytics.php
<?php
namespace Books;
class BooksAnalytics {
const MAX_BEST_POPULAR_ROWS = 10;
/** @type Book[] */
private $books;
/** @type bool */
private $wasListModified;
/** @type Book[] */
private $cachedMostPopular;
/**
* @param Book[] $books
*
* @return void
*/
public function setBooks (array $books) {
$this->books = $books;
$this->wasListModified = false;
}
/**
* @return array
*/
public function getAnalyticsData () {
return [
"most_popular" => $this->getMostPopularBooks(),
"last_loaded" => $this->getLastBooks(),
];
}
/**
* @return Book[]
*/
public function getMostPopularBooks () {
if ($this->wasListModified)
return $this->cachedMostPopular;
$downloads = [ ];
foreach ( $this->books as $book )
$this->modifyMostPopular($downloads, $book);
$this->wasListModified = true;
$this->cachedMostPopular = $downloads;
return $this->cachedMostPopular;
}
/**
* @return Book[]
*/
public function getLastBooks () {
$lastBooks = [ ];
// ...
return $lastBooks;
}
/**
* @return int
*/
public function getPublicationsCount () {
return $this->selectBooksCount() + $this->selectMagazinesCount();
}
/**
* @param Book[] $downloads
* @param Book $book
*
* @return void
*/
private function modifyMostPopular (array &$downloads, Book $book) {
if (count($downloads) > self::MAX_BEST_POPULAR_ROWS) {
if ($this->hasBookMoreDownloadsThanOneFromList($downloads, $book)) {
$this->sortBooksByDownloads($downloads);
$downloads[ self::MAX_BEST_POPULAR_ROWS - 1 ] = $book;
}
} else {
$downloads[] = $book;
}
}
private function selectBooksCount () {
return Book::selectTotalCountFromDb();
}
private function selectMagazinesCount () {
$count = 0;
// ...
return $count;
}
/**
* @param Book[] $downloads
* @param Book $book
*
* @return bool
*/
private function hasBookMoreDownloadsThanOneFromList (array &$downloads, Book $book) {
$n = count($downloads);
$has = false;
for ( $i = 0; $i < $n; $i ++ )
if ($book->getDownloadsCount() > $downloads[ $i ]->getDownloadsCount())
$has = true;
return $has;
}
/**
* @param Book[] $downloads
*
* @return Book[]
*/
private function sortBooksByDownloads (array &$downloads) {
$sortedByDownloads = $downloads;
// ...
return $sortedByDownloads;
}
}
/packages/Books/Book.php
<?php
namespace Books;
class Book {
public static function selectTotalCountFromDb () {
return self::selectTotalCountFromMySql();
}
public function getDownloadsCount () {
$downloads = 0;
// ...
return $downloads;
}
private static function selectTotalCountFromMySql () {
$count = 0;
// ...
return $count;
}
}