Diff of /R/api_xq.R [000000] .. [0bdad5]

Switch to unified view

a b/R/api_xq.R
1
# FUN: Create API functions from .xq files
2
3
#' Convert camel case to snake case
4
#'
5
#' @param name a character vector
6
#'
7
#' @return same length as `name` but with snake case
8
#' @export
9
#'
10
#' @examples
11
#' to_snake("sparseDataRange")
12
to_snake <- function(name) {
13
  s <- sub("(.)([A-Z][a-z]+)", "\\1_\\2", name)
14
  s <- gsub("([a-z0-9])([A-Z])", "\\1_\\2", s)
15
  tolower(s)
16
}
17
18
.rm_extension <- function(filepath) {
19
  sub(
20
    pattern = "(.*)\\..*$", replacement = "\\1",
21
    basename(filepath)
22
  )
23
}
24
25
.marshall_param <- function(p) {
26
  stopifnot(is.atomic(p) | is.list(p))
27
28
  # If input is a list, use .arrayfmt, this fix single gene/sample query
29
  if (is.list(p)) {
30
    p <- as.character(p)
31
    return(.arrayfmt(p))
32
  } else if (length(p) == 1) {
33
    return(.quote(p))
34
  } else if (length(p) > 1) {
35
    return(.arrayfmt(p))
36
  } else {
37
    return("nil")
38
  }
39
}
40
41
.call <- function(query, params) {
42
  sprintf(
43
    "(%s %s)", query,
44
    paste(sapply(params, .marshall_param),
45
      collapse = " "
46
    )
47
  )
48
}
49
50
.make_fun <- function(fun, body, args) {
51
  eval(parse(text = paste(fun,
52
    "<- function(",
53
    args,
54
    ") {\n",
55
    body,
56
    "\n}",
57
    sep = ""
58
  )),
59
  envir = as.environment("package:UCSCXenaTools")
60
  )
61
  # as.call(c(as.name("{"), e)) -> body(ff)
62
  # parse(text="y=\"1\"; return(y)")
63
}
64
65
66
.init_api <- function() {
67
  # .api_generator
68
  xq_files <- list.files(
69
    system.file("queries", package = "UCSCXenaTools"),
70
    pattern = "xq",
71
    full.names = TRUE
72
  )
73
74
  if (length(xq_files) == 0) {
75
    stop("No xq file find!")
76
  }
77
78
79
  for (f in xq_files) {
80
    fn <- .rm_extension(f)
81
    fun <- to_snake(fn)
82
    query <- readr::read_file(f)
83
    params <- sub(
84
      "^[^[]+[[]([^]]*)[]].*$",
85
      "\\1",
86
      query
87
    )
88
    params <- unlist(strsplit(params, split = " "))
89
    all_params <- c("host", params)
90
91
    params <- paste(params, collapse = ", ")
92
    all_params <- paste(all_params, collapse = ", ")
93
    # Create hidden variable for storing xquery
94
    xquery <- paste0(".xq_", fun)
95
    assign(xquery, query,
96
      envir = as.environment("package:UCSCXenaTools")
97
    )
98
    body <- sprintf(
99
      "xquery=get(\".xq_%s\", as.environment(\"package:UCSCXenaTools\")) \nUCSCXenaTools:::.xena_post(host, UCSCXenaTools:::.call(xquery, list(%s)), simplifyVector = TRUE)",
100
      fun,
101
      params
102
    )
103
104
    # Create hidden functions
105
    fun <- paste0(".p_", fun)
106
    .make_fun(fun, body, all_params)
107
  }
108
}