dbplyr 中的 sql_variant 是否正常工作?
Does sql_variant in dbplyr work as it should?
让我们看一下?sql_variant
中的例子:
我们为聚合函数定义了一个新的翻译器函数,从默认函数扩展而来:
postgres_agg <- sql_translator(.parent = base_agg,
cor = sql_prefix("corr"),
cov = sql_prefix("covar_samp"),
sd = sql_prefix("stddev_samp"),
var = sql_prefix("var_samp")
)
然后我们定义了一个新的变体,它由 3 种不同类型(这里是 2)的翻译函数组成:
postgres_var <- sql_variant(
base_scalar,
postgres_agg
)
translate_sql(cor(x, y), variant = postgres_var)
# <SQL> COR("x", "y")
translate_sql(sd(income / years), variant = postgres_var)
# <SQL> SD("income" / "years")
这些看起来没有翻译给我,他们不应该是 "CORR"
和 "STDDEV_SAMP"
吗?
# Original comment:
# Any functions not explicitly listed in the converter will be translated
# to sql as is, so you don't need to convert all functions.
translate_sql(regr_intercept(y, x), variant = postgres_var)
# <SQL> REGR_INTERCEPT("y", "x")
这个行为符合预期,就像其他 2 个一样。
另一方面,默认的翻译函数可以工作,请参阅:
translate_sql(mean(x), variant = postgres_var)
#<SQL> avg("x") OVER ()
这是一个错误吧?还是我遗漏了什么?
我的目标是为 Oracle
创建一些变体并按以下方式使用它,然后用于更复杂的函数(SQLite
的示例可重现):
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, cars, "cars")
con %>% tbl("cars") %>% summarize(dist = group_concat(dist)) # works as expected, as we're stealing the keyword from sqlite directly
sqlite_variant <- sql_variant(aggregate=sql_translator(.parent = base_agg,gpc = sql_prefix("group_concat")))
con %>% tbl("cars") %>% summarize(dist = gpc(dist)) # how do I make this work ?
编辑:
赏金之后仍然没有解决方案,我已经在 dplyr
/dbplyr
github
页面直接交叉发布了这个问题,我不确定它是否已经或将会引起注意,但如果我(或其他人)没有及时更新,请检查此 url : https://github.com/tidyverse/dplyr/issues/3117
这是 Hadley Wickham 提供的回答 github link:
translate_sql() doesn't have a variant argument any more
确实没有记录 variant 参数,尽管示例使用了它,但我想它会在下一个版本中得到更正。
被问及如何定义自定义 SQL 翻译时,他提供了以下内容:
Have a look at http://dbplyr.tidyverse.org/articles/new-backend.html
and http://dbplyr.tidyverse.org/articles/sql-translation.html
我想另一个选择是获取旧版本的 dbplyr::sql_variant
。
让我们看一下?sql_variant
中的例子:
我们为聚合函数定义了一个新的翻译器函数,从默认函数扩展而来:
postgres_agg <- sql_translator(.parent = base_agg,
cor = sql_prefix("corr"),
cov = sql_prefix("covar_samp"),
sd = sql_prefix("stddev_samp"),
var = sql_prefix("var_samp")
)
然后我们定义了一个新的变体,它由 3 种不同类型(这里是 2)的翻译函数组成:
postgres_var <- sql_variant(
base_scalar,
postgres_agg
)
translate_sql(cor(x, y), variant = postgres_var)
# <SQL> COR("x", "y")
translate_sql(sd(income / years), variant = postgres_var)
# <SQL> SD("income" / "years")
这些看起来没有翻译给我,他们不应该是 "CORR"
和 "STDDEV_SAMP"
吗?
# Original comment:
# Any functions not explicitly listed in the converter will be translated
# to sql as is, so you don't need to convert all functions.
translate_sql(regr_intercept(y, x), variant = postgres_var)
# <SQL> REGR_INTERCEPT("y", "x")
这个行为符合预期,就像其他 2 个一样。
另一方面,默认的翻译函数可以工作,请参阅:
translate_sql(mean(x), variant = postgres_var)
#<SQL> avg("x") OVER ()
这是一个错误吧?还是我遗漏了什么?
我的目标是为 Oracle
创建一些变体并按以下方式使用它,然后用于更复杂的函数(SQLite
的示例可重现):
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, cars, "cars")
con %>% tbl("cars") %>% summarize(dist = group_concat(dist)) # works as expected, as we're stealing the keyword from sqlite directly
sqlite_variant <- sql_variant(aggregate=sql_translator(.parent = base_agg,gpc = sql_prefix("group_concat")))
con %>% tbl("cars") %>% summarize(dist = gpc(dist)) # how do I make this work ?
编辑:
赏金之后仍然没有解决方案,我已经在 dplyr
/dbplyr
github
页面直接交叉发布了这个问题,我不确定它是否已经或将会引起注意,但如果我(或其他人)没有及时更新,请检查此 url : https://github.com/tidyverse/dplyr/issues/3117
这是 Hadley Wickham 提供的回答 github link:
translate_sql() doesn't have a variant argument any more
确实没有记录 variant 参数,尽管示例使用了它,但我想它会在下一个版本中得到更正。
被问及如何定义自定义 SQL 翻译时,他提供了以下内容:
Have a look at http://dbplyr.tidyverse.org/articles/new-backend.html and http://dbplyr.tidyverse.org/articles/sql-translation.html
我想另一个选择是获取旧版本的 dbplyr::sql_variant
。