diff --git a/dev/flat_create_table_sequence.Rmd b/dev/flat_create_table_sequence.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..d6532f11a1b2dcd1eaaf0bc2c209bf131b08b431 --- /dev/null +++ b/dev/flat_create_table_sequence.Rmd @@ -0,0 +1,252 @@ +--- +title: "Cr\u00e9ation des tables et des s\u00e9quences" +output: html_document +editor_options: + chunk_output_type: console +--- + +```{r development, include=FALSE} +library(testthat) +library(yaml) +library(glue) +library(DBI) +library(datalibaba) +``` + +```{r development-load} +# Load already included functions if relevant +pkgload::load_all(export_all = FALSE) +``` + +```{r config, eval=FALSE} +# Lire le fichier de configuration +config <- yaml::read_yaml("config.yml") + +# Accéder aux valeurs pour version et last_year +version <- config$version +last_year <- config$last_year +``` + +# Présentation + +Cette page contient les fonctions permettant : +- de créer en base la table `nitrates.nitrate_prelevement_analyse_version`, +- d'incrémenter la séquence correspondante au moment de l'import des données. + +# Création de la table en base + +## Création de la table des prélèvements et analyses et ajout des commentaires + +```{r function-create_table_nitrate_prelevement_analyse, eval=FALSE} +#' Créer une table de prélèvements et analyses de nitrates +#' +#' @description Cette fonction crée une table dans une base de données PostgreSQL +#' pour stocker les informations relatives aux prélèvements et analyses de +#' nitrates, incluant les contraintes et les séquences nécessaires. +#' +#' @param version String. Version de la table (par exemple, 'v1'). +#' @param last_year Integer. L'année la plus récente incluse dans les données de la table. +#' +#' @return String. Le script SQL utilisé pour créer la table. +#' @export +#' @importFrom datalibaba connect_to_db +create_table_nitrate_prelevement_analyse <- function(version, last_year) { + # Établir une connexion à la base de données PostgreSQL + connexion <- datalibaba::connect_to_db(db = "si_eau", user = "admin") + + # Génération de la date du jour + date_now <- format(Sys.Date(), "%d/%m/%Y") + + # Liste des requêtes SQL + sql_commands <- c( + glue::glue("CREATE TABLE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version} ( + code_prelevement_analyse serial NOT NULL, + code_intervenant character varying(20), + source character varying(10), + code_reseau character varying(254), + code_station character varying(10), + date_prelevement date, + heure_prelevement character varying(8), + code_support integer, + nature_eau character varying(3), + id_usage character varying(3), + id_prelevement_motif character varying(2), + commentaire character varying(254), + code_parametre bigint, + code_fraction_analysee integer, + date_analyse date, + resultat_analyse double precision, + code_remarque integer, + limite_detection double precision, + limite_quantification double precision, + CONSTRAINT pk_nitrate_prelevement_analyse_{version} PRIMARY KEY (code_prelevement_analyse), + CONSTRAINT fk_n_support FOREIGN KEY (code_support) + REFERENCES sandre.n_support (code_support) MATCH SIMPLE + ON UPDATE CASCADE ON DELETE SET DEFAULT, + CONSTRAINT fk_parametre FOREIGN KEY (code_parametre) + REFERENCES qualite_cours_d_eau.parametre (code_parametre) MATCH SIMPLE + ON UPDATE CASCADE ON DELETE SET DEFAULT, + CONSTRAINT fk_n_fraction_analysee FOREIGN KEY (code_fraction_analysee) + REFERENCES sandre.n_fraction_analysee (code_fraction_analysee) MATCH SIMPLE + ON UPDATE CASCADE ON DELETE SET DEFAULT, + CONSTRAINT fk_n_remarque FOREIGN KEY (code_remarque) + REFERENCES sandre.n_remarque (code_remarque) MATCH SIMPLE + ON UPDATE NO ACTION ON DELETE NO ACTION + ) WITH (OIDS=FALSE);"), + + glue::glue("ALTER TABLE nitrates.nitrate_prelevement_analyse_{version} OWNER TO adminpsql;"), + + glue::glue("GRANT ALL ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO adminpsql;"), + glue::glue("GRANT ALL ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO writer_production;"), + glue::glue("GRANT SELECT ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO reader_production;"), + + glue::glue("COMMENT ON TABLE nitrates.nitrate_prelevement_analyse_{version} IS + 'Table des prélèvements et analyses 2007-{last_year} (version {version} du {date_now})';"), + + glue::glue("CREATE SEQUENCE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_seq + INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;"), + + glue::glue("ALTER SEQUENCE nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_seq + OWNER TO adminpsql;") + ) + + # Ajout des commentaires sur chaque champ + comments_sql <- c( + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_prelevement_analyse IS 'Identifiant du prélèvement';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_intervenant IS 'Identifiant de l''intervenant';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.source IS 'Source de la donnée';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_reseau IS 'Identifiant du réseau';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_station IS 'Identifiant de la station';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.date_prelevement IS 'Date du prélèvement';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.heure_prelevement IS 'Heure du prélèvement';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_support IS 'Code du support de prélèvement';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.nature_eau IS 'Nature de l''eau du prélèvement (ESO/ESU)';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.id_usage IS 'Code de l''usage du prélèvement';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.id_prelevement_motif IS 'Code du motif du prélèvement';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.commentaire IS 'Commentaire';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_parametre IS 'Identifiant du paramètre analysé';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_fraction_analysee IS 'Identifiant de la fraction analysée';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.date_analyse IS 'Date de l''analyse';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.resultat_analyse IS 'Résultat de l''analyse';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_remarque IS 'Code validant la donnée';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.limite_detection IS 'Limite de détection';"), + glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.limite_quantification IS 'Limite de quantification';") + ) + + # Exécuter chaque commande SQL + for (sql in c(sql_commands, comments_sql)) { + DBI::dbExecute(connexion, sql) + } + + # Fermeture de la connexion à la base de données + DBI::dbDisconnect(connexion) + + # Retourne toutes les commandes exécutées + return(c(sql_commands, comments_sql)) +} +``` + +Création de la table `nitrates.nitrate_prelevement_version` : +```{r create_create_table_nitrate_prelevement_analyse, eval=FALSE} +# Création du script SQL avec la version choisie +sql <- create_table_nitrate_prelevement_analyse(version, last_year) +``` + +# Incrémentation de la séquence + +## Incrémentation de la table des prélèvements et des analyses + +```{r function-add_code_prelevement_analyse, eval=FALSE} +#' Ajouter une variable code_prelevement_analyse au dataframe +#' +#' @description Cette fonction ajoute une nouvelle variable +#' `code_prelevement_analyse` au dataframe en utilisant une séquence +#' PostgreSQL dynamique. La séquence est construite en fonction du +#' paramètre `version` fourni. +#' +#' @param dataframe Un dataframe contenant les données sur lesquelles ajouter +#' la variable `code_prelevement_analyse`. +#' @param version Une chaîne de caractères représentant la version de la +#' séquence à utiliser. +#' +#' @return Un dataframe avec une nouvelle colonne `code_prelevement_analyse` +#' contenant les valeurs de la séquence PostgreSQL. +#' +#' @importFrom DBI dbGetQuery dbDisconnect +#' @importFrom dplyr mutate +#' @importFrom glue glue +#' @importFrom datalibaba connect_to_db +#' @export +add_code_prelevement_analyse <- function(dataframe, version) { + # Établir une connexion à la base de données PostgreSQL + connexion <- datalibaba::connect_to_db(db = "si_eau", user = "admin") + + # Construire le nom de la séquence + sequence_name <- glue::glue("nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_seq") + + # Initialiser une liste pour stocker les valeurs de la séquence + code_prelevements <- c() + + # Pour chaque ligne du dataframe, obtenir une valeur de la séquence + for (i in 1:nrow(dataframe)) { + query <- glue::glue("SELECT nextval(\'{sequence_name}\') AS code_prelevement") + result <- DBI::dbGetQuery(connexion, query) + code_prelevements <- c(code_prelevements, result$code_prelevement) + } + + # Ajouter la nouvelle variable au dataframe + dataframe <- dataframe |> + dplyr::mutate(code_prelevement = code_prelevements) + + # Fermer la connexion à la base de données + DBI::dbDisconnect(connexion) + + return(dataframe) +} + +``` + +La fonction est utilisée au moment d'importer les données des différentes +sources dans la table `nitrates.nitrate_prelevement_analyse_version` : +```{r example_add_code_prelevement_analyse, eval=FALSE} +# Crée un dataframe fictif avec les colonnes nécessaires pour l'exemple +dataframe <- data.frame( + id_prelevement = 1:5, + autre_colonne = sample(letters, 5) +) +# Définir une version pour l'exemple +version <- "v1" + +# Utiliser la fonction add_code_prelevement() avec la version souhaitée +dataframe <- code_prelevement_analyse( + dataframe, version) + +``` + +```{r development-skeleton-dir, eval=FALSE} +# Créer de l'arborescence et des fichiers du template +usethis::use_rmarkdown_template( + template_name = "Cr\u00e9ation de la table et de la s\u00e9quence", + template_dir = "creation-de-la-table-et-de-la-sequence", + template_description = "Cr\u00e9ation de la table et de la s\u00e9quence", + template_create_dir = TRUE +) +``` + +```{r development-skeleton-copy, eval=FALSE} +# Définir les chemins source et destination +source_file <- "dev/flat_create_tables_sequences.Rmd" +destination_dir <- "inst/rmarkdown/templates/creation-de-la-table-et-de-la-sequence/skeleton" +destination_file <- file.path(destination_dir, "skeleton.Rmd") + +# Copier et renommer le fichier +file.copy(from = source_file, to = destination_file, overwrite = TRUE) +message("File copied and renamed successfully.") + +``` + +```{r development-inflate, eval=FALSE} +# Run but keep eval=FALSE to avoid infinite loop +# Execute in the console directly +fusen::inflate(flat_file = "dev/flat_create_table_sequence.Rmd", vignette_name = "creation-de-la-table-et-de-la-sequence") +```