@@ -217,27 +217,9 @@ rel_translate_lang <- function(
217217 }
218218 )
219219
220- aliases <- c(
221- sd = " stddev" ,
222- first = " first_value" ,
223- last = " last_value" ,
224- nth = " nth_value" ,
225- " /" = " ___divide" ,
226- " log10" = " ___log10" ,
227- " log" = " ___log" ,
228- " as.integer" = " r_base::as.integer" ,
229- " <" = " r_base::<" ,
230- " <=" = " r_base::<=" ,
231- " >" = " r_base::>" ,
232- " >=" = " r_base::>=" ,
233- " ==" = " r_base::==" ,
234- " !=" = " r_base::!=" ,
235- NULL
236- )
237-
238220 known_window <- c(
239221 # Window functions
240- " rank " , " dense_rank" , " percent_rank" ,
222+ " min_rank " , " dense_rank" , " percent_rank" ,
241223 " row_number" , " first" , " last" , " nth" ,
242224 " cume_dist" , " lead" , " lag" , " ntile" ,
243225
@@ -249,14 +231,6 @@ rel_translate_lang <- function(
249231
250232 window <- need_window && (name %in% known_window )
251233
252- if (name %in% names(aliases )) {
253- name <- aliases [[name ]]
254- if (grepl(" ^r_base::" , name )) {
255- meta_ext_register()
256- }
257- }
258- # name <- aliases[name] %|% name
259-
260234 order_bys <- list ()
261235 offset_expr <- NULL
262236 default_expr <- NULL
@@ -276,6 +250,15 @@ rel_translate_lang <- function(
276250 order_bys <- list (do_translate(expr $ order_by , in_window = TRUE ))
277251 expr $ order_by <- NULL
278252 }
253+ } else if (name %in% c(" row_number" , " min_rank" , " dense_rank" )) {
254+ if (name == " row_number" && length(expr ) == 1 ) {
255+ # Fallthrough
256+ } else if (length(expr ) == 2 && is.name(expr [[2 ]])) {
257+ order_bys <- list (do_translate(expr [[2 ]], in_window = TRUE ))
258+ expr <- list (expr [[1 ]])
259+ } else {
260+ cli :: cli_abort(" {.fun {name}} can only be translated if it uses column names as arguments" )
261+ }
279262 }
280263
281264 args <- map(as.list(expr [- 1 ]), do_translate , in_window = in_window || window )
@@ -286,6 +269,33 @@ rel_translate_lang <- function(
286269 }
287270 }
288271
272+ # Aliasing comes last:
273+ aliases <- c(
274+ sd = " stddev" ,
275+ first = " first_value" ,
276+ last = " last_value" ,
277+ nth = " nth_value" ,
278+ min_rank = " rank" ,
279+ " /" = " ___divide" ,
280+ log10 = " ___log10" ,
281+ log = " ___log" ,
282+ as.integer = " r_base::as.integer" ,
283+ " <" = " r_base::<" ,
284+ " <=" = " r_base::<=" ,
285+ " >" = " r_base::>" ,
286+ " >=" = " r_base::>=" ,
287+ " ==" = " r_base::==" ,
288+ " !=" = " r_base::!=" ,
289+ NULL
290+ )
291+
292+ if (name %in% names(aliases )) {
293+ name <- aliases [[name ]]
294+ if (grepl(" ^r_base::" , name )) {
295+ meta_ext_register()
296+ }
297+ }
298+
289299 fun <- relexpr_function(name , args )
290300 if (window ) {
291301 partitions <- map(partition , relexpr_reference )
@@ -321,6 +331,7 @@ rel_translate <- function(
321331 }
322332
323333 used <- character ()
334+ reorder <- FALSE
324335
325336 do_translate <- function (expr , in_window = FALSE , top_level = FALSE ) {
326337 stopifnot(! is_quosure(expr ))
@@ -347,15 +358,23 @@ rel_translate <- function(
347358 }
348359 },
349360 #
350- language = rel_translate_lang(
351- expr ,
352- do_translate ,
353- names_data ,
354- env ,
355- partition ,
356- in_window ,
357- need_window
358- ),
361+ language = {
362+ lang <- rel_translate_lang(
363+ expr ,
364+ do_translate ,
365+ names_data ,
366+ env ,
367+ partition ,
368+ in_window ,
369+ need_window
370+ )
371+
372+ if (inherits(lang , " relational_relexpr_window" ) && length(lang $ order_bys ) > 0 ) {
373+ used <<- unique(c(used , map_chr(lang $ order_bys , ~ .x $ name )))
374+ reorder <<- TRUE
375+ }
376+ lang
377+ },
359378 #
360379 cli :: cli_abort(" Internal: Unknown type {.val {typeof(expr)}}" )
361380 )
@@ -367,5 +386,5 @@ rel_translate <- function(
367386 out <- relexpr_set_alias(out , alias )
368387 }
369388
370- structure(out , used = used )
389+ structure(out , used = used , reorder = reorder )
371390}
0 commit comments