forked from tidyverse/dplyr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql-render.R
74 lines (61 loc) · 2.11 KB
/
sql-render.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#' @export
#' @rdname sql_build
sql_render <- function(query, con = NULL, ...) {
UseMethod("sql_render")
}
#' @export
sql_render.op <- function(query, con = NULL, ...) {
sql_render(sql_build(query, ...), con = con, ...)
}
#' @export
sql_render.tbl_sql <- function(query, con = NULL, ...) {
if (is.null(con)) {
con <- con_acquire(query$src)
on.exit(con_release(query$src, con), add = TRUE)
}
sql_render(sql_build(query$ops, con, ...), con = con, ...)
}
#' @export
sql_render.tbl_lazy <- function(query, con = NULL, ...) {
sql_render(sql_build(query$ops, con = NULL, ...), con = NULL, ...)
}
#' @export
sql_render.select_query <- function(query, con = NULL, ..., root = FALSE) {
from <- sql_subquery(con, sql_render(query$from, con, ..., root = root), name = NULL)
sql_select(
con, query$select, from, where = query$where, group_by = query$group_by,
having = query$having, order_by = query$order_by, limit = query$limit,
distinct = query$distinct,
...
)
}
#' @export
sql_render.ident <- function(query, con = NULL, ..., root = TRUE) {
if (root) {
sql_select(con, sql("*"), query)
} else {
query
}
}
#' @export
sql_render.sql <- function(query, con = NULL, ...) {
query
}
#' @export
sql_render.join_query <- function(query, con = NULL, ..., root = FALSE) {
from_x <- sql_subquery(con, sql_render(query$x, con, ..., root = root), name = NULL)
from_y <- sql_subquery(con, sql_render(query$y, con, ..., root = root), name = NULL)
sql_join(con, from_x, from_y, type = query$type, by = query$by)
}
#' @export
sql_render.semi_join_query <- function(query, con = NULL, ..., root = FALSE) {
from_x <- sql_subquery(con, sql_render(query$x, con, ..., root = root), name = "_LEFT")
from_y <- sql_subquery(con, sql_render(query$y, con, ..., root = root), name = "_RIGHT")
sql_semi_join(con, from_x, from_y, anti = query$anti, by = query$by)
}
#' @export
sql_render.set_op_query <- function(query, con = NULL, ..., root = FALSE) {
from_x <- sql_render(query$x, con, ..., root = TRUE)
from_y <- sql_render(query$y, con, ..., root = TRUE)
sql_set_op(con, from_x, from_y, method = query$type)
}