test_that("column order is matched", {
df1 <- memdb_frame(x = 1, y = 2)
df2 <- memdb_frame(y = 1, x = 2)
out <- collect(union(df1, df2))
expect_equal(out, tibble(x = c(1, 2), y = c(2, 1)))
})
test_that("missing columns filled with NULL", {
df1 <- memdb_frame(x = 1)
df2 <- memdb_frame(y = 2)
out <- collect(union_all(df1, df2))
expect_equal(out, tibble(x = c(1, NA), y = c(NA, 2)))
})
test_that("first edition works", {
con <- structure(list(), class = c("Test", "DBIConnection"))
local_methods(
sql_escape_ident.Test = function(con, x) sql_quote(x, "`")
)
lf <- lazy_frame(x = 1, con = con)
local_options(rlib_warning_verbosity = "quiet")
expect_error(union_all(lf, lf) %>% remote_query(), NA)
})
# SQL generation ----------------------------------------------------------
test_that("set ops generates correct sql", {
lf1 <- memdb_frame(x = 1)
lf2 <- memdb_frame(x = c(1, 2))
out <- lf1 %>%
union(lf2) %>%
collect()
expect_equal(out, tibble(x = c(1, 2)))
})
test_that("union and union all work for all backends", {
df <- tibble(x = 1:10, y = x %% 2)
tbls_full <- test_load(df)
tbls_filter <- test_load(filter(df, y == 0))
tbls_full %>%
purrr::map2(tbls_filter, union) %>%
expect_equal_tbls()
tbls_full %>%
purrr::map2(tbls_filter, union_all) %>%
expect_equal_tbls()
})
test_that("can combine multiple union in one query", {
lf1 <- lazy_frame(x = 1, y = 1, .name = "lf1")
lf2 <- lazy_frame(y = 1, .name = "lf2")
lf3 <- lazy_frame(z = 1, .name = "lf3")
expect_snapshot(
lf1 %>%
union_all(lf2) %>%
union(lf3)
)
# cte works
expect_snapshot(
lf1 %>%
union_all(lf2) %>%
union(lf3) %>%
left_join(lf1, by = "x") %>%
show_query(sql_options = sql_options(cte = TRUE))
)
lf_union <- lf1 %>%
union_all(lf2) %>%
union(lf3)
out <- lf_union %>% mutate(a = x + y) %>% sql_build()
expect_equal(out$select, sql("`q01`.*", a = "`x` + `y`"))
})
test_that("intersect and setdiff work for supported backends", {
df <- tibble(x = 1:10, y = x %% 2)
# MySQL doesn't support EXCEPT or INTERSECT
tbls_full <- test_load(df, ignore = c("mysql", "MariaDB"))
tbls_filter <- test_load(filter(df, y == 0), ignore = c("mysql", "MariaDB"))
tbls_full %>%
purrr::map2(tbls_filter, intersect) %>%
expect_equal_tbls()
tbls_full %>%
purrr::map2(tbls_filter, setdiff) %>%
expect_equal_tbls()
})
test_that("SQLite warns if set op attempted when tbl has LIMIT", {
mf <- memdb_frame(x = 1:2)
m1 <- head(mf, 1)
expect_error(union(mf, m1), "does not support")
expect_error(union(m1, mf), "does not support")
})
test_that("other backends can combine with a limit", {
df <- tibble(x = 1:2)
ignore <- c(
"sqlite", # only allows limit at top level
"mssql" # unusual execution order gives unintuitive result
)
tbls_full <- test_load(df, ignore = ignore)
tbls_head <- lapply(test_load(df, ignore = ignore), head, n = 1)
tbls_full %>%
purrr::map2(tbls_head, union) %>%
expect_equal_tbls(head(df, 1))
tbls_full %>%
purrr::map2(tbls_head, union_all) %>%
expect_equal_tbls(head(df, 1))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.