[SPARK-33258][R][SQL] Add asc_nulls_* and desc_nulls_* methods to SparkR

### What changes were proposed in this pull request?

This PR adds the following `Column` methods to R API:

- asc_nulls_first
- asc_nulls_last
- desc_nulls_first
- desc_nulls_last

### Why are the changes needed?

Feature parity.

### Does this PR introduce _any_ user-facing change?

No, new methods.

### How was this patch tested?

New unit tests.

Closes #30159 from zero323/SPARK-33258.

Authored-by: zero323 <mszymkiewicz@gmail.com>
Signed-off-by: HyukjinKwon <gurwls223@apache.org>
This commit is contained in:
zero323 2020-10-28 09:46:13 +09:00 committed by HyukjinKwon
parent 7d11d972c3
commit ea709d6748
4 changed files with 23 additions and 1 deletions

View file

@ -228,6 +228,8 @@ exportMethods("%<=>%",
"arrays_zip",
"arrays_zip_with",
"asc",
"asc_nulls_first",
"asc_nulls_last",
"ascii",
"asin",
"assert_true",
@ -273,6 +275,8 @@ exportMethods("%<=>%",
"degrees",
"dense_rank",
"desc",
"desc_nulls_first",
"desc_nulls_last",
"dropFields",
"element_at",
"encode",

View file

@ -67,7 +67,11 @@ operators <- list(
# we can not override `&&` and `||`, so use `&` and `|` instead
"&" = "and", "|" = "or", "^" = "pow"
)
column_functions1 <- c("asc", "desc", "isNaN", "isNull", "isNotNull")
column_functions1 <- c(
"asc", "asc_nulls_first", "asc_nulls_last",
"desc", "desc_nulls_first", "desc_nulls_last",
"isNaN", "isNull", "isNotNull"
)
column_functions2 <- c("like", "rlike", "getField", "getItem", "contains")
createOperator <- function(op) {

View file

@ -675,6 +675,12 @@ setGeneric("broadcast", function(x) { standardGeneric("broadcast") })
#' @rdname columnfunctions
setGeneric("asc", function(x) { standardGeneric("asc") })
#' @rdname columnfunctions
setGeneric("asc_nulls_first", function(x) { standardGeneric("asc_nulls_first") })
#' @rdname columnfunctions
setGeneric("asc_nulls_last", function(x) { standardGeneric("asc_nulls_last") })
#' @rdname between
setGeneric("between", function(x, bounds) { standardGeneric("between") })
@ -689,6 +695,12 @@ setGeneric("contains", function(x, ...) { standardGeneric("contains") })
#' @rdname columnfunctions
setGeneric("desc", function(x) { standardGeneric("desc") })
#' @rdname columnfunctions
setGeneric("desc_nulls_first", function(x) { standardGeneric("desc_nulls_first") })
#' @rdname columnfunctions
setGeneric("desc_nulls_last", function(x) { standardGeneric("desc_nulls_last") })
#' @rdname endsWith
setGeneric("endsWith", function(x, suffix) { standardGeneric("endsWith") })

View file

@ -1428,6 +1428,8 @@ test_that("column functions", {
vector_to_array(c, "float32") + vector_to_array(c, "float64")
c27 <- nth_value("x", 1L) + nth_value("y", 2, TRUE) +
nth_value(column("v"), 3) + nth_value(column("z"), 4L, FALSE)
c28 <- asc_nulls_first(c1) + asc_nulls_last(c1) +
desc_nulls_first(c1) + desc_nulls_last(c1)
# Test if base::is.nan() is exposed
expect_equal(is.nan(c("a", "b")), c(FALSE, FALSE))