2017-09-16 39 views
8

Rzućmy okiem na przykład w ?sql_variant:Czy sql_variant w programie dbplyr działa tak, jak powinien?

Definiujemy nową funkcję tłumacza do funkcji zagregowanych, rozbudowany niż domyślny:

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") 
) 

Następnie definiujemy nowy wariant, który jest wykonany z funkcje tłumaczenie z 3 różnych typów (tutaj 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") 

one nie wyglądają tłumaczona na mnie, nie powinny one być "CORR" i "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") 

Ten zachowuje się zgodnie z oczekiwaniami, czyli podobnie jak inne 2.

Z drugiej strony domyślnie tłumaczone funkcje działają, patrz:

translate_sql(mean(x), variant = postgres_var) 
#<SQL> avg("x") OVER() 

Jest to prawo bug? czy coś mi brakuje?

Moim celem jest, aby stworzyć kilka wariantów dla Oracle i używać go w następujący sposób, to dla bardziej skomplikowanych funkcji (przykład z SQLite być powtarzalna):

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 ? 

EDIT:

Jeszcze jedna nagroda nie została jeszcze rozwiązana. Przekonałem się, że problem został opublikowany bezpośrednio na stronie, gdzie nie jestem pewien, czy ma on lub zwróci uwagę, ale na wypadek, gdy ja (lub ktoś inny) nie zaktualizuje to w czasie, sprawdź ten link: https://github.com/tidyverse/dplyr/issues/3117

Odpowiedz

0

to co Hadley Wickham odpowiedziało na podany link github:

translate_sql() nie ma argumentu wariantowej więcej

Rzeczywiście Wariant argumentu nie jest udokumentowany, chociaż przykłady go używają, przypuszczam, że zostanie poprawiony dla następnej wersji.

Zapytany, jak definiować niestandardowe SQL tłumaczenia on miał do zaoferowania:

Wystarczy popatrzeć na http://dbplyr.tidyverse.org/articles/new-backend.html i http://dbplyr.tidyverse.org/articles/sql-translation.html

Chyba inną opcją jest, aby uzyskać wersję dbplyr::sql_variant.