prefix}entry AS e , {$this->prefix}feed AS f WHERE e.id_feed = f.id AND f.priority = 10 SQL; $stm = $this->bd->prepare($sql); $stm->execute(); $res = $stm->fetchAll(PDO::FETCH_ASSOC); $repartition['main_stream'] = $res[0]; // Generates the repartition for all entries $sql = <<prefix}entry AS e SQL; $stm = $this->bd->prepare($sql); $stm->execute(); $res = $stm->fetchAll(PDO::FETCH_ASSOC); $repartition['all_feeds'] = $res[0]; return $repartition; } /** * Calculates entry count per day on a 30 days period. * Returns the result as a JSON string. * * @return string */ public function calculateEntryCount() { $count = $this->initEntryCountArray(); $period = self::ENTRY_COUNT_PERIOD; // Get stats per day for the last 30 days $sql = <<prefix}entry AS e WHERE FROM_UNIXTIME(e.date, '%Y%m%d') BETWEEN DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -{$period} DAY), '%Y%m%d') AND DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d') GROUP BY day ORDER BY day ASC SQL; $stm = $this->bd->prepare($sql); $stm->execute(); $res = $stm->fetchAll(PDO::FETCH_ASSOC); foreach ($res as $value) { $count[$value['day']] = (int) $value['count']; } return $this->convertToSerie($count); } /** * Initialize an array for the entry count. * * @return array */ protected function initEntryCountArray() { return array_map(function () { return 0; }, array_flip(range(-self::ENTRY_COUNT_PERIOD, -1))); } /** * Calculates feed count per category. * Returns the result as a JSON string. * * @return string */ public function calculateFeedByCategory() { $sql = <<prefix}category AS c, {$this->prefix}feed AS f WHERE c.id = f.category GROUP BY label ORDER BY data DESC SQL; $stm = $this->bd->prepare($sql); $stm->execute(); $res = $stm->fetchAll(PDO::FETCH_ASSOC); return $this->convertToPieSerie($res); } /** * Calculates entry count per category. * Returns the result as a JSON string. * * @return string */ public function calculateEntryByCategory() { $sql = <<prefix}category AS c, {$this->prefix}feed AS f, {$this->prefix}entry AS e WHERE c.id = f.category AND f.id = e.id_feed GROUP BY label ORDER BY data DESC SQL; $stm = $this->bd->prepare($sql); $stm->execute(); $res = $stm->fetchAll(PDO::FETCH_ASSOC); return $this->convertToPieSerie($res); } /** * Calculates the 10 top feeds based on their number of entries * * @return array */ public function calculateTopFeed() { $sql = <<prefix}category AS c, {$this->prefix}feed AS f, {$this->prefix}entry AS e WHERE c.id = f.category AND f.id = e.id_feed GROUP BY f.id ORDER BY count DESC LIMIT 10 SQL; $stm = $this->bd->prepare($sql); $stm->execute(); return $stm->fetchAll(PDO::FETCH_ASSOC); } /** * Calculates the last publication date for each feed * * @return array */ public function calculateFeedLastDate() { $sql = <<prefix}feed AS f, {$this->prefix}entry AS e WHERE f.id = e.id_feed GROUP BY f.id ORDER BY name SQL; $stm = $this->bd->prepare($sql); $stm->execute(); return $stm->fetchAll(PDO::FETCH_ASSOC); } protected function convertToSerie($data) { $serie = array(); foreach ($data as $key => $value) { $serie[] = array($key, $value); } return json_encode($serie); } protected function convertToPieSerie($data) { $serie = array(); foreach ($data as $value) { $value['data'] = array(array(0, (int) $value['data'])); $serie[] = $value; } return json_encode($serie); } }