diff --git a/tests/testthat/test-as_duckplyr_df.R b/tests/testthat/test-as_duckplyr_df.R index d59b9fd7a..415d72ba6 100644 --- a/tests/testthat/test-as_duckplyr_df.R +++ b/tests/testthat/test-as_duckplyr_df.R @@ -1561,6 +1561,32 @@ test_that("as_duckplyr_df() and mutate(c = NA_character_, d = c %in% NA_characte }) +test_that("as_duckplyr_df() and mutate(d = a %in% NULL)", { + # Data + test_df <- data.frame(a = 1:6 + 0, b = 2, g = rep(1:3, 1:3)) + + # Run + pre <- test_df %>% as_duckplyr_df() %>% mutate(d = a %in% NULL) + post <- test_df %>% mutate(d = a %in% NULL) %>% as_duckplyr_df() + + # Compare + expect_identical(pre, post) +}) + + +test_that("as_duckplyr_df() and mutate(d = a %in% integer())", { + # Data + test_df <- data.frame(a = 1:6 + 0, b = 2, g = rep(1:3, 1:3)) + + # Run + pre <- test_df %>% as_duckplyr_df() %>% mutate(d = a %in% integer()) + post <- test_df %>% mutate(d = a %in% integer()) %>% as_duckplyr_df() + + # Compare + expect_identical(pre, post) +}) + + test_that("as_duckplyr_df() and mutate(d = NA_real_, e = is.na(d))", { # Data test_df <- data.frame(a = 1:6 + 0, b = 2, g = rep(1:3, 1:3)) @@ -1625,6 +1651,58 @@ test_that("as_duckplyr_df() and mutate(c = .data$b)", { expect_identical(pre, post) }) + +test_that("as_duckplyr_df() and mutate(d = NA)", { + # Data + test_df <- data.frame(a = 1:6 + 0, b = 2, g = rep(1:3, 1:3)) + + # Run + pre <- test_df %>% as_duckplyr_df() %>% mutate(d = NA) + post <- test_df %>% mutate(d = NA) %>% as_duckplyr_df() + + # Compare + expect_identical(pre, post) +}) + + +test_that("as_duckplyr_df() and mutate(d = NA_integer_)", { + # Data + test_df <- data.frame(a = 1:6 + 0, b = 2, g = rep(1:3, 1:3)) + + # Run + pre <- test_df %>% as_duckplyr_df() %>% mutate(d = NA_integer_) + post <- test_df %>% mutate(d = NA_integer_) %>% as_duckplyr_df() + + # Compare + expect_identical(pre, post) +}) + + +test_that("as_duckplyr_df() and mutate(d = NA_real_)", { + # Data + test_df <- data.frame(a = 1:6 + 0, b = 2, g = rep(1:3, 1:3)) + + # Run + pre <- test_df %>% as_duckplyr_df() %>% mutate(d = NA_real_) + post <- test_df %>% mutate(d = NA_real_) %>% as_duckplyr_df() + + # Compare + expect_identical(pre, post) +}) + + +test_that("as_duckplyr_df() and mutate(d = NA_character_)", { + # Data + test_df <- data.frame(a = 1:6 + 0, b = 2, g = rep(1:3, 1:3)) + + # Run + pre <- test_df %>% as_duckplyr_df() %>% mutate(d = NA_character_) + post <- test_df %>% mutate(d = NA_character_) %>% as_duckplyr_df() + + # Compare + expect_identical(pre, post) +}) + test_that("as_duckplyr_df() and n_groups()", { withr::local_envvar(DUCKPLYR_FORCE = "FALSE") diff --git a/tests/testthat/test-rel_api.R b/tests/testthat/test-rel_api.R index 88c82a270..4f91f87cd 100644 --- a/tests/testthat/test-rel_api.R +++ b/tests/testthat/test-rel_api.R @@ -8712,6 +8712,110 @@ test_that("relational mutate(c = NA_character_, d = c %in% NA_character_) order- DBI::dbDisconnect(con, shutdown = TRUE) }) +test_that("relational mutate(d = a %in% NULL) order-preserving", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(FALSE, experimental = experimental) + } else { + duckdb$expr_constant(FALSE) + } + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel2 + out <- duckdb$rel_to_altrep(rel2) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = logical(6) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(d = a %in% integer()) order-preserving", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(FALSE, experimental = experimental) + } else { + duckdb$expr_constant(FALSE) + } + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel2 + out <- duckdb$rel_to_altrep(rel2) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = logical(6) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + test_that("relational mutate(d = NA_real_, e = is.na(d)) order-preserving", { # Autogenerated duckdb <- asNamespace("duckdb") @@ -9087,31 +9191,56 @@ test_that("relational mutate(c = .data$b) order-preserving", { DBI::dbDisconnect(con, shutdown = TRUE) }) -# mutate order-enforcing --------------------------------------------------------------- - -test_that("relational mutate() order-enforcing", { +test_that("relational mutate(d = NA) order-preserving", { # Autogenerated duckdb <- asNamespace("duckdb") drv <- duckdb::duckdb() con <- DBI::dbConnect(drv) experimental <- FALSE + invisible(DBI::dbExecute(con, 'CREATE MACRO "___null"() AS CAST(NULL AS BOOLEAN)')) df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) - rel2 <- duckdb$rel_order( + rel2 <- duckdb$rel_project( rel1, - list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g")) + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_function("___null", list()) + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) ) rel2 out <- duckdb$rel_to_altrep(rel2) expect_identical( out, - data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = rep(NA, 6L) + ) ) DBI::dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(a + 1) order-enforcing", { +test_that("relational mutate(d = NA_integer_) order-preserving", { # Autogenerated duckdb <- asNamespace("duckdb") drv <- duckdb::duckdb() @@ -9139,42 +9268,31 @@ test_that("relational mutate(a + 1) order-enforcing", { tmp_expr }, { - tmp_expr <- duckdb$expr_function( - "+", - list( - duckdb$expr_reference("a"), - if ("experimental" %in% names(formals(duckdb$expr_constant))) { - duckdb$expr_constant(1, experimental = experimental) - } else { - duckdb$expr_constant(1) - } - ) - ) - duckdb$expr_set_alias(tmp_expr, "a + 1") + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(NA_integer_, experimental = experimental) + } else { + duckdb$expr_constant(NA_integer_) + } + duckdb$expr_set_alias(tmp_expr, "d") tmp_expr } ) ) - rel3 <- duckdb$rel_order( - rel2, - list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("a + 1")) - ) - rel3 - out <- duckdb$rel_to_altrep(rel3) + rel2 + out <- duckdb$rel_to_altrep(rel2) expect_identical( out, data.frame( a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `a + 1` = seq(2, 7, by = 1), - check.names = FALSE + d = rep(NA_integer_, 6L) ) ) DBI::dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(a + 1, .by = g) order-enforcing", { +test_that("relational mutate(d = NA_real_) order-preserving", { # Autogenerated duckdb <- asNamespace("duckdb") drv <- duckdb::duckdb() @@ -9202,42 +9320,31 @@ test_that("relational mutate(a + 1, .by = g) order-enforcing", { tmp_expr }, { - tmp_expr <- duckdb$expr_function( - "+", - list( - duckdb$expr_reference("a"), - if ("experimental" %in% names(formals(duckdb$expr_constant))) { - duckdb$expr_constant(1, experimental = experimental) - } else { - duckdb$expr_constant(1) - } - ) - ) - duckdb$expr_set_alias(tmp_expr, "a + 1") + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(NA_real_, experimental = experimental) + } else { + duckdb$expr_constant(NA_real_) + } + duckdb$expr_set_alias(tmp_expr, "d") tmp_expr } ) ) - rel3 <- duckdb$rel_order( - rel2, - list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("a + 1")) - ) - rel3 - out <- duckdb$rel_to_altrep(rel3) + rel2 + out <- duckdb$rel_to_altrep(rel2) expect_identical( out, data.frame( a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `a + 1` = seq(2, 7, by = 1), - check.names = FALSE + d = rep(NA_real_, 6L) ) ) DBI::dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(c = a + 1) order-enforcing", { +test_that("relational mutate(d = NA_character_) order-preserving", { # Autogenerated duckdb <- asNamespace("duckdb") drv <- duckdb::duckdb() @@ -9265,41 +9372,55 @@ test_that("relational mutate(c = a + 1) order-enforcing", { tmp_expr }, { - tmp_expr <- duckdb$expr_function( - "+", - list( - duckdb$expr_reference("a"), - if ("experimental" %in% names(formals(duckdb$expr_constant))) { - duckdb$expr_constant(1, experimental = experimental) - } else { - duckdb$expr_constant(1) - } - ) - ) - duckdb$expr_set_alias(tmp_expr, "c") + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(NA_character_, experimental = experimental) + } else { + duckdb$expr_constant(NA_character_) + } + duckdb$expr_set_alias(tmp_expr, "d") tmp_expr } ) ) - rel3 <- duckdb$rel_order( - rel2, - list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("c")) - ) - rel3 - out <- duckdb$rel_to_altrep(rel3) + rel2 + out <- duckdb$rel_to_altrep(rel2) expect_identical( out, data.frame( a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - c = seq(2, 7, by = 1) + d = rep(NA_character_, 6L) ) ) DBI::dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(`if` = a + 1) order-enforcing", { +# mutate order-enforcing --------------------------------------------------------------- + +test_that("relational mutate() order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_order( + rel1, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g")) + ) + rel2 + out <- duckdb$rel_to_altrep(rel2) + expect_identical( + out, + data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(a + 1) order-enforcing", { # Autogenerated duckdb <- asNamespace("duckdb") drv <- duckdb::duckdb() @@ -9338,14 +9459,14 @@ test_that("relational mutate(`if` = a + 1) order-enforcing", { } ) ) - duckdb$expr_set_alias(tmp_expr, "if") + duckdb$expr_set_alias(tmp_expr, "a + 1") tmp_expr } ) ) rel3 <- duckdb$rel_order( rel2, - list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("if")) + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("a + 1")) ) rel3 out <- duckdb$rel_to_altrep(rel3) @@ -9355,14 +9476,14 @@ test_that("relational mutate(`if` = a + 1) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `if` = seq(2, 7, by = 1), + `a + 1` = seq(2, 7, by = 1), check.names = FALSE ) ) DBI::dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(sum(a)) order-enforcing", { +test_that("relational mutate(a + 1, .by = g) order-enforcing", { # Autogenerated duckdb <- asNamespace("duckdb") drv <- duckdb::duckdb() @@ -9390,11 +9511,199 @@ test_that("relational mutate(sum(a)) order-enforcing", { tmp_expr }, { - tmp_expr <- duckdb$expr_window(duckdb$expr_function("sum", list(duckdb$expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) - duckdb$expr_set_alias(tmp_expr, "sum(a)") - tmp_expr - } - ) + tmp_expr <- duckdb$expr_function( + "+", + list( + duckdb$expr_reference("a"), + if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(1, experimental = experimental) + } else { + duckdb$expr_constant(1) + } + ) + ) + duckdb$expr_set_alias(tmp_expr, "a + 1") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("a + 1")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + `a + 1` = seq(2, 7, by = 1), + check.names = FALSE + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(c = a + 1) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_function( + "+", + list( + duckdb$expr_reference("a"), + if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(1, experimental = experimental) + } else { + duckdb$expr_constant(1) + } + ) + ) + duckdb$expr_set_alias(tmp_expr, "c") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("c")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + c = seq(2, 7, by = 1) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(`if` = a + 1) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_function( + "+", + list( + duckdb$expr_reference("a"), + if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(1, experimental = experimental) + } else { + duckdb$expr_constant(1) + } + ) + ) + duckdb$expr_set_alias(tmp_expr, "if") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("if")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + `if` = seq(2, 7, by = 1), + check.names = FALSE + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(sum(a)) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_window(duckdb$expr_function("sum", list(duckdb$expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) + duckdb$expr_set_alias(tmp_expr, "sum(a)") + tmp_expr + } + ) ) rel3 <- duckdb$rel_order( rel2, @@ -12338,6 +12647,118 @@ test_that("relational mutate(c = NA_character_, d = c %in% NA_character_) order- DBI::dbDisconnect(con, shutdown = TRUE) }) +test_that("relational mutate(d = a %in% NULL) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(FALSE, experimental = experimental) + } else { + duckdb$expr_constant(FALSE) + } + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("d")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = logical(6) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(d = a %in% integer()) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(FALSE, experimental = experimental) + } else { + duckdb$expr_constant(FALSE) + } + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("d")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = logical(6) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + test_that("relational mutate(d = NA_real_, e = is.na(d)) order-enforcing", { # Autogenerated duckdb <- asNamespace("duckdb") @@ -12677,6 +13098,227 @@ test_that("relational mutate(c = .data$b) order-enforcing", { DBI::dbDisconnect(con, shutdown = TRUE) }) +test_that("relational mutate(d = NA) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + invisible(DBI::dbExecute(con, 'CREATE MACRO "___null"() AS CAST(NULL AS BOOLEAN)')) + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_function("___null", list()) + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("d")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = rep(NA, 6L) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(d = NA_integer_) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(NA_integer_, experimental = experimental) + } else { + duckdb$expr_constant(NA_integer_) + } + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("d")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = rep(NA_integer_, 6L) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(d = NA_real_) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(NA_real_, experimental = experimental) + } else { + duckdb$expr_constant(NA_real_) + } + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("d")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = rep(NA_real_, 6L) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(d = NA_character_) order-enforcing", { + # Autogenerated + duckdb <- asNamespace("duckdb") + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- duckdb$rel_from_df(con, df1, experimental = experimental) + rel2 <- duckdb$rel_project( + rel1, + list( + { + tmp_expr <- duckdb$expr_reference("a") + duckdb$expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("b") + duckdb$expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- duckdb$expr_reference("g") + duckdb$expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(duckdb$expr_constant))) { + duckdb$expr_constant(NA_character_, experimental = experimental) + } else { + duckdb$expr_constant(NA_character_) + } + duckdb$expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel3 <- duckdb$rel_order( + rel2, + list(duckdb$expr_reference("a"), duckdb$expr_reference("b"), duckdb$expr_reference("g"), duckdb$expr_reference("d")) + ) + rel3 + out <- duckdb$rel_to_altrep(rel3) + expect_identical( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + d = rep(NA_character_, 6L) + ) + ) + DBI::dbDisconnect(con, shutdown = TRUE) +}) + # relocate order-preserving ------------------------------------------------------------ test_that("relational relocate(g) order-preserving", { diff --git a/tools/00-funs.R b/tools/00-funs.R index 5c22b3d95..dd35a9c47 100644 --- a/tools/00-funs.R +++ b/tools/00-funs.R @@ -646,6 +646,10 @@ test_extra_arg_map <- list( "d = a %in% NA_real_", "c = NA_character_, d = c %in% NA_character_", + # %in% and empty + "d = a %in% NULL", + "d = a %in% integer()", + # is.na() with NaN "d = NA_real_, e = is.na(d)", "d = NaN, e = is.na(d)", @@ -657,6 +661,12 @@ test_extra_arg_map <- list( # .data adverb "c = .data$b", + # NA constant + "d = NA", + "d = NA_integer_", + "d = NA_real_", + "d = NA_character_", + NULL ), nest_join = "join_by(a)",