diff --git a/R/add_code_prelevement_analyse.R b/R/add_code_prelevement_analyse.R new file mode 100644 index 0000000000000000000000000000000000000000..60b3353b154ac8893522ffe5cdd7bbf3eb001698 --- /dev/null +++ b/R/add_code_prelevement_analyse.R @@ -0,0 +1,69 @@ +# WARNING - Generated by {fusen} from dev/flat_create_table_sequence.Rmd: do not edit by hand # nolint: line_length_linter. + +#' 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 +#' @examples +#' # 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 <- add_code_prelevement_analyse( +#' dataframe, version) +#' +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") + + # Créer la séquence correspondant à la table + create_sequence <- glue::glue("CREATE SEQUENCE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_seq + INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;") + + # Exécuter le script dans la base de données + DBI::dbExecute(connexion, create_sequence) + + # Construire le nom de la séquence + sequence_name <- glue::glue("nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_seq") + + # Initialiser une liste pour stocker les valeurs de la séquence + code_prelevements_analyses <- 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_analyse") + result <- DBI::dbGetQuery(connexion, query) + code_prelevements_analyses <- c(code_prelevements_analyses, result$code_prelevement_analyse) + } + + # Ajouter la nouvelle variable au dataframe + dataframe <- dataframe |> + dplyr::mutate(code_prelevement_analyse = code_prelevements_analyses) + + # Fermer la connexion à la base de données + DBI::dbDisconnect(connexion) + + return(dataframe) +} + diff --git a/R/create_table_nitrate_prelevement_analyse.R b/R/create_table_nitrate_prelevement_analyse.R new file mode 100644 index 0000000000000000000000000000000000000000..c0a1e3a04b7758477bab75838445eec790f6b659 --- /dev/null +++ b/R/create_table_nitrate_prelevement_analyse.R @@ -0,0 +1,108 @@ +# WARNING - Generated by {fusen} from dev/flat_create_table_sequence.Rmd: do not edit by hand # nolint: line_length_linter. + +#' 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_analyse_seq + INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;"), + + glue::glue("ALTER SEQUENCE nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_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)) +} diff --git a/dev/config_fusen.yaml b/dev/config_fusen.yaml index e1b062b14634d3420866813f821add87f1ea0ed3..e69b44b403d1790ab4571f7f6bd70bcf4dfe7fae 100644 --- a/dev/config_fusen.yaml +++ b/dev/config_fusen.yaml @@ -1,3 +1,20 @@ +flat_create_table_sequence.Rmd: + path: dev/flat_create_table_sequence.Rmd + state: active + R: + - R/add_code_prelevement_analyse.R + - R/create_table_nitrate_prelevement_analyse.R + tests: [] + vignettes: vignettes/creation-de-la-table-et-de-la-sequence.Rmd + inflate: + flat_file: dev/flat_create_table_sequence.Rmd + vignette_name: creation-de-la-table-et-de-la-sequence + open_vignette: true + check: true + document: true + overwrite: ask + clean: ask + codecov: false flat_create_tables_sequences.Rmd: path: dev/flat_create_tables_sequences.Rmd state: active @@ -15,6 +32,8 @@ flat_create_tables_sequences.Rmd: check: true document: true overwrite: ask + clean: ask + codecov: false flat_import_ars_data.Rmd: path: dev/flat_import_ars_data.Rmd state: active diff --git a/dev/flat_create_table_sequence.Rmd b/dev/flat_create_table_sequence.Rmd index d6532f11a1b2dcd1eaaf0bc2c209bf131b08b431..4515c0159e2195926274001754494c026a4ee90b 100644 --- a/dev/flat_create_table_sequence.Rmd +++ b/dev/flat_create_table_sequence.Rmd @@ -103,10 +103,10 @@ create_table_nitrate_prelevement_analyse <- function(version, last_year) { 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 + glue::glue("CREATE SEQUENCE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_seq INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;"), - glue::glue("ALTER SEQUENCE nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_seq + glue::glue("ALTER SEQUENCE nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_seq OWNER TO adminpsql;") ) @@ -181,22 +181,29 @@ 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") + # Créer la séquence correspondant à la table + create_sequence <- glue::glue("CREATE SEQUENCE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_seq + INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;") + + # Exécuter le script dans la base de données + DBI::dbExecute(connexion, create_sequence) + # Construire le nom de la séquence - sequence_name <- glue::glue("nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_seq") + sequence_name <- glue::glue("nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_seq") # Initialiser une liste pour stocker les valeurs de la séquence - code_prelevements <- c() + code_prelevements_analyses <- 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") + query <- glue::glue("SELECT nextval(\'{sequence_name}\') AS code_prelevement_analyse") result <- DBI::dbGetQuery(connexion, query) - code_prelevements <- c(code_prelevements, result$code_prelevement) + code_prelevements_analyses <- c(code_prelevements_analyses, result$code_prelevement_analyse) } # Ajouter la nouvelle variable au dataframe dataframe <- dataframe |> - dplyr::mutate(code_prelevement = code_prelevements) + dplyr::mutate(code_prelevement_analyse = code_prelevements_analyses) # Fermer la connexion à la base de données DBI::dbDisconnect(connexion) @@ -218,7 +225,7 @@ dataframe <- data.frame( version <- "v1" # Utiliser la fonction add_code_prelevement() avec la version souhaitée -dataframe <- code_prelevement_analyse( +dataframe <- add_code_prelevement_analyse( dataframe, version) ``` diff --git a/man/add_code_prelevement_analyse.Rd b/man/add_code_prelevement_analyse.Rd new file mode 100644 index 0000000000000000000000000000000000000000..02b01b8ac34197e46c56ab094403b82de96aa4f0 --- /dev/null +++ b/man/add_code_prelevement_analyse.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/add_code_prelevement_analyse.R +\name{add_code_prelevement_analyse} +\alias{add_code_prelevement_analyse} +\title{Ajouter une variable code_prelevement_analyse au dataframe} +\usage{ +add_code_prelevement_analyse(dataframe, version) +} +\arguments{ +\item{dataframe}{Un dataframe contenant les données sur lesquelles ajouter +la variable \code{code_prelevement_analyse}.} + +\item{version}{Une chaîne de caractères représentant la version de la +séquence à utiliser.} +} +\value{ +Un dataframe avec une nouvelle colonne \code{code_prelevement_analyse} +contenant les valeurs de la séquence PostgreSQL. +} +\description{ +Cette fonction ajoute une nouvelle variable +\code{code_prelevement_analyse} au dataframe en utilisant une séquence +PostgreSQL dynamique. La séquence est construite en fonction du +paramètre \code{version} fourni. +} +\examples{ +# 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 <- add_code_prelevement_analyse( + dataframe, version) + +} diff --git a/man/create_table_nitrate_prelevement_analyse.Rd b/man/create_table_nitrate_prelevement_analyse.Rd new file mode 100644 index 0000000000000000000000000000000000000000..26cc5e7bf5a563f3d5feb53673097f2b5d0a0269 --- /dev/null +++ b/man/create_table_nitrate_prelevement_analyse.Rd @@ -0,0 +1,21 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/create_table_nitrate_prelevement_analyse.R +\name{create_table_nitrate_prelevement_analyse} +\alias{create_table_nitrate_prelevement_analyse} +\title{Créer une table de prélèvements et analyses de nitrates} +\usage{ +create_table_nitrate_prelevement_analyse(version, last_year) +} +\arguments{ +\item{version}{String. Version de la table (par exemple, 'v1').} + +\item{last_year}{Integer. L'année la plus récente incluse dans les données de la table.} +} +\value{ +String. Le script SQL utilisé pour créer la table. +} +\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. +} diff --git a/vignettes/creation-de-la-table-et-de-la-sequence.Rmd b/vignettes/creation-de-la-table-et-de-la-sequence.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..46b7413bfc81d478a908e4aa07dd6b7cda629657 --- /dev/null +++ b/vignettes/creation-de-la-table-et-de-la-sequence.Rmd @@ -0,0 +1,82 @@ +--- +title: "creation-de-la-table-et-de-la-sequence" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{creation-de-la-table-et-de-la-sequence} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +```{r} +library(data.nitrates) +``` + +<!-- WARNING - This vignette is generated by {fusen} from dev/flat_create_table_sequence.Rmd: do not edit by hand --> + + + + +```{r config} +#| eval: no + +# 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 + +Création de la table `nitrates.nitrate_prelevement_version` : +```{r create_create_table_nitrate_prelevement_analyse} +#| eval: no + +# 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 + +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: no + +# 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 <- add_code_prelevement_analyse( + dataframe, version) + +``` + + + +