ajout fonction js pour update les stats

This commit is contained in:
2022-12-26 13:36:10 +01:00
parent 3d481f5a74
commit c3722a431c
4 changed files with 44 additions and 20 deletions

View File

@@ -26,7 +26,6 @@ const addAuteur = (author) => {
const addSpecificRating = (reviewId, label, value) => { const addSpecificRating = (reviewId, label, value) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const sql = "INSERT INTO borne_notes_autre(critere_id, avis_id, note) VALUES ((SELECT id FROM borne_criteres WHERE borne_criteres.nom = ?), ?, ?)" const sql = "INSERT INTO borne_notes_autre(critere_id, avis_id, note) VALUES ((SELECT id FROM borne_criteres WHERE borne_criteres.nom = ?), ?, ?)"
console.log(sql);
conn.query(sql, [label,reviewId, value], (err, res) => { conn.query(sql, [label,reviewId, value], (err, res) => {
if(err) { if(err) {
reject(err); reject(err);

View File

@@ -7,6 +7,7 @@ const conn = mysql.createConnection({
user: process.env.DB_USER, user: process.env.DB_USER,
password: process.env.DB_PASSWORD, password: process.env.DB_PASSWORD,
database: process.env.DB_NAME, database: process.env.DB_NAME,
multipleStatements: true,
}); });
conn.connect(); conn.connect();

View File

@@ -1,6 +1,21 @@
import conn from '../database'; import conn from '../database.js';
import fs from "fs";
export const udpateDay = () => {
const sql = "SELECT AVG(note_principale) INTO @moyenne_globale FROM borne_avis WHERE date > DATE_ADD(NOW(), INTERVAL -1 DAY);";
export const computeStats = async (timePeriod, generalTableName, otherTableName) => {
return new Promise((resolve, reject) => {
let sql = fs.readFileSync("stats/update_stats.sql").toString();
sql = sql
.replace(new RegExp("DAY_COUNT_DELAY",'g'), timePeriod.toString())
.replace(new RegExp("STATS_GENERAL_TABLE_NAME", 'g'), generalTableName)
.replace(new RegExp('STATS_AUTRES_TABLE_NAME', 'g'), otherTableName)
conn.query(sql, (err, res) => {
if(err) {
reject(err)
}else {
resolve(res.insertId);
}
});
})
} }
// computeStats(7,"stats_general_semaine","stats_autres_semaine").then(() => {console.log("OK")});

View File

@@ -1,37 +1,46 @@
SET @date_limite = DATE_ADD(NOW(), INTERVAL -1 DAY); /*
Dans cette requête il faut replacer DAY_COUNT_DELAY par le nombre de jours sur lequel calculer les stats, STATS_GENERAL_TABLE_NAME par la table dans laquelle mettre les stats globales (par exemple stats_general_jour si les valeurs sont calculées sur 1 jour) et pareil pour STATS_AUTRES_TABLE_NAME
C'est un peu bizzare comme technique mais j'ai pas trouvé de meilleur solution
*/
SET @date_limite = DATE_ADD(NOW(), INTERVAL -DAY_COUNT_DELAY DAY);
/*
On récupère les notes notes moyennes sur la periode, en séparant global, borne et site
*/
-- On récupère les notes notes moyennes sur la periode, en séparant global, borne et site
SELECT @moyenne_globale:=AVG(note_principale) SELECT @moyenne_globale:=AVG(note_principale)
FROM borne_avis FROM borne_avis
WHERE date > @date_limite; WHERE borne_avis.date > @date_limite;
SELECT @moyenne_borne:=AVG(note_principale) SELECT @moyenne_borne:=AVG(note_principale)
FROM borne_avis FROM borne_avis
JOIN sources ON sources.id = borne_avis.source_id JOIN sources ON sources.id = borne_avis.source_id
WHERE date > @date_limite AND sources.nom = "borne"; WHERE borne_avis.date > @date_limite AND sources.nom = "borne";
SELECT @moyenne_site:=AVG(note_principale) SELECT @moyenne_site:=AVG(note_principale)
FROM borne_avis FROM borne_avis
JOIN sources ON sources.id = borne_avis.source_id JOIN sources ON sources.id = borne_avis.source_id
WHERE date > @date_limite AND sources.nom = "website"; WHERE borne_avis.date > @date_limite AND sources.nom = "website";
/*
On récupère la distribution de sexes
*/
-- On récupère la distribution de sexes
SELECT @stats_f:=COUNT(*) FROM borne_avis SELECT @stats_f:=COUNT(*) FROM borne_avis
JOIN borne_auteurs ON borne_avis.id_auteur = borne_auteurs.id JOIN borne_auteurs ON borne_avis.id_auteur = borne_auteurs.id
WHERE sexe='f' WHERE date > @date_limite; WHERE sexe='f' AND date > @date_limite;
SELECT @stats_h:=COUNT(*) FROM borne_avis SELECT @stats_h:=COUNT(*) FROM borne_avis
JOIN borne_auteurs ON borne_avis.id_auteur = borne_auteurs.id JOIN borne_auteurs ON borne_avis.id_auteur = borne_auteurs.id
WHERE sexe='h' WHERE date > @date_limite; WHERE sexe='h' AND date > @date_limite;
SELECT @stats_a:=COUNT(*) FROM borne_avis SELECT @stats_a:=COUNT(*) FROM borne_avis
JOIN borne_auteurs ON borne_avis.id_auteur = borne_auteurs.id JOIN borne_auteurs ON borne_avis.id_auteur = borne_auteurs.id
WHERE sexe='a' WHERE date > @date_limite; WHERE sexe='a' AND date > @date_limite;
SET @dist_sexe = CONCAT(@stats_f,",",@stats_h,",",@stats_a); SET @dist_sexe = CONCAT(@stats_f,",",@stats_h,",",@stats_a);
INSERT INTO stats_general_jour (moyenne_globale, moyenne_borne, moyenne_site) VALUES (@moyenne_globale, @moyenne_borne, @moyenne_site); INSERT INTO STATS_GENERAL_TABLE_NAME (moyenne_globale, moyenne_borne, moyenne_site, dist_sexe) VALUES (@moyenne_globale, @moyenne_borne, @moyenne_site, @dist_sexe);
INSERT INTO STATS_AUTRES_TABLE_NAME (critere_id, note)
INSERT INTO stats_autres_jour (critere_id, note) SELECT critere_id, AVG(note) as moyenne FROM borne_notes_autre
SELECT critere_id, AVG(note) as moyenne FROM `borne_notes_autre` WHERE borne_notes_autre.date > @date_limite
GROUP BY critere_id GROUP BY critere_id
WHERE date > @date_limite