From cc43b023ab0e7f9b13a3a7a68b6477a21fc3a010 Mon Sep 17 00:00:00 2001
From: Juliette Engelaere-Lefebvre
 <juliette.engelaere@developpement-durable.gouv.fr>
Date: Tue, 16 Apr 2024 20:02:44 +0200
Subject: [PATCH] =?UTF-8?q?-=20feature=20:=20impl=C3=A9mentation=20du=20pa?=
 =?UTF-8?q?rametre=20`limit`=20=C3=A0=20`importer=5Fdata()`=20pour=20limit?=
 =?UTF-8?q?er=20le=20nb=20d'enregistrements=20=C3=A0=20lire=20(closes=20#2?=
 =?UTF-8?q?6)=20-=20doc=20:=20r=C3=A9agencement=20des=20scripts=20get=5Fda?=
 =?UTF-8?q?ta.R=20et=20post=5Fdata.R=20pour=20mettre=20les=20fonctions=20`?=
 =?UTF-8?q?importer=5Fdata()`=20et=20`poster=5Fdata()`=20au=20d=C3=A9but?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 DESCRIPTION          |   2 +-
 NEWS.md              |   3 +
 R/get_data.R         | 127 +++++++++++++++++++++-----------------
 R/post_data.R        | 141 ++++++++++++++++++++++---------------------
 man/importer_data.Rd |   5 +-
 5 files changed, 153 insertions(+), 125 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
index 829f607..10d72c9 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,6 +1,6 @@
 Package: datalibaba
 Title: Interface De Connexion a Une Base Posgres Postgis
