Commit 78a62055 authored by Dimitri Nicolas's avatar Dimitri Nicolas
Browse files

Merge branch 'menu_python' of https://gitlab.utc.fr/dnicolas/ai23-projet into menu_python

Marine's branch merged
parents a87d93ab 9d81191e
import psycopg2
import string
from DataMapper import *
class StatistiquesDataMapper(DataMapper):
# affiche la liste des exemplaires les plus emprunté dans l'ordre décroissant
def ressourcesPopulaires(self, conn) :
conn = self.connect()
try:
cursor : psycopg2.extensions.cursor = conn.cursor()
sql1 = "SELECT r.titre, COUNT(p.ref) nb_emprunt FROM Ressource r JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref GROUP BY r.titre HAVING COUNT(ep.ref) > 1 ORDER BY COUNT(ep.ref) DESC"
cursor.execute(sql1)
rows = cursor.fetchall()
return rows
except Exception as err:
print(err)
finally:
conn.close()
# print('Titre : {0} Nombre d\'emprunts : {1}\n'.format(row[0], row[1]))
# affiche le nombre de fois qu'une ressource en particulier a été empruntée
def nombreEmpruntRessource(self, codeUnique : int) :
conn = self.connect()
try:
cursor : psycopg2.extensions.cursor = conn.cursor()
sql1 = "SELECT COUNT(ep.ref) nb_emprunt FROM Ressource r JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref WHERE r.codeUnique = '{0}' HAVING COUNT(ep.ref) > 1 ORDER BY COUNT(ep.ref) DESC".format(codeUnique)
cursor.execute(sql1)
ressource = cursor.fetchone()
return ressource[0]
except Exception as err:
print(err)
finally:
conn.close()
#print("Titre : {0} Nombre d\'emprunts : {1}".format(ressource[0], ressource[1]))
# nombre de ressources empruntés par genre
def genresPopulaires(self) :
conn = self.connect()
try:
cursor : psycopg2.extensions.cursor = conn.cursor()
sql1 = "SELECT r.genre, COUNT(ep.ref) nb_emprunt FROM Ressource r JOIN Exemplaire ep ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref GROUP BY r.genre HAVING COUNT(ep.ref) > 1 ORDER BY COUNT(ep.ref) DESC"
cursor.execute(sql1)
rows = cursor.fetchall()
return rows
except Exception as err:
print(err)
finally:
conn.close()
# print('Genre : {0} Nombre d\'emprunts : {1}\n'.format(row[0], row[1]))
# retourne le nombre de fois qu'une ressource a été empruntée
def nombreEmpruntRessource(self, genre : int) :
conn = self.connect()
try:
cursor : psycopg2.extensions.cursor = conn.cursor()
sql1 = "SELECT COUNT(ep.ref) nb_emprunt FROM Ressource r JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref WHERE r.genre = '{0}' GROUP BY r.genre HAVING COUNT(ep.ref) > 1 ORDER BY COUNT(ep.ref) DESC".format(genre)
cursor.execute(sql1)
ressource = cursor.fetchone()
return ressource[1]
except Exception as err:
print(err)
finally:
conn.close()
#print("Genre : {0} Nombre d\'emprunts : {1}".format(ressource[0], ressource[1]))
# retourne le genre de docuement le plus emprunté par un adhérent pour suggestion
def genrePrefereAdherent(self, login : string) :
conn = self.connect()
try:
cursor : psycopg2.extensions.cursor = conn.cursor()
sql1 = "SELECT r.genre, nb_emprunt COUNT(ep.ref) FROM Ressource r JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref JOIN Pret p ON p.pretID = ep.pretID WHERE p.adherent = '{0}' GROUP BY r.genre HAVING COUNT(ep.ref) > 1 ORDER BY COUNT(ep.ref) DESC".format(login)
cursor.execute(sql1)
genre = cursor.fetchall()
return genre[0][0] # retourne le premier genre
except Exception as err:
print(err)
finally:
conn.close()
#print("Genre le plus emprunté : {0}".format(genre[1]))
#retourne l'age moyen des adhérents
def ageMoyenAdherent(self) :
conn = self.connect()
try:
cursor : psycopg2.extensions.cursor = conn.cursor()
sql1 = "SELECT AVG(DATE_PART('year', now()) - DATE_PART('year', a.dateNaissance)) FROM Adherent a"
cursor.execute(sql1)
age = cursor.fetchone()
return age[0]
except Exception as err:
print(err)
finally:
conn.close()
#print("Genre le plus emprunté : {0}".format(genre[1]))
def typeDocumentPopulaire(self) :
# retourne le type de document le plus emprunté ( livre, oeuvre musicale ou film )
# on récupère le nombre de livre emprunté, le nb de oeuvre musicale empruntées et le nb de films empruntés.
conn = self.connect()
try:
cursor : psycopg2.extensions.cursor = conn.cursor()
sql1 = "SELECT COUNT(ep.ref) FROM Livre l JOIN Ressource r ON l.codeUnique = r.codeUnique JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.refExemplaire = e.ref"
cursor.execute(sql1)
nbLivres = cursor.fetchone()
sql2 = "SELECT COUNT(ep.ref) FROM OeuvreMusicale om JOIN Ressource r ON om.codeUnique = r.codeUnique JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.refExemplaire = e.ref"
cursor.execute(sql2)
nbOeuvres = cursor.fetchone()
sql3 = "SELECT COUNT(ep.ref) FROM Film f JOIN Ressource r ON f.codeUnique = r.codeUnique JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.refExemplaire = e.ref"
cursor.execute(sql3)
nbFilms = cursor.fetchone()
if(nbLivres[0] > nbFilms[0] and nbLivres[0] > nbOeuvres[0]) :
return "livres"
elif(nbFilms[0] >= nbLivres[0] and nbFilms[0] > nbOeuvres[0]) :
return "oeuvres musicales"
elif(nbOeuvres[0] > nbFilms[0] and nbOeuvres[0] > nbLivres[0]) :
return "films"
except Exception as err:
print(err)
finally:
conn.close()
# pour connaître le nom de la table d'où proviennent les données :
# select v.tableoid::regclass from ville v
......@@ -177,4 +177,146 @@ SELECT
END AS "category", COUNT(exemplaire.ressource) AS "nb_ressources", (COUNT(exemplaire.ressource)/SUM(COUNT(exemplaire.ressource)) OVER()) * 100 AS "part"
FROM exemplaire
JOIN exemplairepret ON exemplaire.ref = exemplairepret.ref
GROUP BY "category";
\ No newline at end of file
GROUP BY "category";
CREATE OR REPLACE VIEW RessourcesPopulaires AS
SELECT r.titre, COUNT(ep.ref) nb_emprunt
FROM Ressource r JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref
GROUP BY r.titre
HAVING COUNT(ep.ref) > 2
ORDER BY COUNT(ep.ref) DESC;
CREATE OR REPLACE VIEW GenresPopulaires AS
SELECT r.genre, COUNT(ep.ref) nb_emprunt
FROM Ressource r JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref
GROUP BY r.genre
HAVING COUNT(ep.ref) > 2
ORDER BY COUNT(ep.ref) DESC;
CREATE OR REPLACE VIEW LivresPopulaire AS
SELECT r.titre, COUNT(ep.ref) nb_emprunt
FROM Livre l JOIN Ressource r ON l.codeUnique = r.codeUnique JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref
GROUP BY r.titre
HAVING COUNT(ep.ref) > 2
ORDER BY COUNT(ep.ref) DESC;
CREATE OR REPLACE VIEW OeuvresMusicalesPopulaire AS
SELECT r.titre, COUNT(ep.ref) nb_emprunt
FROM OeuvreMusicale om JOIN Ressource r ON om.codeUnique = r.codeUnique JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref
GROUP BY r.titre
HAVING COUNT(ep.ref) > 2
ORDER BY COUNT(ep.ref) DESC;
CREATE OR REPLACE VIEW FilmsPopulaires AS
SELECT r.titre, COUNT(ep.ref) nb_emprunt
FROM Film f JOIN Ressource r ON f.codeUnique = r.codeUnique JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref
GROUP BY r.titre
HAVING COUNT(ep.ref) > 2
ORDER BY COUNT(ep.ref) DESC;
CREATE OR REPLACE VIEW DureeMaxEmpruntParAdherent AS
SELECT u.nom, MAX(duree) dureeEmpruntMax
FROM Adherent a JOIN Pret p ON p.adherent = a.login JOIN Utilisateur u ON u.login = a.login
GROUP BY u.nom
ORDER BY MAX(duree) DESC;
CREATE OR REPLACE VIEW DureeMoyenneEmpruntParAdherent AS
SELECT u.nom, AVG(duree) dureeMoyenneEmprunt
FROM Adherent a JOIN Pret p ON p.adherent = a.login JOIN Utilisateur u ON u.login = a.login
GROUP BY u.nom
ORDER BY AVG(duree) DESC;
CREATE OR REPLACE VIEW DureeMaxEmpruntParRessource AS
SELECT r.titre, MAX(duree) dureeEmpruntMax
FROM Ressource r JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref JOIN Pret p ON p.pretID = ep.pret
GROUP BY r.titre
ORDER BY MAX(duree) DESC;
CREATE OR REPLACE VIEW DureeMoyenneEmpruntParRessource AS
SELECT r.titre, AVG(duree) dureeMoyenneEmprunt
FROM Ressource r JOIN Exemplaire e ON e.ressource = r.codeUnique JOIN ExemplairePret ep ON ep.ref = e.ref JOIN Pret p ON p.pretID = ep.pret
GROUP BY r.titre
ORDER BY AVG(duree) DESC;
/* ****** TRIGGERS ****** */
CREATE OR REPLACE FUNCTION check_exclusivite_realisateur()
RETURNS trigger AS
$$
DECLARE
var INTEGER;
BEGIN
SELECT a.acteur INTO var FROM Acteur a WHERE a.acteur = NEW.realisateur AND film = NEW.film;
IF var IS NOT NULL THEN
RAISE EXCEPTION 'Erreur : ce contributeur existe déjà dans la table Auteur';
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
DROP TRIGGER IF EXISTS T_EXCUSIVITE_REALISATEUR ON Realisateur;
CREATE TRIGGER T_EXCUSIVITE_REALISATEUR BEFORE INSERT ON Realisateur
FOR EACH ROW
EXECUTE PROCEDURE check_exclusivite_realisateur();
CREATE OR REPLACE FUNCTION check_exclusivite_acteur()
RETURNS trigger AS
$$
DECLARE
var INTEGER;
BEGIN
SELECT realisateur INTO var FROM Realisateur WHERE realisateur = NEW.acteur AND film = NEW.film;
IF var IS NOT NULL THEN
RAISE EXCEPTION 'Erreur : ce contributeur existe déjà dans la table Realisateur';
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
DROP TRIGGER IF EXISTS T_EXCUSIVITE_ACTEUR ON Acteur;
CREATE TRIGGER T_EXCUSIVITE_ACTEUR BEFORE INSERT OR UPDATE ON Acteur
FOR EACH ROW
EXECUTE PROCEDURE check_exclusivite_acteur();
CREATE OR REPLACE FUNCTION check_exclusivite_compositeur()
RETURNS trigger AS
$$
DECLARE
var INTEGER;
BEGIN
SELECT interprete INTO var FROM Interprete WHERE interprete = NEW.compositeur AND oeuvreMusicale = NEW.oeuvreMusicale;
IF var IS NOT NULL THEN
RAISE EXCEPTION 'Erreur : ce contributeur existe déjà dans la table Interprete';
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
DROP TRIGGER IF EXISTS T_EXCUSIVITE_COMPOSITEUR ON Compositeur;
CREATE TRIGGER T_EXCUSIVITE_COMPOSITEUR BEFORE INSERT OR UPDATE ON Compositeur
FOR EACH ROW
EXECUTE PROCEDURE check_exclusivite_compositeur();
CREATE OR REPLACE FUNCTION check_exclusivite_interprete()
RETURNS trigger AS
$$
DECLARE
var INTEGER;
BEGIN
SELECT compositeur INTO var FROM Compositeur WHERE compositeur = NEW.interprete AND oeuvreMusicale = NEW.oeuvreMusicale;
IF var IS NOT NULL THEN
RAISE EXCEPTION 'Erreur : ce contributeur existe déjà dans la table Compositeur';
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
DROP TRIGGER IF EXISTS T_EXCUSIVITE_INTERPRETE ON Interprete;
CREATE TRIGGER T_EXCUSIVITE_INTERPRETE BEFORE INSERT OR UPDATE ON Interprete
FOR EACH ROW
EXECUTE PROCEDURE check_exclusivite_interprete();
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment