From dafddbc08ec7736798ebaea59c08ff60f8ef50a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABlle=20Salmon?= Date: Thu, 21 Dec 2023 15:50:05 +0100 Subject: [PATCH] feat: make spq_set() replace prefixes --- R/spq_perform.R | 60 ++++++++++++++++++++------------ R/spq_set.R | 10 ++++-- tests/testthat/_snaps/spq_set.md | 16 +++++++++ tests/testthat/test-spq_set.R | 13 +++++++ 4 files changed, 73 insertions(+), 26 deletions(-) diff --git a/R/spq_perform.R b/R/spq_perform.R index fd5529c0..a5429860 100644 --- a/R/spq_perform.R +++ b/R/spq_perform.R @@ -79,20 +79,7 @@ spq_perform = function(.query, ) if (replace_prefixes) { - endpoint_url = .query[["endpoint_info"]][["endpoint_url"]] - endpoint_is_usual <- (endpoint_url %in% usual_endpoints$url) - if (endpoint_is_usual) { - endpoint_name = usual_endpoints[["name"]][usual_endpoints[["url"]] == endpoint_url] - prefixes = usual_prefixes[["name"]][usual_prefixes[["type"]] == endpoint_name] - } else { - prefixes = NULL - } - prefixes = c(prefixes, .query[["prefixes_used"]]) - results = purrr::reduce( - prefixes, - \(results, x) replace_prefix(x, results, .query = .query), - .init = results - ) + results = replace_prefixes(results, .query) } results @@ -105,16 +92,43 @@ replace_prefix = function(prefix, results, .query) { .query[["prefixes_provided"]] ) - dplyr::mutate( - results, - dplyr::across( - dplyr::where(is.character), - \(x) str_replace( - x, - pattern = prefixes[["url"]][prefixes[["name"]] == prefix], - replacement = sprintf("%s:", prefix)) - ) + pattern = str_replace( + prefixes[["url"]][prefixes[["name"]] == prefix], + "http:", "https?:" ) + + replacement = sprintf("%s:", prefix) + + if (is.data.frame(results)) { + dplyr::mutate( + results, + dplyr::across( + dplyr::where(is.character), + \(x) str_replace(x, pattern, replacement) + ) + ) + } else { + str_replace(results, pattern, replacement) + } + + +} + +replace_prefixes <- function(results, .query) { + endpoint_url = .query[["endpoint_info"]][["endpoint_url"]] + endpoint_is_usual <- (endpoint_url %in% usual_endpoints$url) + if (endpoint_is_usual) { + endpoint_name = usual_endpoints[["name"]][usual_endpoints[["url"]] == endpoint_url] + prefixes = usual_prefixes[["name"]][usual_prefixes[["type"]] == endpoint_name] + } else { + prefixes = NULL + } + prefixes = c(prefixes, .query[["prefixes_used"]]) + purrr::reduce( + prefixes, + \(results, x) replace_prefix(x, results, .query = .query), + .init = results + ) } control_explanation <- function() { diff --git a/R/spq_set.R b/R/spq_set.R index 7afdf227..5cbf2321 100644 --- a/R/spq_set.R +++ b/R/spq_set.R @@ -28,7 +28,8 @@ spq_set = function(.query, ...) { args = rlang::enquos(...) subjects = names(args) - values = purrr::map_chr(args, treat_value) + + values = purrr::map_chr(args, treat_value, .query = .query) .query <- purrr::reduce2( subjects, @@ -41,8 +42,11 @@ spq_set = function(.query, ...) { return(.query) } -treat_value = function(value) { - sprintf("{%s}", paste0(rlang::eval_tidy(value), collapse = " ")) +treat_value = function(value, .query) { + values <- rlang::eval_tidy(value) %>% + replace_prefixes(.query = .query) %>% + paste(collapse = " ") + sprintf("{%s}", values) } add_one_value_var <- function(query, var, values) { diff --git a/tests/testthat/_snaps/spq_set.md b/tests/testthat/_snaps/spq_set.md index 15f9c354..3c78596b 100644 --- a/tests/testthat/_snaps/spq_set.md +++ b/tests/testthat/_snaps/spq_set.md @@ -12,6 +12,22 @@ } +# spq_set() works with URLs + + Code + spq_init() %>% spq_set(species = c("https://www.wikidata.org/entity/Q144", + "https://www.wikidata.org/entity/Q146", + "https://www.wikidata.org/entity/Q780"), mayorcode = "wd:Q30185") + Output + + SELECT * + WHERE { + VALUES ?species {wd:Q144 wd:Q146 wd:Q780} + VALUES ?mayorcode {wd:Q30185} + + } + + # spq_set() in two examples Code diff --git a/tests/testthat/test-spq_set.R b/tests/testthat/test-spq_set.R index eb13a21d..b7c6e7a6 100644 --- a/tests/testthat/test-spq_set.R +++ b/tests/testthat/test-spq_set.R @@ -6,6 +6,19 @@ test_that("spq_set() works", { ) }) +test_that("spq_set() works with URLs", { + expect_snapshot( + spq_init() %>% + # dog, cat or chicken + spq_set(species = c( + 'https://www.wikidata.org/entity/Q144', + 'https://www.wikidata.org/entity/Q146', + 'https://www.wikidata.org/entity/Q780' + ), mayorcode = "wd:Q30185") + ) +}) + + test_that("spq_set() in two examples", { expect_snapshot( spq_init() %>%