-Version: 0.0.0.9006
+Version: 0.0.0.9007
 Authors@R: 
     c(person(given = "Maël",
              family = "Theulière",
diff --git a/NEWS.md b/NEWS.md
index 54acdbc..2986b0b 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,6 @@
+# datalibaba 0.0.0.9007
+- Ajout d'un paramètre `limit` à `importer_data()` pour limiter le nombre d'enregistrement à rapatrier
+
 # datalibaba 0.0.0.9006
 - Ajout de la fonction `get_db_comment()` pour récupérer le descriptif d'une base
 
diff --git a/R/get_data.R b/R/get_data.R
index efc2590..73478b6 100644
--- a/R/get_data.R
+++ b/R/get_data.R
@@ -1,52 +1,3 @@
-#' Import d'un dataset du serveur
-#'
-#' @param con Le connecteur de classe PosgreSQLConnection.
-#' @param schema Le nom du schema sur le serveur de données.
-#' @param table Le nom de la table sur le serveur de données.
-#'
-#' @importFrom attempt stop_if
-#' @importFrom DBI dbReadTable
-#' @importFrom RPostgreSQL postgresqlpqExec
-#' @return Un dataframe.
-#' @export
-
-get_data <- function(con = NULL,
-                     schema = NULL,
-                     table = NULL) {
-  attempt::stop_if(con, is.null, msg = "con n'est pas renseign\u00e9")
-  attempt::stop_if(schema, is.null, msg = "schema n'est pas renseign\u00e9")
-  attempt::stop_if(table, is.null, msg = "table n'est pas renseign\u00e9")
-
-  data <- DBI::dbReadTable(con, c(schema,table))
-  return(data)
-}
-
-
-
-
-#' import d'un dataset du serveur
-#'
-#' @param con Le connecteur de classe PosgreSQLConnection.
-#' @param schema Le nom du schema sur le serveur de données.
-#' @param table Le nom de la table sur le serveur de données.
-#' @importFrom attempt stop_if
-#' @importFrom DBI dbSendQuery dbReadTable Id
-#'
-#' @return un dataframe
-#' @export
-
-get_data_dbi <- function(con = NULL,
-                         schema = NULL,
-                         table = NULL) {
-  attempt::stop_if(con, is.null, msg = "con n'est pas renseign\u00e9")
-  attempt::stop_if(schema, is.null, msg = "schema n'est pas renseign\u00e9")
-  attempt::stop_if(table, is.null, msg = "table n'est pas renseign\u00e9")
-  tbl <- DBI::Id(schema = schema, table = table)
-  data <- DBI::dbReadTable(con, tbl)
-  return(data)
-}
-
-
 #' Import d'une table a partir du serveur de donnees, fonction qui s'adapte aux types de table a charger : recuperation des modalites des facteurs si chargee avec {rpostgis}, sf dataframe si table geographique.
 #'
 #' @param table Le nom de la table presente sur le serveur de données.
@@ -54,6 +5,7 @@ get_data_dbi <- function(con = NULL,
 #' @param db Le nom de la base de donnees sur laquelle se connecter.
 #' @param user L'identifiant de l'utilisateur qui se connecte.
 #' @param server l'adresse ip du serveur, laisser à NULL pour utiliser le variable d'environnement du .Renviron
+#' @param limit Le nombre d'enregistrements a rapatrier, 0 pour lire toute la table.
 #'
 #' @return la table de donnees, au format dataframe ou sf dataframe si une colonne de type 'USER-DEFINED' est presente dans la table sgbd
 #' @importFrom attempt stop_if stop_if_not
@@ -73,14 +25,16 @@ get_data_dbi <- function(con = NULL,
 #' @source {rpostgis} http://mablab.org/rpostgis/
 
 
-importer_data <- function(table = NULL, schema = NULL, db  = "public", server = NULL, user = "does") {
+importer_data <- function(table = NULL, schema = NULL, db  = "public", server = NULL, user = "does", limit = 0) {
   attempt::stop_if(table, is.null, msg = "l'argument table n'est pas renseign\u00e9")
   attempt::stop_if(schema, is.null, msg = "l'argument schema n'est pas renseign\u00e9")
   attempt::stop_if(db, is.null, msg = "l'argument db n'est pas renseign\u00e9")
   attempt::stop_if(user, is.null, msg = "l'argument user n'est pas renseign\u00e9")
+  attempt::stop_if_not(limit, is.numeric, msg = "l'argument user n'est pas num\u00e9rique")
 
   con <- connect_to_db(db = db, user = user, server = server)
   name <- c(schema, table)
+  query_sql_limit <- paste0("SELECT * FROM ", schema, ".", table, " LIMIT ", limit)
 
   attempt::stop_if_not(DBI::dbExistsTable(conn = con, name = name),
                        msg = paste0("La table '", paste(name, collapse = "'.'"), "' est introuvable."))
@@ -109,7 +63,12 @@ importer_data <- function(table = NULL, schema = NULL, db  = "public", server =
 
   # on distingue 2 cas : table geo, table de donnees
   if(any(grepl("USER-DEFINED", champs$data_type))) { # la signature des champs de geometry
-    data_sf <- sf::st_read(dsn = con, layer = c(schema, table))
+    if(limit == 0) {
+      data_sf <- sf::st_read(dsn = con, layer = c(schema, table))
+    } else {
+      data_sf <- sf::st_read(dsn = con, query = query_sql_limit)
+    }
+
 
     if ("id_row__" %in% champs$column_name) { # on enleve le champ de cle primaire eventuellement cree après avoir remis dans l'ordre les enregistrements
       data_sf <- dplyr::arrange(.data = data_sf, .data$id_row__) %>%
@@ -118,7 +77,13 @@ importer_data <- function(table = NULL, schema = NULL, db  = "public", server =
     data <- sf::st_drop_geometry(data_sf)
 
   } else {
-    data <- DBI::dbReadTable(con, c(schema, table))
+    # table classic (non géo)
+    if(limit == 0) {
+      data <- DBI::dbReadTable(con, c(schema, table))
+    } else {
+      data <- DBI::dbGetQuery(con, query_sql_limit)
+      }
+
 
     if ("id_row__" %in% champs$column_name) {
       data <- dplyr::arrange(.data = data, .data$id_row__) %>%
@@ -158,7 +123,7 @@ importer_data <- function(table = NULL, schema = NULL, db  = "public", server =
         ## handle POSIX time zones
         if (att$defs %in% c("POSIXct", "POSIXt")) {
           data[, i] <- list(eval(parse(text = paste0("as.", att$defs, "(as.character(data[,i]), tz='",
-                                                  Sys.timezone(), "')"))))
+                                                     Sys.timezone(), "')"))))
           ## assign R tz
           eval(parse(text = paste0("attributes(data$", i,
                                    ")$tzone <- att$atts")))
@@ -189,7 +154,7 @@ importer_data <- function(table = NULL, schema = NULL, db  = "public", server =
     data <- data_sf
   }
 
-# renommer avec les éventuels noms initiaux
+  # renommer avec les éventuels noms initiaux
   if(nrow(def_table) > 0) {
     data <- dplyr::relocate(data, dplyr::all_of(defs$nms))
     names(data) <- defs$r_nms
@@ -200,6 +165,7 @@ importer_data <- function(table = NULL, schema = NULL, db  = "public", server =
   return(data)
 }
 
+# Test
 # ecln_cogifie2 <- importer_data(table = "test_ecln_cog", schema = "public", db = "public", server = "localhost", user = "does")
 # iris2 <- importer_data(table = "test_iris", schema = "public", db = "public", server = "localhost", user = "does") # pk = NULL, post_row_name = TRUE, overwrite = TRUE
 # all(iris == iris2)
@@ -207,3 +173,56 @@ importer_data <- function(table = NULL, schema = NULL, db  = "public", server =
 # test_epci <- COGiter::epci %>% dplyr::select(-ends_with("DE_L_EPCI")) %>% dplyr::slice(1:270) %>% dplyr::mutate_if(is.factor, forcats::fct_drop)
 # epci_test <- importer_data(table = "test_epci", schema = "public", db = "datamart", user = "does")
 # all(epci_test == test_epci)
+
+
+
+# Fonctions depreciées
+
+#' Import d'un dataset du serveur
+#'
+#' @param con Le connecteur de classe PosgreSQLConnection.
+#' @param schema Le nom du schema sur le serveur de données.
+#' @param table Le nom de la table sur le serveur de données.
+#'
+#' @importFrom attempt stop_if
+#' @importFrom DBI dbReadTable
+#' @importFrom RPostgreSQL postgresqlpqExec
+#' @return Un dataframe.
+#' @export
+
+get_data <- function(con = NULL,
+                     schema = NULL,
+                     table = NULL) {
+  attempt::stop_if(con, is.null, msg = "con n'est pas renseign\u00e9")
+  attempt::stop_if(schema, is.null, msg = "schema n'est pas renseign\u00e9")
+  attempt::stop_if(table, is.null, msg = "table n'est pas renseign\u00e9")
+
+  data <- DBI::dbReadTable(con, c(schema,table))
+  return(data)
+}
+
+
+
+
+#' import d'un dataset du serveur
+#'
+#' @param con Le connecteur de classe PosgreSQLConnection.
+#' @param schema Le nom du schema sur le serveur de données.
+#' @param table Le nom de la table sur le serveur de données.
+#' @importFrom attempt stop_if
+#' @importFrom DBI dbSendQuery dbReadTable Id
+#'
+#' @return un dataframe
+#' @export
+
+get_data_dbi <- function(con = NULL,
+                         schema = NULL,
+                         table = NULL) {
+  attempt::stop_if(con, is.null, msg = "con n'est pas renseign\u00e9")
+  attempt::stop_if(schema, is.null, msg = "schema n'est pas renseign\u00e9")
+  attempt::stop_if(table, is.null, msg = "table n'est pas renseign\u00e9")
+  tbl <- DBI::Id(schema = schema, table = table)
+  data <- DBI::dbReadTable(con, tbl)
+  return(data)
+}
+
diff --git a/R/post_data.R b/R/post_data.R
index 26d4c33..3562b38 100644
--- a/R/post_data.R
+++ b/R/post_data.R
@@ -1,72 +1,3 @@
-#' Chargement d'un dataset sur le serveur
-#'
-#' @return La fonction charge le dataset sur le serveur.
-#'
-#' @param con Le connecteur de classe PosgreSQLConnection.
-#' @param data Un dataframe a importer.
-#' @param schema Le nom du schema sur le serveur de données.
-#' @param table Le nom de la table sur le serveur de données.
-#' @param overwrite TRUE si on veut ecraser le fichier deja present.
-#'
-#' @importFrom attempt stop_if stop_if_not message_if
-#' @importFrom DBI dbWriteTable
-#' @importFrom glue glue
-#' @export
-
-post_data <- function(con,
-                      data = NULL,
-                      schema = NULL,
-                      table = NULL,
-                      overwrite = FALSE
-                      ) {
-  attempt::stop_if(con, is.null, msg = "con n\'est pas renseign\u00e9")
-  attempt::stop_if_not(deparse(substitute(con)), exists, msg = glue::glue("le connecteur {con} n\'existe pas"))
-  attempt::stop_if(data, is.null, msg = "data n\'est pas renseign\u00e9")
-  attempt::stop_if_not(data, is.data.frame, msg = glue::glue("le dataframe {data} n\'exsiste pas"))
-  attempt::stop_if(schema, is.null, msg = "schema n\'est pas renseign\u00e9")
-  attempt::stop_if(table, is.null, msg = "table n\'est pas renseign\u00e9")
-  attempt::stop_if_not(schema, ~ .x %in% list_schemas(con), msg = glue::glue("le schema {schema} n\'existe pas"))
-  attempt::stop_if(table %in% list_tables(con,schema) & !overwrite, msg = glue::glue("La table {table} existe d\u00e9j\u00e0 sur le schema {schema} et le param\u00e8 tre overwrite est \u00e0 FALSE"))
-  attempt::message_if(table %in% list_tables(con,schema) & overwrite, msg = glue::glue("La table {table} est \u00e9cras\u00e9e sur le schema {schema}"))
-  DBI::dbWriteTable(con, c(schema,table),  data, overwrite = overwrite )
-  return(invisible(NULL))
-}
-
-
-#' Chargement d'un dataset sur le serveur en dbi
-#'
-#' @param con Le connecteur de classe PosgreSQLConnection.
-#' @param data Un dataframe a importer.
-#' @param schema Le nom du schema sur le serveur de donnees.
-#' @param table Le nom de la table sur le serveur de donnees.
-#' @param overwrite TRUE si on veut ecraser le fichier deja present.
-#' @importFrom attempt stop_if stop_if_not
-#' @importFrom DBI dbWriteTable Id dbSendQuery
-#' @importFrom glue glue
-#'
-#' @return NULL, la fonction lance le chargement du dataset present dans l'environnement R et son ecriture sur le serveur
-#' @export
-#'
-
-post_data_dbi <- function(con = NULL,
-                          data = NULL,
-                          schema = NULL,
-                          table = NULL,
-                          overwrite = FALSE) {
-  attempt::stop_if(con, is.null, msg = "con n\'est pas renseign\u00e9")
-  attempt::stop_if_not(deparse(substitute(con)), exists, msg = glue::glue("le connecteur {con} n\'existe pas"))
-  attempt::stop_if(data, is.null, msg = "data n\'est pas renseign\u00e9")
-  attempt::stop_if_not(data, is.data.frame, msg = glue::glue("le dataframe {data} n\'exsiste pas"))
-  attempt::stop_if(schema, is.null, msg = "schema n\'est pas renseign\u00e9")
-  attempt::stop_if(table, is.null, msg = "table n\'est pas renseign\u00e9")
-  attempt::stop_if_not(schema, ~ .x %in% list_schemas(con), msg = glue::glue("le schema {schema} n\'existe pas"))
-  attempt::stop_if(table %in% list_tables(con,schema) & !overwrite, msg = glue::glue("La table {table} existe d\u00e9j\u00e0 sur le schema {schema} et le param\u00e8 tre overwrite est \u00e0 FALSE"))
-  tbl <- DBI::Id(schema = schema, table = table)
-  DBI::dbWriteTable(con, tbl,  data, overwrite = overwrite )
-  return(invisible(NULL))
-
-}
-
 #' Chargement d'un dataset sur le serveur avec rpostgis. Par rapport aux autres fonctions `post_data()`, `post_data_pg()` ouvre et ferme la connexion au SGBD, gere les dataframes spatiaux et les facteurs, et poste quelques metadonnees en commentaire de la table.
 #'
 #' @param data Un dataframe a verser sur le serveur de donnees.
@@ -293,3 +224,75 @@ poster_data <- function(data = NULL,
 # poster_data(data = COGiter::epci %>% dplyr::select(-ends_with("DE_L_EPCI")) %>% dplyr::slice(1:270) %>% dplyr::mutate_if(is.factor, forcats::fct_drop),
 #             table = "test_epci", schema = "public",
 #             db = "datamart", pk = "EPCI", post_row_name = FALSE, overwrite = TRUE, user = "does")
+
+
+
+# Fonction dépréciées----------
+#' Chargement d'un dataset sur le serveur
+#'
+#' @return La fonction charge le dataset sur le serveur.
+#'
+#' @param con Le connecteur de classe PosgreSQLConnection.
+#' @param data Un dataframe a importer.
+#' @param schema Le nom du schema sur le serveur de données.
+#' @param table Le nom de la table sur le serveur de données.
+#' @param overwrite TRUE si on veut ecraser le fichier deja present.
+#'
+#' @importFrom attempt stop_if stop_if_not message_if
+#' @importFrom DBI dbWriteTable
+#' @importFrom glue glue
+#' @export
+
+post_data <- function(con,
+                      data = NULL,
+                      schema = NULL,
+                      table = NULL,
+                      overwrite = FALSE
+) {
+  attempt::stop_if(con, is.null, msg = "con n\'est pas renseign\u00e9")
+  attempt::stop_if_not(deparse(substitute(con)), exists, msg = glue::glue("le connecteur {con} n\'existe pas"))
+  attempt::stop_if(data, is.null, msg = "data n\'est pas renseign\u00e9")
+  attempt::stop_if_not(data, is.data.frame, msg = glue::glue("le dataframe {data} n\'exsiste pas"))
+  attempt::stop_if(schema, is.null, msg = "schema n\'est pas renseign\u00e9")
+  attempt::stop_if(table, is.null, msg = "table n\'est pas renseign\u00e9")
+  attempt::stop_if_not(schema, ~ .x %in% list_schemas(con), msg = glue::glue("le schema {schema} n\'existe pas"))
+  attempt::stop_if(table %in% list_tables(con,schema) & !overwrite, msg = glue::glue("La table {table} existe d\u00e9j\u00e0 sur le schema {schema} et le param\u00e8 tre overwrite est \u00e0 FALSE"))
+  attempt::message_if(table %in% list_tables(con,schema) & overwrite, msg = glue::glue("La table {table} est \u00e9cras\u00e9e sur le schema {schema}"))
+  DBI::dbWriteTable(con, c(schema,table),  data, overwrite = overwrite )
+  return(invisible(NULL))
+}
+
+
+#' Chargement d'un dataset sur le serveur en dbi
+#'
+#' @param con Le connecteur de classe PosgreSQLConnection.
+#' @param data Un dataframe a importer.
+#' @param schema Le nom du schema sur le serveur de donnees.
+#' @param table Le nom de la table sur le serveur de donnees.
+#' @param overwrite TRUE si on veut ecraser le fichier deja present.
+#' @importFrom attempt stop_if stop_if_not
+#' @importFrom DBI dbWriteTable Id dbSendQuery
+#' @importFrom glue glue
+#'
+#' @return NULL, la fonction lance le chargement du dataset present dans l'environnement R et son ecriture sur le serveur
+#' @export
+#'
+
+post_data_dbi <- function(con = NULL,
+                          data = NULL,
+                          schema = NULL,
+                          table = NULL,
+                          overwrite = FALSE) {
+  attempt::stop_if(con, is.null, msg = "con n\'est pas renseign\u00e9")
+  attempt::stop_if_not(deparse(substitute(con)), exists, msg = glue::glue("le connecteur {con} n\'existe pas"))
+  attempt::stop_if(data, is.null, msg = "data n\'est pas renseign\u00e9")
+  attempt::stop_if_not(data, is.data.frame, msg = glue::glue("le dataframe {data} n\'exsiste pas"))
+  attempt::stop_if(schema, is.null, msg = "schema n\'est pas renseign\u00e9")
+  attempt::stop_if(table, is.null, msg = "table n\'est pas renseign\u00e9")
+  attempt::stop_if_not(schema, ~ .x %in% list_schemas(con), msg = glue::glue("le schema {schema} n\'existe pas"))
+  attempt::stop_if(table %in% list_tables(con,schema) & !overwrite, msg = glue::glue("La table {table} existe d\u00e9j\u00e0 sur le schema {schema} et le param\u00e8 tre overwrite est \u00e0 FALSE"))
+  tbl <- DBI::Id(schema = schema, table = table)
+  DBI::dbWriteTable(con, tbl,  data, overwrite = overwrite )
+  return(invisible(NULL))
+
+}
diff --git a/man/importer_data.Rd b/man/importer_data.Rd
index ef7776e..00867d1 100644
--- a/man/importer_data.Rd
+++ b/man/importer_data.Rd
@@ -12,7 +12,8 @@ importer_data(
   schema = NULL,
   db = "public",
   server = NULL,
-  user = "does"
+  user = "does",
+  limit = 0
 )
 }
 \arguments{
@@ -25,6 +26,8 @@ importer_data(
 \item{server}{l'adresse ip du serveur, laisser à NULL pour utiliser le variable d'environnement du .Renviron}
 
 \item{user}{L'identifiant de l'utilisateur qui se connecte.}
+
+\item{limit}{Le nombre d'enregistrements a rapatrier, 0 pour lire toute la table.}
 }
 \value{
 la table de donnees, au format dataframe ou sf dataframe si une colonne de type 'USER-DEFINED' est presente dans la table sgbd
-- 
GitLab