diff --git a/tests/testthat/test-rel_api.R b/tests/testthat/test-rel_api.R index a0eaf7235..be7496020 100644 --- a/tests/testthat/test-rel_api.R +++ b/tests/testthat/test-rel_api.R @@ -130,9 +130,54 @@ test_that("relational arrange(a) order-preserving", { df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_order(rel1, list(expr_reference("a"))) - rel2 - out <- rel_to_altrep(rel2) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("row_number", list()), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "___row_number") + tmp_expr + } + ) + ) + rel3 <- rel_order(rel2, list(expr_reference("a"), expr_reference("___row_number"))) + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + } + ) + ) + rel4 + out <- rel_to_altrep(rel4) expect_equal( out, data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) @@ -147,9 +192,54 @@ test_that("relational arrange(g) order-preserving", { df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_order(rel1, list(expr_reference("g"))) - rel2 - out <- rel_to_altrep(rel2) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("row_number", list()), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "___row_number") + tmp_expr + } + ) + ) + rel3 <- rel_order(rel2, list(expr_reference("g"), expr_reference("___row_number"))) + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + } + ) + ) + rel4 + out <- rel_to_altrep(rel4) expect_equal( out, data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) @@ -164,9 +254,57 @@ test_that("relational arrange(g, a) order-preserving", { df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_order(rel1, list(expr_reference("g"), expr_reference("a"))) - rel2 - out <- rel_to_altrep(rel2) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("row_number", list()), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "___row_number") + tmp_expr + } + ) + ) + rel3 <- rel_order( + rel2, + list(expr_reference("g"), expr_reference("a"), expr_reference("___row_number")) + ) + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + } + ) + ) + rel4 + out <- rel_to_altrep(rel4) expect_equal( out, data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) @@ -181,9 +319,57 @@ test_that("relational arrange(a, g) order-preserving", { df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_order(rel1, list(expr_reference("a"), expr_reference("g"))) - rel2 - out <- rel_to_altrep(rel2) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("row_number", list()), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "___row_number") + tmp_expr + } + ) + ) + rel3 <- rel_order( + rel2, + list(expr_reference("a"), expr_reference("g"), expr_reference("___row_number")) + ) + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + } + ) + ) + rel4 + out <- rel_to_altrep(rel4) expect_equal( out, data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) @@ -924,7 +1110,7 @@ test_that("relational distinct() order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -1031,7 +1217,7 @@ test_that("relational distinct(a) order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -1138,7 +1324,7 @@ test_that("relational distinct(a, b) order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -1240,7 +1426,7 @@ test_that("relational distinct(b, b) order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -1337,7 +1523,7 @@ test_that("relational distinct(g) order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -1530,7 +1716,7 @@ test_that("relational union_all(data.frame(a = 1L, b = 3, g = 2L)) %>% distinct( tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -1723,7 +1909,7 @@ test_that("relational union_all(data.frame(a = 1L, b = 4, g = 2L)) %>% distinct( tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -1916,7 +2102,7 @@ test_that("relational union_all(data.frame(a = 1L, b = 5, g = 2L)) %>% distinct( tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -2109,7 +2295,7 @@ test_that("relational union_all(data.frame(a = 1L, b = 6, g = 2L)) %>% distinct( tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -2302,7 +2488,7 @@ test_that("relational union_all(data.frame(a = 1L, b = 7, g = 2L)) %>% distinct( tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -2409,7 +2595,7 @@ test_that("relational distinct(g, .keep_all = TRUE) order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -2826,7 +3012,7 @@ test_that("relational distinct(g, .keep_all = TRUE) order-enforcing", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -2895,8 +3081,33 @@ test_that("relational filter(a == 1) order-preserving", { df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_filter( + rel2 <- rel_project( rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("row_number", list()), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "___row_number") + tmp_expr + } + ) + ) + rel3 <- rel_filter( + rel2, list( expr_function( "==", @@ -2911,26 +3122,72 @@ test_that("relational filter(a == 1) order-preserving", { ) ) ) - rel2 - out <- rel_to_altrep(rel2) - expect_equal( - out, - data.frame(a = 1, b = 2, g = 1L) - ) - dbDisconnect(con, shutdown = TRUE) -}) - -test_that("relational filter(a %in% 2:3, g == 2) order-preserving", { - # Autogenerated - con <- dbConnect(duckdb()) + rel4 <- rel_order(rel3, list(expr_reference("___row_number"))) + rel5 <- rel_project( + rel4, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + } + ) + ) + rel5 + out <- rel_to_altrep(rel5) + expect_equal( + out, + data.frame(a = 1, b = 2, g = 1L) + ) + dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational filter(a %in% 2:3, g == 2) order-preserving", { + # Autogenerated + con <- dbConnect(duckdb()) experimental <- FALSE invisible(dbExecute(con, "CREATE MACRO \"|\"(x, y) AS (x OR y)")) invisible(dbExecute(con, "CREATE MACRO \"==\"(x, y) AS x = y")) df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_filter( + rel2 <- rel_project( rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("row_number", list()), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "___row_number") + tmp_expr + } + ) + ) + rel3 <- rel_filter( + rel2, list( expr_function( "|", @@ -2972,8 +3229,29 @@ test_that("relational filter(a %in% 2:3, g == 2) order-preserving", { ) ) ) - rel2 - out <- rel_to_altrep(rel2) + rel4 <- rel_order(rel3, list(expr_reference("___row_number"))) + rel5 <- rel_project( + rel4, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + } + ) + ) + rel5 + out <- rel_to_altrep(rel5) expect_equal( out, data.frame(a = c(2, 3), b = c(2, 2), g = c(2L, 2L)) @@ -2991,8 +3269,33 @@ test_that("relational filter(a %in% 2:3 & g == 2) order-preserving", { df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_filter( + rel2 <- rel_project( rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("row_number", list()), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "___row_number") + tmp_expr + } + ) + ) + rel3 <- rel_filter( + rel2, list( expr_function( "&", @@ -3039,8 +3342,29 @@ test_that("relational filter(a %in% 2:3 & g == 2) order-preserving", { ) ) ) - rel2 - out <- rel_to_altrep(rel2) + rel4 <- rel_order(rel3, list(expr_reference("___row_number"))) + rel5 <- rel_project( + rel4, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + } + ) + ) + rel5 + out <- rel_to_altrep(rel5) expect_equal( out, data.frame(a = c(2, 3), b = c(2, 2), g = c(2L, 2L)) @@ -3048,6 +3372,102 @@ test_that("relational filter(a %in% 2:3 & g == 2) order-preserving", { dbDisconnect(con, shutdown = TRUE) }) +test_that("relational filter(a != 2 | g != 2) order-preserving", { + # Autogenerated + con <- dbConnect(duckdb()) + experimental <- FALSE + invisible(dbExecute(con, "CREATE MACRO \"|\"(x, y) AS (x OR y)")) + invisible(dbExecute(con, "CREATE MACRO \"!=\"(x, y) AS x <> y")) + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- rel_from_df(con, df1, experimental = experimental) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("row_number", list()), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "___row_number") + tmp_expr + } + ) + ) + rel3 <- rel_filter( + rel2, + list( + expr_function( + "|", + list( + expr_function( + "!=", + list( + expr_reference("a"), + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(2, experimental = experimental) + } else { + expr_constant(2) + } + ) + ), + expr_function( + "!=", + list( + expr_reference("g"), + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(2, experimental = experimental) + } else { + expr_constant(2) + } + ) + ) + ) + ) + ) + ) + rel4 <- rel_order(rel3, list(expr_reference("___row_number"))) + rel5 <- rel_project( + rel4, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + } + ) + ) + rel5 + out <- rel_to_altrep(rel5) + expect_equal( + out, + data.frame(a = c(1, 3, 4, 5, 6), b = rep(2, 5L), g = c(1L, 2L, 3L, 3L, 3L)) + ) + dbDisconnect(con, shutdown = TRUE) +}) + # filter order-enforcing --------------------------------------------------------------- test_that("relational filter(a == 1) order-enforcing", { @@ -3223,39 +3643,93 @@ test_that("relational filter(a %in% 2:3 & g == 2) order-enforcing", { dbDisconnect(con, shutdown = TRUE) }) -# full_join order-preserving ----------------------------------------------------------- - -test_that("relational full_join(join_by(a)) order-preserving", { +test_that("relational filter(a != 2 | g != 2) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE - invisible( - dbExecute(con, "CREATE MACRO \"___eq_na_matches_na\"(x, y) AS (x IS NOT DISTINCT FROM y)") - ) - invisible(dbExecute(con, "CREATE MACRO \"___coalesce\"(x, y) AS COALESCE(x, y)")) - df1 <- data.frame(a = 1:4, b = rep(2, 4L)) + invisible(dbExecute(con, "CREATE MACRO \"|\"(x, y) AS (x OR y)")) + invisible(dbExecute(con, "CREATE MACRO \"!=\"(x, y) AS x <> y")) + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_set_alias(rel1, "lhs") - df2 <- data.frame(a = 2:5, b = rep(2, 4L)) - - rel3 <- rel_from_df(con, df2, experimental = experimental) - rel4 <- rel_set_alias(rel3, "rhs") - rel5 <- rel_project( - rel2, + rel2 <- rel_filter( + rel1, list( - { - tmp_expr <- expr_reference("a") - expr_set_alias(tmp_expr, "a_x") - tmp_expr - }, - { - tmp_expr <- expr_reference("b") - expr_set_alias(tmp_expr, "b_x") - tmp_expr - } - ) - ) + expr_function( + "|", + list( + expr_function( + "!=", + list( + expr_reference("a"), + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(2, experimental = experimental) + } else { + expr_constant(2) + } + ) + ), + expr_function( + "!=", + list( + expr_reference("g"), + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(2, experimental = experimental) + } else { + expr_constant(2) + } + ) + ) + ) + ) + ) + ) + rel3 <- rel_order( + rel2, + list(expr_reference("a"), expr_reference("b"), expr_reference("g")) + ) + rel3 + out <- rel_to_altrep(rel3) + expect_equal( + out, + data.frame(a = c(1, 3, 4, 5, 6), b = rep(2, 5L), g = c(1L, 2L, 3L, 3L, 3L)) + ) + dbDisconnect(con, shutdown = TRUE) +}) + +# full_join order-preserving ----------------------------------------------------------- + +test_that("relational full_join(join_by(a)) order-preserving", { + # Autogenerated + con <- dbConnect(duckdb()) + experimental <- FALSE + invisible( + dbExecute(con, "CREATE MACRO \"___eq_na_matches_na\"(x, y) AS (x IS NOT DISTINCT FROM y)") + ) + invisible(dbExecute(con, "CREATE MACRO \"___coalesce\"(x, y) AS COALESCE(x, y)")) + df1 <- data.frame(a = 1:4, b = rep(2, 4L)) + + rel1 <- rel_from_df(con, df1, experimental = experimental) + rel2 <- rel_set_alias(rel1, "lhs") + df2 <- data.frame(a = 2:5, b = rep(2, 4L)) + + rel3 <- rel_from_df(con, df2, experimental = experimental) + rel4 <- rel_set_alias(rel3, "rhs") + rel5 <- rel_project( + rel2, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a_x") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b_x") + tmp_expr + } + ) + ) rel6 <- rel_project( rel4, list( @@ -3771,7 +4245,7 @@ test_that("relational intersect() order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -7090,18 +7564,364 @@ test_that("relational mutate(c = 0, d = 0, e = c / d) order-preserving", { tmp_expr }, { - tmp_expr <- if ("experimental" %in% names(formals(expr_constant))) { - expr_constant(0, experimental = experimental) - } else { - expr_constant(0) - } + tmp_expr <- if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(0, experimental = experimental) + } else { + expr_constant(0) + } + expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_reference("d") + expr_set_alias(tmp_expr, "d") + tmp_expr + }, + { + tmp_expr <- expr_function("___divide", list(expr_reference("c"), expr_reference("d"))) + expr_set_alias(tmp_expr, "e") + tmp_expr + } + ) + ) + rel4 + out <- rel_to_altrep(rel4) + expect_equal( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + c = numeric(6), + d = numeric(6), + e = rep(NaN, 6L) + ) + ) + dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(c = 0, d = -1, e = log(c), f = log(d)) order-preserving", { + # Autogenerated + con <- dbConnect(duckdb()) + experimental <- FALSE + invisible( + dbExecute( + con, + "CREATE MACRO \"log\"(x) AS CASE WHEN x < 0 THEN CAST('NaN' AS double) WHEN x = 0 THEN CAST('-Inf' AS double) ELSE ln(x) END" + ) + ) + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- rel_from_df(con, df1, experimental = experimental) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(0, experimental = experimental) + } else { + expr_constant(0) + } + expr_set_alias(tmp_expr, "c") + tmp_expr + } + ) + ) + rel3 <- rel_project( + rel2, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_function( + "-", + list( + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(1, experimental = experimental) + } else { + expr_constant(1) + } + ) + ) + expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_reference("d") + expr_set_alias(tmp_expr, "d") + tmp_expr + }, + { + tmp_expr <- expr_function("log", list(expr_reference("c"))) + expr_set_alias(tmp_expr, "e") + tmp_expr + } + ) + ) + rel5 <- rel_project( + rel4, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_reference("d") + expr_set_alias(tmp_expr, "d") + tmp_expr + }, + { + tmp_expr <- expr_reference("e") + expr_set_alias(tmp_expr, "e") + tmp_expr + }, + { + tmp_expr <- expr_function("log", list(expr_reference("d"))) + expr_set_alias(tmp_expr, "f") + tmp_expr + } + ) + ) + rel5 + out <- rel_to_altrep(rel5) + expect_equal( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + c = numeric(6), + d = rep(-1, 6L), + e = rep(-Inf, 6L), + f = rep(NaN, 6L) + ) + ) + dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(c = 0, d = -1, e = log(c), f = log10(d)) order-preserving", { + # Autogenerated + con <- dbConnect(duckdb()) + experimental <- FALSE + invisible( + dbExecute( + con, + "CREATE MACRO \"log\"(x) AS CASE WHEN x < 0 THEN CAST('NaN' AS double) WHEN x = 0 THEN CAST('-Inf' AS double) ELSE ln(x) END" + ) + ) + invisible( + dbExecute( + con, + "CREATE MACRO \"log10\"(x) AS CASE WHEN x < 0 THEN CAST('NaN' AS double) WHEN x = 0 THEN CAST('-Inf' AS double) ELSE log(x) END" + ) + ) + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- rel_from_df(con, df1, experimental = experimental) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(0, experimental = experimental) + } else { + expr_constant(0) + } + expr_set_alias(tmp_expr, "c") + tmp_expr + } + ) + ) + rel3 <- rel_project( + rel2, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_function( + "-", + list( + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(1, experimental = experimental) + } else { + expr_constant(1) + } + ) + ) + expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) + ) + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_reference("d") expr_set_alias(tmp_expr, "d") tmp_expr + }, + { + tmp_expr <- expr_function("log", list(expr_reference("c"))) + expr_set_alias(tmp_expr, "e") + tmp_expr } ) ) - rel4 <- rel_project( - rel3, + rel5 <- rel_project( + rel4, list( { tmp_expr <- expr_reference("a") @@ -7129,14 +7949,19 @@ test_that("relational mutate(c = 0, d = 0, e = c / d) order-preserving", { tmp_expr }, { - tmp_expr <- expr_function("___divide", list(expr_reference("c"), expr_reference("d"))) + tmp_expr <- expr_reference("e") expr_set_alias(tmp_expr, "e") tmp_expr + }, + { + tmp_expr <- expr_function("log10", list(expr_reference("d"))) + expr_set_alias(tmp_expr, "f") + tmp_expr } ) ) - rel4 - out <- rel_to_altrep(rel4) + rel5 + out <- rel_to_altrep(rel5) expect_equal( out, data.frame( @@ -7144,8 +7969,9 @@ test_that("relational mutate(c = 0, d = 0, e = c / d) order-preserving", { b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), c = numeric(6), - d = numeric(6), - e = rep(NaN, 6L) + d = rep(-1, 6L), + e = rep(-Inf, 6L), + f = rep(NaN, 6L) ) ) dbDisconnect(con, shutdown = TRUE) @@ -8567,7 +9393,239 @@ test_that("relational mutate(lag(a, default = 0), .by = g) order-enforcing", { ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("lag(a, default = 0)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("lag(a, default = 0)")) + ) + rel3 + out <- rel_to_altrep(rel3) + expect_equal( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + `lag(a, default = 0)` = c(0, 0, 2, 0, 4, 5), + check.names = FALSE + ) + ) + dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(lead(a, default = 1000)) order-enforcing", { + # Autogenerated + con <- dbConnect(duckdb()) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- rel_from_df(con, df1, experimental = experimental) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window( + expr_function("lead", list(x = expr_reference("a"))), + list(), + list(), + offset_expr = if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(1L, experimental = experimental) + } else { + expr_constant(1L) + }, + default_expr = if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(1000, experimental = experimental) + } else { + expr_constant(1000) + } + ) + expr_set_alias(tmp_expr, "lead(a, default = 1000)") + tmp_expr + } + ) + ) + rel3 <- rel_order( + rel2, + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("lead(a, default = 1000)")) + ) + rel3 + out <- rel_to_altrep(rel3) + expect_equal( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + `lead(a, default = 1000)` = c(2, 3, 4, 5, 6, 1000), + check.names = FALSE + ) + ) + dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(lead(a, default = 1000), .by = g) order-enforcing", { + # Autogenerated + con <- dbConnect(duckdb()) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- rel_from_df(con, df1, experimental = experimental) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window( + expr_function("lead", list(x = expr_reference("a"))), + list(expr_reference("g")), + list(), + offset_expr = if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(1L, experimental = experimental) + } else { + expr_constant(1L) + }, + default_expr = if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(1000, experimental = experimental) + } else { + expr_constant(1000) + } + ) + expr_set_alias(tmp_expr, "lead(a, default = 1000)") + tmp_expr + } + ) + ) + rel3 <- rel_order( + rel2, + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("lead(a, default = 1000)")) + ) + rel3 + out <- rel_to_altrep(rel3) + expect_equal( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + `lead(a, default = 1000)` = c(1000, 3, 1000, 5, 6, 1000), + check.names = FALSE + ) + ) + dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(min(a)) order-enforcing", { + # Autogenerated + con <- dbConnect(duckdb()) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- rel_from_df(con, df1, experimental = experimental) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("min", list(expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "min(a)") + tmp_expr + } + ) + ) + rel3 <- rel_order( + rel2, + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("min(a)")) + ) + rel3 + out <- rel_to_altrep(rel3) + expect_equal( + out, + data.frame( + a = seq(1, 6, by = 1), + b = rep(2, 6L), + g = c(1L, 2L, 2L, 3L, 3L, 3L), + `min(a)` = rep(1, 6L), + check.names = FALSE + ) + ) + dbDisconnect(con, shutdown = TRUE) +}) + +test_that("relational mutate(min(a), .by = g) order-enforcing", { + # Autogenerated + con <- dbConnect(duckdb()) + experimental <- FALSE + df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) + + rel1 <- rel_from_df(con, df1, experimental = experimental) + rel2 <- rel_project( + rel1, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_window(expr_function("min", list(expr_reference("a"))), list(expr_reference("g")), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "min(a)") + tmp_expr + } + ) + ) + rel3 <- rel_order( + rel2, + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("min(a)")) ) rel3 out <- rel_to_altrep(rel3) @@ -8577,14 +9635,14 @@ test_that("relational mutate(lag(a, default = 0), .by = g) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `lag(a, default = 0)` = c(0, 0, 2, 0, 4, 5), + `min(a)` = c(1, 2, 2, 4, 4, 4), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(lead(a, default = 1000)) order-enforcing", { +test_that("relational mutate(max(a)) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE @@ -8610,29 +9668,15 @@ test_that("relational mutate(lead(a, default = 1000)) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window( - expr_function("lead", list(x = expr_reference("a"))), - list(), - list(), - offset_expr = if ("experimental" %in% names(formals(expr_constant))) { - expr_constant(1L, experimental = experimental) - } else { - expr_constant(1L) - }, - default_expr = if ("experimental" %in% names(formals(expr_constant))) { - expr_constant(1000, experimental = experimental) - } else { - expr_constant(1000) - } - ) - expr_set_alias(tmp_expr, "lead(a, default = 1000)") + tmp_expr <- expr_window(expr_function("max", list(expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "max(a)") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("lead(a, default = 1000)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("max(a)")) ) rel3 out <- rel_to_altrep(rel3) @@ -8642,14 +9686,14 @@ test_that("relational mutate(lead(a, default = 1000)) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `lead(a, default = 1000)` = c(2, 3, 4, 5, 6, 1000), + `max(a)` = rep(6, 6L), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(lead(a, default = 1000), .by = g) order-enforcing", { +test_that("relational mutate(max(a), .by = g) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE @@ -8675,29 +9719,15 @@ test_that("relational mutate(lead(a, default = 1000), .by = g) order-enforcing", tmp_expr }, { - tmp_expr <- expr_window( - expr_function("lead", list(x = expr_reference("a"))), - list(expr_reference("g")), - list(), - offset_expr = if ("experimental" %in% names(formals(expr_constant))) { - expr_constant(1L, experimental = experimental) - } else { - expr_constant(1L) - }, - default_expr = if ("experimental" %in% names(formals(expr_constant))) { - expr_constant(1000, experimental = experimental) - } else { - expr_constant(1000) - } - ) - expr_set_alias(tmp_expr, "lead(a, default = 1000)") + tmp_expr <- expr_window(expr_function("max", list(expr_reference("a"))), list(expr_reference("g")), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "max(a)") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("lead(a, default = 1000)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("max(a)")) ) rel3 out <- rel_to_altrep(rel3) @@ -8707,14 +9737,14 @@ test_that("relational mutate(lead(a, default = 1000), .by = g) order-enforcing", a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `lead(a, default = 1000)` = c(1000, 3, 1000, 5, 6, 1000), + `max(a)` = c(1, 3, 3, 6, 6, 6), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(min(a)) order-enforcing", { +test_that("relational mutate(first(a)) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE @@ -8740,15 +9770,15 @@ test_that("relational mutate(min(a)) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window(expr_function("min", list(expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) - expr_set_alias(tmp_expr, "min(a)") + tmp_expr <- expr_window(expr_function("first_value", list(expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "first(a)") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("min(a)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("first(a)")) ) rel3 out <- rel_to_altrep(rel3) @@ -8758,14 +9788,14 @@ test_that("relational mutate(min(a)) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `min(a)` = rep(1, 6L), + `first(a)` = rep(1, 6L), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(min(a), .by = g) order-enforcing", { +test_that("relational mutate(first(a), .by = g) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE @@ -8791,15 +9821,15 @@ test_that("relational mutate(min(a), .by = g) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window(expr_function("min", list(expr_reference("a"))), list(expr_reference("g")), list(), offset_expr = NULL, default_expr = NULL) - expr_set_alias(tmp_expr, "min(a)") + tmp_expr <- expr_window(expr_function("first_value", list(expr_reference("a"))), list(expr_reference("g")), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "first(a)") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("min(a)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("first(a)")) ) rel3 out <- rel_to_altrep(rel3) @@ -8809,14 +9839,14 @@ test_that("relational mutate(min(a), .by = g) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `min(a)` = c(1, 2, 2, 4, 4, 4), + `first(a)` = c(1, 2, 2, 4, 4, 4), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(max(a)) order-enforcing", { +test_that("relational mutate(last(a)) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE @@ -8842,15 +9872,15 @@ test_that("relational mutate(max(a)) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window(expr_function("max", list(expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) - expr_set_alias(tmp_expr, "max(a)") + tmp_expr <- expr_window(expr_function("last_value", list(expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "last(a)") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("max(a)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("last(a)")) ) rel3 out <- rel_to_altrep(rel3) @@ -8860,14 +9890,14 @@ test_that("relational mutate(max(a)) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `max(a)` = rep(6, 6L), + `last(a)` = rep(6, 6L), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(max(a), .by = g) order-enforcing", { +test_that("relational mutate(last(a), .by = g) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE @@ -8893,15 +9923,15 @@ test_that("relational mutate(max(a), .by = g) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window(expr_function("max", list(expr_reference("a"))), list(expr_reference("g")), list(), offset_expr = NULL, default_expr = NULL) - expr_set_alias(tmp_expr, "max(a)") + tmp_expr <- expr_window(expr_function("last_value", list(expr_reference("a"))), list(expr_reference("g")), list(), offset_expr = NULL, default_expr = NULL) + expr_set_alias(tmp_expr, "last(a)") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("max(a)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("last(a)")) ) rel3 out <- rel_to_altrep(rel3) @@ -8911,14 +9941,14 @@ test_that("relational mutate(max(a), .by = g) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `max(a)` = c(1, 3, 3, 6, 6, 6), + `last(a)` = c(1, 3, 3, 6, 6, 6), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(first(a)) order-enforcing", { +test_that("relational mutate(nth(a, 2)) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE @@ -8944,15 +9974,31 @@ test_that("relational mutate(first(a)) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window(expr_function("first_value", list(expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) - expr_set_alias(tmp_expr, "first(a)") + tmp_expr <- expr_window( + expr_function( + "nth_value", + list( + expr_reference("a"), + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(2, experimental = experimental) + } else { + expr_constant(2) + } + ) + ), + list(), + list(), + offset_expr = NULL, + default_expr = NULL + ) + expr_set_alias(tmp_expr, "nth(a, 2)") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("first(a)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("nth(a, 2)")) ) rel3 out <- rel_to_altrep(rel3) @@ -8962,14 +10008,14 @@ test_that("relational mutate(first(a)) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `first(a)` = rep(1, 6L), + `nth(a, 2)` = rep(2, 6L), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(first(a), .by = g) order-enforcing", { +test_that("relational mutate(nth(a, 2), .by = g) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE @@ -8995,15 +10041,31 @@ test_that("relational mutate(first(a), .by = g) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window(expr_function("first_value", list(expr_reference("a"))), list(expr_reference("g")), list(), offset_expr = NULL, default_expr = NULL) - expr_set_alias(tmp_expr, "first(a)") + tmp_expr <- expr_window( + expr_function( + "nth_value", + list( + expr_reference("a"), + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(2, experimental = experimental) + } else { + expr_constant(2) + } + ) + ), + list(expr_reference("g")), + list(), + offset_expr = NULL, + default_expr = NULL + ) + expr_set_alias(tmp_expr, "nth(a, 2)") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("first(a)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("nth(a, 2)")) ) rel3 out <- rel_to_altrep(rel3) @@ -9013,17 +10075,23 @@ test_that("relational mutate(first(a), .by = g) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `first(a)` = c(1, 2, 2, 4, 4, 4), + `nth(a, 2)` = c(NA, 3, 3, 5, 5, 5), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(last(a)) order-enforcing", { +test_that("relational mutate(a / b) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE + invisible( + dbExecute( + con, + "CREATE MACRO \"___divide\"(x, y) AS CASE WHEN x = 0 AND y = 0 THEN CAST('NaN' AS double) ELSE CAST(x AS double) / y END" + ) + ) df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) @@ -9046,15 +10114,15 @@ test_that("relational mutate(last(a)) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window(expr_function("last_value", list(expr_reference("a"))), list(), list(), offset_expr = NULL, default_expr = NULL) - expr_set_alias(tmp_expr, "last(a)") + tmp_expr <- expr_function("___divide", list(expr_reference("a"), expr_reference("b"))) + expr_set_alias(tmp_expr, "a/b") tmp_expr } ) ) rel3 <- rel_order( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("last(a)")) + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("a/b")) ) rel3 out <- rel_to_altrep(rel3) @@ -9064,17 +10132,23 @@ test_that("relational mutate(last(a)) order-enforcing", { a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `last(a)` = rep(6, 6L), + `a/b` = seq(0.5, 3, by = 0.5), check.names = FALSE ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(last(a), .by = g) order-enforcing", { +test_that("relational mutate(c = 0, d = 0, e = c / d) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE + invisible( + dbExecute( + con, + "CREATE MACRO \"___divide\"(x, y) AS CASE WHEN x = 0 AND y = 0 THEN CAST('NaN' AS double) ELSE CAST(x AS double) / y END" + ) + ) df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) @@ -9097,35 +10171,115 @@ test_that("relational mutate(last(a), .by = g) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window(expr_function("last_value", list(expr_reference("a"))), list(expr_reference("g")), list(), offset_expr = NULL, default_expr = NULL) - expr_set_alias(tmp_expr, "last(a)") + tmp_expr <- if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(0, experimental = experimental) + } else { + expr_constant(0) + } + expr_set_alias(tmp_expr, "c") tmp_expr } ) ) - rel3 <- rel_order( + rel3 <- rel_project( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("last(a)")) + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(0, experimental = experimental) + } else { + expr_constant(0) + } + expr_set_alias(tmp_expr, "d") + tmp_expr + } + ) ) - rel3 - out <- rel_to_altrep(rel3) + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_reference("d") + expr_set_alias(tmp_expr, "d") + tmp_expr + }, + { + tmp_expr <- expr_function("___divide", list(expr_reference("c"), expr_reference("d"))) + expr_set_alias(tmp_expr, "e") + tmp_expr + } + ) + ) + rel5 <- rel_order( + rel4, + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("c"), expr_reference("d"), expr_reference("e")) + ) + rel5 + out <- rel_to_altrep(rel5) expect_equal( out, data.frame( a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `last(a)` = c(1, 3, 3, 6, 6, 6), - check.names = FALSE + c = numeric(6), + d = numeric(6), + e = rep(NaN, 6L) ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(nth(a, 2)) order-enforcing", { +test_that("relational mutate(c = 0, d = -1, e = log(c), f = log(d)) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE + invisible( + dbExecute( + con, + "CREATE MACRO \"log\"(x) AS CASE WHEN x < 0 THEN CAST('NaN' AS double) WHEN x = 0 THEN CAST('-Inf' AS double) ELSE ln(x) END" + ) + ) df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) rel1 <- rel_from_df(con, df1, experimental = experimental) @@ -9148,56 +10302,18 @@ test_that("relational mutate(nth(a, 2)) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window( - expr_function( - "nth_value", - list( - expr_reference("a"), - if ("experimental" %in% names(formals(expr_constant))) { - expr_constant(2, experimental = experimental) - } else { - expr_constant(2) - } - ) - ), - list(), - list(), - offset_expr = NULL, - default_expr = NULL - ) - expr_set_alias(tmp_expr, "nth(a, 2)") + tmp_expr <- if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(0, experimental = experimental) + } else { + expr_constant(0) + } + expr_set_alias(tmp_expr, "c") tmp_expr } ) ) - rel3 <- rel_order( + rel3 <- rel_project( rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("nth(a, 2)")) - ) - rel3 - out <- rel_to_altrep(rel3) - expect_equal( - out, - data.frame( - a = seq(1, 6, by = 1), - b = rep(2, 6L), - g = c(1L, 2L, 2L, 3L, 3L, 3L), - `nth(a, 2)` = rep(2, 6L), - check.names = FALSE - ) - ) - dbDisconnect(con, shutdown = TRUE) -}) - -test_that("relational mutate(nth(a, 2), .by = g) order-enforcing", { - # Autogenerated - con <- dbConnect(duckdb()) - experimental <- FALSE - df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) - - rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_project( - rel1, list( { tmp_expr <- expr_reference("a") @@ -9215,62 +10331,63 @@ test_that("relational mutate(nth(a, 2), .by = g) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_window( - expr_function( - "nth_value", - list( - expr_reference("a"), - if ("experimental" %in% names(formals(expr_constant))) { - expr_constant(2, experimental = experimental) - } else { - expr_constant(2) - } - ) - ), - list(expr_reference("g")), - list(), - offset_expr = NULL, - default_expr = NULL + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_function( + "-", + list( + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(1, experimental = experimental) + } else { + expr_constant(1) + } + ) ) - expr_set_alias(tmp_expr, "nth(a, 2)") + expr_set_alias(tmp_expr, "d") tmp_expr } ) ) - rel3 <- rel_order( - rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("nth(a, 2)")) - ) - rel3 - out <- rel_to_altrep(rel3) - expect_equal( - out, - data.frame( - a = seq(1, 6, by = 1), - b = rep(2, 6L), - g = c(1L, 2L, 2L, 3L, 3L, 3L), - `nth(a, 2)` = c(NA, 3, 3, 5, 5, 5), - check.names = FALSE - ) - ) - dbDisconnect(con, shutdown = TRUE) -}) - -test_that("relational mutate(a / b) order-enforcing", { - # Autogenerated - con <- dbConnect(duckdb()) - experimental <- FALSE - invisible( - dbExecute( - con, - "CREATE MACRO \"___divide\"(x, y) AS CASE WHEN x = 0 AND y = 0 THEN CAST('NaN' AS double) ELSE CAST(x AS double) / y END" + rel4 <- rel_project( + rel3, + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_reference("d") + expr_set_alias(tmp_expr, "d") + tmp_expr + }, + { + tmp_expr <- expr_function("log", list(expr_reference("c"))) + expr_set_alias(tmp_expr, "e") + tmp_expr + } ) ) - df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) - - rel1 <- rel_from_df(con, df1, experimental = experimental) - rel2 <- rel_project( - rel1, + rel5 <- rel_project( + rel4, list( { tmp_expr <- expr_reference("a") @@ -9288,39 +10405,62 @@ test_that("relational mutate(a / b) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_function("___divide", list(expr_reference("a"), expr_reference("b"))) - expr_set_alias(tmp_expr, "a/b") + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_reference("d") + expr_set_alias(tmp_expr, "d") + tmp_expr + }, + { + tmp_expr <- expr_reference("e") + expr_set_alias(tmp_expr, "e") + tmp_expr + }, + { + tmp_expr <- expr_function("log", list(expr_reference("d"))) + expr_set_alias(tmp_expr, "f") tmp_expr } ) ) - rel3 <- rel_order( - rel2, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("a/b")) + rel6 <- rel_order( + rel5, + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("c"), expr_reference("d"), expr_reference("e"), expr_reference("f")) ) - rel3 - out <- rel_to_altrep(rel3) + rel6 + out <- rel_to_altrep(rel6) expect_equal( out, data.frame( a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), - `a/b` = seq(0.5, 3, by = 0.5), - check.names = FALSE + c = numeric(6), + d = rep(-1, 6L), + e = rep(-Inf, 6L), + f = rep(NaN, 6L) ) ) dbDisconnect(con, shutdown = TRUE) }) -test_that("relational mutate(c = 0, d = 0, e = c / d) order-enforcing", { +test_that("relational mutate(c = 0, d = -1, e = log(c), f = log10(d)) order-enforcing", { # Autogenerated con <- dbConnect(duckdb()) experimental <- FALSE invisible( dbExecute( con, - "CREATE MACRO \"___divide\"(x, y) AS CASE WHEN x = 0 AND y = 0 THEN CAST('NaN' AS double) ELSE CAST(x AS double) / y END" + "CREATE MACRO \"log\"(x) AS CASE WHEN x < 0 THEN CAST('NaN' AS double) WHEN x = 0 THEN CAST('-Inf' AS double) ELSE ln(x) END" + ) + ) + invisible( + dbExecute( + con, + "CREATE MACRO \"log10\"(x) AS CASE WHEN x < 0 THEN CAST('NaN' AS double) WHEN x = 0 THEN CAST('-Inf' AS double) ELSE log(x) END" ) ) df1 <- data.frame(a = seq(1, 6, by = 1), b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L)) @@ -9379,11 +10519,16 @@ test_that("relational mutate(c = 0, d = 0, e = c / d) order-enforcing", { tmp_expr }, { - tmp_expr <- if ("experimental" %in% names(formals(expr_constant))) { - expr_constant(0, experimental = experimental) - } else { - expr_constant(0) - } + tmp_expr <- expr_function( + "-", + list( + if ("experimental" %in% names(formals(expr_constant))) { + expr_constant(1, experimental = experimental) + } else { + expr_constant(1) + } + ) + ) expr_set_alias(tmp_expr, "d") tmp_expr } @@ -9418,18 +10563,58 @@ test_that("relational mutate(c = 0, d = 0, e = c / d) order-enforcing", { tmp_expr }, { - tmp_expr <- expr_function("___divide", list(expr_reference("c"), expr_reference("d"))) + tmp_expr <- expr_function("log", list(expr_reference("c"))) expr_set_alias(tmp_expr, "e") tmp_expr } ) ) - rel5 <- rel_order( + rel5 <- rel_project( rel4, - list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("c"), expr_reference("d"), expr_reference("e")) + list( + { + tmp_expr <- expr_reference("a") + expr_set_alias(tmp_expr, "a") + tmp_expr + }, + { + tmp_expr <- expr_reference("b") + expr_set_alias(tmp_expr, "b") + tmp_expr + }, + { + tmp_expr <- expr_reference("g") + expr_set_alias(tmp_expr, "g") + tmp_expr + }, + { + tmp_expr <- expr_reference("c") + expr_set_alias(tmp_expr, "c") + tmp_expr + }, + { + tmp_expr <- expr_reference("d") + expr_set_alias(tmp_expr, "d") + tmp_expr + }, + { + tmp_expr <- expr_reference("e") + expr_set_alias(tmp_expr, "e") + tmp_expr + }, + { + tmp_expr <- expr_function("log10", list(expr_reference("d"))) + expr_set_alias(tmp_expr, "f") + tmp_expr + } + ) ) - rel5 - out <- rel_to_altrep(rel5) + rel6 <- rel_order( + rel5, + list(expr_reference("a"), expr_reference("b"), expr_reference("g"), expr_reference("c"), expr_reference("d"), expr_reference("e"), expr_reference("f")) + ) + rel6 + out <- rel_to_altrep(rel6) expect_equal( out, data.frame( @@ -9437,8 +10622,9 @@ test_that("relational mutate(c = 0, d = 0, e = c / d) order-enforcing", { b = rep(2, 6L), g = c(1L, 2L, 2L, 3L, 3L, 3L), c = numeric(6), - d = numeric(6), - e = rep(NaN, 6L) + d = rep(-1, 6L), + e = rep(-Inf, 6L), + f = rep(NaN, 6L) ) ) dbDisconnect(con, shutdown = TRUE) @@ -10537,7 +11723,7 @@ test_that("relational setdiff() order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -11240,7 +12426,7 @@ test_that("relational symdiff() order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL ) @@ -11646,7 +12832,7 @@ test_that("relational union() order-preserving", { tmp_expr } ), - list(), + list(expr_reference("___row_number")), offset_expr = NULL, default_expr = NULL )