From 233f21dd20b3e1d8f91af921c63f7e8643e7dd73 Mon Sep 17 00:00:00 2001 From: David Ranzolin Date: Wed, 1 May 2024 11:46:46 -0700 Subject: [PATCH] new option for glue_sql delimiters --- R/source_sql_to_dataframe.R | 5 +++- R/sqltargets-option.R | 3 +- R/zzz.R | 1 + man/sqltargets-options.Rd | 3 +- tests/testthat/test-tar-sqltargets-options.R | 30 ++++++++++++++++++++ 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 tests/testthat/test-tar-sqltargets-options.R diff --git a/R/source_sql_to_dataframe.R b/R/source_sql_to_dataframe.R index 032318a..a12c1d6 100644 --- a/R/source_sql_to_dataframe.R +++ b/R/source_sql_to_dataframe.R @@ -5,10 +5,13 @@ source_sql_to_dataframe <- function(path, query_params = NULL) { connection_call <- paste0("con <- ", connection_string) eval(parse(text = connection_call)) on.exit(DBI::dbDisconnect(con)) + delimiters <- strsplit(sqltargets_option_get("sqltargets.glue_sql_delimiters"), "")[[1]] + open <- delimiters[1] + close <- delimiters[2] query <- lines[2:length(lines)] query <- query[!grepl("tar_load", query)] query <- paste(query, collapse = " ") - query <- glue::glue_sql(query, .con = con, .envir = query_params) + query <- glue::glue_sql(query, .con = con, .open = open, .close = close, .envir = query_params) out <- DBI::dbGetQuery(con, query) return(out) diff --git a/R/sqltargets-option.R b/R/sqltargets-option.R index cbc2d68..3156aa6 100644 --- a/R/sqltargets-option.R +++ b/R/sqltargets-option.R @@ -9,7 +9,8 @@ #' #' ## Available Options #' -#' - `"sqltargets.target_file_suffix"` - character. Length 1. Suffix appended to target name for SQL file dependency +#' - `"sqltargets.target_file_suffix"` - character. Length 1. Suffix appended to target name for SQL file dependency. +#' - `"sqltargets.glue_sql_delimiters"` - character. Length 1. Two characters. The opening and closing delimiters passed to `glue::glue_sql()`. #' @rdname sqltargets-options #' @export sqltargets_option_get <- function(option_name) { diff --git a/R/zzz.R b/R/zzz.R index c5d6cf8..95667d2 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -6,4 +6,5 @@ sqltargets_env <- function() { .onAttach <- function(lib, pkg) { sqltargets.env$sqltargets.target_file_suffix <- "_query_file" + sqltargets.env$sqltargets.glue_sql_delimiters <- "{}" } diff --git a/man/sqltargets-options.Rd b/man/sqltargets-options.Rd index d1be25c..83537f8 100644 --- a/man/sqltargets-options.Rd +++ b/man/sqltargets-options.Rd @@ -23,5 +23,6 @@ Get or Set sqltargets Options \details{ ## Available Options - - `"sqltargets.target_file_suffix"` - character. Length 1. Suffix appended to target name for SQL file dependency + - `"sqltargets.target_file_suffix"` - character. Length 1. Suffix appended to target name for SQL file dependency. + - `"sqltargets.glue_sql_delimiters"` - character. Length 1. Two characters. The opening and closing delimiters passed to `glue::glue_sql()`. } diff --git a/tests/testthat/test-tar-sqltargets-options.R b/tests/testthat/test-tar-sqltargets-options.R new file mode 100644 index 0000000..511e6f1 --- /dev/null +++ b/tests/testthat/test-tar-sqltargets-options.R @@ -0,0 +1,30 @@ +test_that("sqltargets_option_set() works", { + sqltargets_option_set("sqltargets.target_file_suffix", "_x_query") + sqltargets_option_set("sqltargets.glue_sql_delimiters", "<>") + expect_equal(sqltargets_option_get("sqltargets.target_file_suffix"), "_x_query") + expect_equal(sqltargets_option_get("sqltargets.glue_sql_delimiters"), "<>") +}) + +test_that("different delimiters work", { + lines <- c( + "-- !preview conn=DBI::dbConnect(RSQLite::SQLite())", + "-- tar_load(query_params)", + "select @val@ as @col_name@", + "" + ) + writeLines(lines, "query.sql") + targets::tar_script({ + sqltargets_option_set("sqltargets.glue_sql_delimiters", "@@") + list( + targets::tar_target(query_params, list(val = 3, col_name = "column1")), + tar_sql( + report, + path = "query.sql", + query_params = query_params + ) + ) + }) + suppressMessages(targets::tar_make(callr_function = NULL)) + out <- targets::tar_read(report) + expect_equal(out, data.frame(column1 = 3)) +})