From 6f5c66fcbd022e3d00bc9570d34e57c1c9e73da1 Mon Sep 17 00:00:00 2001 From: Martin Eyben Date: Mon, 2 Dec 2024 16:58:31 +0000 Subject: [PATCH] feat: add sql functions --- PostgreSQL/Makefile | 7 ++++++- PostgreSQL/src/functions.sql | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 PostgreSQL/src/functions.sql diff --git a/PostgreSQL/Makefile b/PostgreSQL/Makefile index d36d602..fbc01d6 100644 --- a/PostgreSQL/Makefile +++ b/PostgreSQL/Makefile @@ -6,7 +6,8 @@ all: build build: \ $(DIR_BUILD)/00_drop.sql \ $(DIR_BUILD)/01_create.sql \ - $(DIR_BUILD)/02_insert.sql + $(DIR_BUILD)/02_insert.sql \ + $(DIR_BUILD)/05_functions.sql # $(DIR_BUILD)/03_select.sql \ # $(DIR_BUILD)/04_update.sql @@ -34,6 +35,10 @@ $(DIR_BUILD)/04_update.sql: $(DIR_SRC)/update.sql mkdir -p $(dir $@) cp $< $@ +$(DIR_BUILD)/05_functions.sql: $(DIR_SRC)/functions.sql + mkdir -p $(dir $@) + cp $< $@ + clean: rm -f $(DIR_BUILD)/* .data/*.data diff --git a/PostgreSQL/src/functions.sql b/PostgreSQL/src/functions.sql new file mode 100644 index 0000000..56b4309 --- /dev/null +++ b/PostgreSQL/src/functions.sql @@ -0,0 +1,33 @@ + +DROP FUNCTION pieces_membre(integer); +CREATE OR REPLACE FUNCTION pieces_membre(int) RETURNS TABLE(id_piece int, quantite_piece int) +AS +$$ +SELECT id_piece, quantite_contenir * quantite_enregistrer as quantite_pieces_possedees +FROM enregistrer +NATURAL JOIN boites +NATURAL JOIN contenir +WHERE id_membre=$1 +UNION +(SELECT id_piece, quantite_acheter as quantite_pieces_possedees + FROM acheter WHERE id_membre=$1); +$$ +LANGUAGE SQL; +; + + +-- Liste des modèles faisables à partir d'un membre +CREATE OR REPLACE FUNCTION modeles_faisables_membre(int) RETURNS TABLE(id_modele int) AS +$$ +SELECT id_modele +FROM modeles +WHERE id_modele not IN +( + SELECT id_modele FROM (SELECT * FROM pieces_membre($1)) as pieces_possedees + RIGHT OUTER JOIN (SELECT id_piece as id_necessaire, quantite_necessiter, id_modele + FROM necessiter) as pieces_modeles + ON pieces_possedees.id_piece = id_necessaire + WHERE quantite_necessiter > quantite_piece OR quantite_piece IS NULL +) +$$ +LANGUAGE SQL;