Jelajahi Sumber

A bit more PostgreSQL

Simplified statistics https://github.com/FreshRSS/FreshRSS/pull/1250
Alexandre Alapetite 9 tahun lalu
induk
melakukan
dbc68590da
7 mengubah file dengan 21 tambahan dan 144 penghapusan
  1. 2 0
      CHANGELOG.md
  2. 1 1
      README.fr.md
  3. 1 1
      README.md
  4. 15 15
      app/Models/StatsDAO.php
  5. 0 125
      app/Models/StatsDAOPGSQL.php
  6. 1 1
      app/Models/StatsDAOSQLite.php
  7. 1 1
      app/install.php

+ 2 - 0
CHANGELOG.md

@@ -4,6 +4,8 @@
 
 * API
 	* Support for editing feeds and categories from client applications [#1254](https://github.com/FreshRSS/FreshRSS/issues/1254)
+* Compatibility:
+	* Experimental support for PostgreSQL [#1195](https://github.com/FreshRSS/FreshRSS/pull/1195)
 * Features
 	* Better control of number of entries per page or RSS feed [#1249](https://github.com/FreshRSS/FreshRSS/issues/1249)
 		* Since X hours: `https://freshrss.example/i/?a=rss&hours=3`

+ 1 - 1
README.fr.md

@@ -35,7 +35,7 @@ Nous sommes une communauté amicale.
 * PHP 5.3.3+ (PHP 5.4+ recommandé, et PHP 5.5+ pour les performances, et PHP 7+ pour d’encore meilleures performances)
 	* Requis : [DOM](http://php.net/dom), [XML](http://php.net/xml), [PDO_MySQL](http://php.net/pdo-mysql) ou [PDO_SQLite](http://php.net/pdo-sqlite) ou [PDO_PGSQL](http://php.net/pdo-pgsql), [cURL](http://php.net/curl)
 	* Recommandés : [JSON](http://php.net/json), [GMP](http://php.net/gmp) (pour accès API sur plateformes < 64 bits), [IDN](http://php.net/intl.idn) (pour les noms de domaines internationalisés), [mbstring](http://php.net/mbstring) et/ou [iconv](http://php.net/iconv) (pour conversion d’encodages), [Zip](http://php.net/zip) (pour import/export), [zlib](http://php.net/zlib) (pour les flux compressés)
-* MySQL 5.5.3+ (recommandé), ou SQLite 3.7.4+, ou PostgreSQL
+* MySQL 5.5.3+ (recommandé), ou SQLite 3.7.4+, ou PostgreSQL (experimental)
 * Un navigateur Web récent tel Firefox, Internet Explorer 11 / Edge, Chrome, Opera, Safari.
 	* Fonctionne aussi sur mobile
 

+ 1 - 1
README.md

@@ -35,7 +35,7 @@ We are a friendly community.
 * PHP 5.3.3+ (PHP 5.4+ recommended, and PHP 5.5+ for performance, and PHP 7 for even higher performance)
 	* Required extensions: [DOM](http://php.net/dom), [XML](http://php.net/xml), [PDO_MySQL](http://php.net/pdo-mysql) or [PDO_SQLite](http://php.net/pdo-sqlite) or [PDO_PGSQL](http://php.net/pdo-pgsql), [cURL](http://php.net/curl)
 	* Recommended extensions: [JSON](http://php.net/json), [GMP](http://php.net/gmp) (for API access on platforms < 64 bits), [IDN](http://php.net/intl.idn) (for Internationalized Domain Names), [mbstring](http://php.net/mbstring) and/or [iconv](http://php.net/iconv) (for charset conversion), [Zip](http://php.net/zip) (for import/export), [zlib](http://php.net/zlib) (for compressed feeds)
-* MySQL 5.5.3+ (recommended), or SQLite 3.7.4+, or PostgreSQL
+* MySQL 5.5.3+ (recommended), or SQLite 3.7.4+, or PostgreSQL (experimental)
 * A recent browser like Firefox, Internet Explorer 11 / Edge, Chrome, Opera, Safari.
 	* Works on mobile
 

+ 15 - 15
app/Models/StatsDAO.php

@@ -41,8 +41,8 @@ SELECT COUNT(1) AS total,
 COUNT(1) - SUM(e.is_read) AS count_unreads,
 SUM(e.is_read) AS count_reads,
 SUM(e.is_favorite) AS count_favorites
-FROM {$this->prefix}entry AS e
-, {$this->prefix}feed AS f
+FROM `{$this->prefix}entry` AS e
+, `{$this->prefix}feed` AS f
 WHERE e.id_feed = f.id
 {$filter}
 SQL;
@@ -68,7 +68,7 @@ SQL;
 		$sql = <<<SQL
 SELECT FLOOR((date - {$midnight}) / 86400) AS day,
 COUNT(*) as count
-FROM {$this->prefix}entry
+FROM `{$this->prefix}entry`
 WHERE date >= {$oldest} AND date < {$midnight}
 GROUP BY day
 ORDER BY day ASC
@@ -138,7 +138,7 @@ SQL;
 		$sql = <<<SQL
 SELECT DATE_FORMAT(FROM_UNIXTIME(e.date), '{$period}') AS period
 , COUNT(1) AS count
-FROM {$this->prefix}entry AS e
+FROM `{$this->prefix}entry` AS e
 {$restrict}
 GROUP BY period
 ORDER BY period ASC
@@ -202,7 +202,7 @@ SQL;
 SELECT COUNT(1) AS count
 , MIN(date) AS date_min
 , MAX(date) AS date_max
-FROM {$this->prefix}entry AS e
+FROM `{$this->prefix}entry` AS e
 {$restrict}
 SQL;
 		$stm = $this->bd->prepare($sql);
@@ -246,8 +246,8 @@ SQL;
 		$sql = <<<SQL
 SELECT c.name AS label
 , COUNT(f.id) AS data
-FROM {$this->prefix}category AS c,
-{$this->prefix}feed AS f
+FROM `{$this->prefix}category` AS c,
+`{$this->prefix}feed` AS f
 WHERE c.id = f.category
 GROUP BY label
 ORDER BY data DESC
@@ -269,9 +269,9 @@ SQL;
 		$sql = <<<SQL
 SELECT c.name AS label
 , COUNT(e.id) AS data
-FROM {$this->prefix}category AS c,
-{$this->prefix}feed AS f,
-{$this->prefix}entry AS e
+FROM `{$this->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
@@ -295,9 +295,9 @@ SELECT f.id AS id
 , MAX(f.name) AS name
 , MAX(c.name) AS category
 , COUNT(e.id) AS count
-FROM {$this->prefix}category AS c,
-{$this->prefix}feed AS f,
-{$this->prefix}entry AS e
+FROM `{$this->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
@@ -320,8 +320,8 @@ SELECT MAX(f.id) as id
 , MAX(f.name) AS name
 , MAX(date) AS last_date
 , COUNT(*) AS nb_articles
-FROM {$this->prefix}feed AS f,
-{$this->prefix}entry AS e
+FROM `{$this->prefix}feed` AS f,
+`{$this->prefix}entry` AS e
 WHERE f.id = e.id_feed
 GROUP BY f.id
 ORDER BY name

+ 0 - 125
app/Models/StatsDAOPGSQL.php

@@ -2,94 +2,6 @@
 
 class FreshRSS_StatsDAOPGSQL extends FreshRSS_StatsDAO {
 
-	/**
-	 * Calculates entry repartition for the selection.
-	 * The repartition includes:
-	 *   - total entries
-	 *   - read entries
-	 *   - unread entries
-	 *   - favorite entries
-	 *
-	 * @param null|integer $feed feed id
-	 * @param boolean $only_main
-	 * @return array
-	 */
-	public function calculateEntryRepartitionPerFeed($feed = null, $only_main = false) {
-		$filter = '';
-		if ($only_main) {
-			$filter .= 'AND f.priority = 10';
-		}
-		if (!is_null($feed)) {
-			$filter .= "AND e.id_feed = {$feed}";
-		}
-		$sql = <<<SQL
-SELECT COUNT(1) AS total,
-COUNT(1) - SUM(case when e.is_read then 1 else 0 end) AS unread,
-SUM(case when e.is_read then 1 else 0 end) AS read,
-SUM(case when e.is_favorite then 1 else 0 end) AS favorite
-FROM "{$this->prefix}entry" AS e
-, "{$this->prefix}feed" AS f
-WHERE e.id_feed = f.id
-{$filter}
-SQL;
-		$stm = $this->bd->prepare($sql);
-		$stm->execute();
-		$res = $stm->fetchAll(PDO::FETCH_ASSOC);
-
-		return $res[0];
-	}
-
-	/**
-	 * 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 = <<<SQL
-SELECT to_timestamp(e.date) - NOW() AS day,
-COUNT(1) AS count
-FROM "{$this->prefix}entry" AS e
-WHERE to_timestamp(e.date) BETWEEN NOW() - INTERVAL '{$period} DAYS' AND NOW() - INTERVAL '1 DAY'
-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);
-	}
-
-	/**
-	 * Calculates entry average per day on a 30 days period.
-	 *
-	 * @return integer
-	 */
-	public function calculateEntryAverage() {
-		$period = self::ENTRY_COUNT_PERIOD;
-
-		// Get stats per day for the last 30 days
-		$sql = <<<SQL
-SELECT COUNT(1) / {$period} AS average
-FROM "{$this->prefix}entry" AS e
-WHERE to_timestamp(e.date) BETWEEN NOW() - INTERVAL '{$period} DAYS' AND NOW() - INTERVAL '1 DAY'
-SQL;
-		$stm = $this->bd->prepare($sql);
-		$stm->execute();
-		$res = $stm->fetch(PDO::FETCH_NAMED);
-
-		return round($res['average'], 2);
-	}
-
 	/**
 	 * Calculates the number of article per hour of the day per feed
 	 *
@@ -152,41 +64,4 @@ SQL;
 		return $this->convertToSerie($repartition);
 	}
 
-	/**
-	 * Calculates the average number of article per feed
-	 *
-	 * @param float $period number used to divide the number of day in the period
-	 * @param integer $feed id
-	 * @return integer
-	 */
-	protected function calculateEntryAveragePerFeedPerPeriod($period, $feed = null) {
-		$restrict = '';
-		if ($feed) {
-			$restrict = "WHERE e.id_feed = {$feed}";
-		}
-		$sql = <<<SQL
-SELECT COUNT(1) AS count
-, MIN(date) AS date_min
-, MAX(date) AS date_max
-FROM "{$this->prefix}entry" AS e
-{$restrict}
-SQL;
-		$stm = $this->bd->prepare($sql);
-		$stm->execute();
-		$res = $stm->fetch(PDO::FETCH_NAMED);
-		$date_min = new \DateTime();
-		$date_min->setTimestamp($res['date_min']);
-		$date_max = new \DateTime();
-		$date_max->setTimestamp($res['date_max']);
-		$interval = $date_max->diff($date_min, true);
-		$interval_in_days = $interval->format('%a');
-		if ($interval_in_days <= 0) {
-			// Surely only one article.
-			// We will return count / (period/period) == count.
-			$interval_in_days = $period;
-		}
-
-		return $res['count'] / ($interval_in_days / $period);
-	}
-
 }

+ 1 - 1
app/Models/StatsDAOSQLite.php

@@ -11,7 +11,7 @@ class FreshRSS_StatsDAOSQLite extends FreshRSS_StatsDAO {
 		$sql = <<<SQL
 SELECT strftime('{$period}', e.date, 'unixepoch') AS period
 , COUNT(1) AS count
-FROM {$this->prefix}entry AS e
+FROM `{$this->prefix}entry` AS e
 {$restrict}
 GROUP BY period
 ORDER BY period ASC

+ 1 - 1
app/install.php

@@ -714,7 +714,7 @@ function printStep3() {
 				<?php if (extension_loaded('pdo_pgsql')) {?>
 				<option value="pgsql"
 					<?php echo(isset($_SESSION['bd_type']) && $_SESSION['bd_type'] === 'pgsql') ? 'selected="selected"' : ''; ?>>
-					PostgreSQL
+					PostgreSQL (⚠️ experimental)
 				</option>
 				<?php }?>
 				</select>