This is an automated email from the ASF dual-hosted git repository.
paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/sedona-db.git
The following commit(s) were added to refs/heads/main by this push:
new b254e8d8 chore(r): Add air format + lintr checks to R package (#495)
b254e8d8 is described below
commit b254e8d884cd0d705a252e6127743e27de8789c8
Author: Dewey Dunnington <[email protected]>
AuthorDate: Wed Jan 7 08:48:34 2026 -0600
chore(r): Add air format + lintr checks to R package (#495)
---
.github/workflows/r.yml | 8 +
.../tests/testthat/test-adbc.R => air.toml} | 16 +-
r/sedonadb/.Rbuildignore | 1 +
.../{tests/testthat/test-adbc.R => .lintr.R} | 20 +--
r/sedonadb/DESCRIPTION | 2 +
r/sedonadb/R/000-wrappers.R | 187 +++++++++++++++++----
r/sedonadb/R/adbc.R | 4 +-
r/sedonadb/R/context.R | 24 ++-
r/sedonadb/R/dataframe.R | 25 +--
r/sedonadb/R/expression.R | 54 ++++--
r/sedonadb/R/pkg-dplyr.R | 2 +
r/sedonadb/R/pkg-sf.R | 7 +-
r/sedonadb/R/zzz.R | 16 +-
r/sedonadb/tests/testthat/test-adbc.R | 2 +-
.../tests/testthat/{test-adbc.R => test-lint.R} | 16 +-
r/sedonadb/tests/testthat/test-literal.R | 6 +-
r/sedonadb/tools/savvy-update.sh | 3 +
17 files changed, 269 insertions(+), 124 deletions(-)
diff --git a/.github/workflows/r.yml b/.github/workflows/r.yml
index 0f0ee3a4..2a6dfe8b 100644
--- a/.github/workflows/r.yml
+++ b/.github/workflows/r.yml
@@ -32,6 +32,14 @@ on:
- 'c/**'
- 'r/**'
jobs:
+ format:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+
+ # Run air format
+ - run: curl -LsSf
https://github.com/posit-dev/air/releases/latest/download/air-installer.sh | sh
+ - run: cd r/sedonadb && air format . --check
test:
runs-on: ${{ matrix.config.os }}
diff --git a/r/sedonadb/tests/testthat/test-adbc.R b/r/air.toml
similarity index 69%
copy from r/sedonadb/tests/testthat/test-adbc.R
copy to r/air.toml
index d4e6b839..1c334da1 100644
--- a/r/sedonadb/tests/testthat/test-adbc.R
+++ b/r/air.toml
@@ -15,17 +15,5 @@
# specific language governing permissions and limitations
# under the License.
-test_that("adbc driver works", {
- con <- sedonadb_adbc() |>
- adbcdrivermanager::adbc_database_init() |>
- adbcdrivermanager::adbc_connection_init()
-
- df <- con |>
- adbcdrivermanager::read_adbc("SELECT ST_Point(0, 1) as geometry") |>
- as.data.frame()
-
- expect_identical(
- wk::as_wkt(df$geometry),
- wk::wkt("POINT (0 1)")
- )
-})
+[format]
+line-width = 90
diff --git a/r/sedonadb/.Rbuildignore b/r/sedonadb/.Rbuildignore
index d18da406..f7c144e3 100644
--- a/r/sedonadb/.Rbuildignore
+++ b/r/sedonadb/.Rbuildignore
@@ -11,3 +11,4 @@
^\.vscode$
^README\.Rmd$
^bootstrap\.R$
+^\.lintr\.R$
diff --git a/r/sedonadb/tests/testthat/test-adbc.R b/r/sedonadb/.lintr.R
similarity index 69%
copy from r/sedonadb/tests/testthat/test-adbc.R
copy to r/sedonadb/.lintr.R
index d4e6b839..eef3c7d3 100644
--- a/r/sedonadb/tests/testthat/test-adbc.R
+++ b/r/sedonadb/.lintr.R
@@ -15,17 +15,11 @@
# specific language governing permissions and limitations
# under the License.
-test_that("adbc driver works", {
- con <- sedonadb_adbc() |>
- adbcdrivermanager::adbc_database_init() |>
- adbcdrivermanager::adbc_connection_init()
+linters <- linters_with_defaults(
+ line_length_linter(90),
+ object_length_linter = NULL
+)
- df <- con |>
- adbcdrivermanager::read_adbc("SELECT ST_Point(0, 1) as geometry") |>
- as.data.frame()
-
- expect_identical(
- wk::as_wkt(df$geometry),
- wk::wkt("POINT (0 1)")
- )
-})
+exclusions <- list(
+ "R/000-wrappers.R"
+)
diff --git a/r/sedonadb/DESCRIPTION b/r/sedonadb/DESCRIPTION
index 4876e3be..90f82b0b 100644
--- a/r/sedonadb/DESCRIPTION
+++ b/r/sedonadb/DESCRIPTION
@@ -26,3 +26,5 @@ Imports:
nanoarrow
Config/testthat/edition: 3
Config/build/bootstrap: TRUE
+Config/Needs/check:
+ lintr
diff --git a/r/sedonadb/R/000-wrappers.R b/r/sedonadb/R/000-wrappers.R
index 40fd3ce4..6cd4654f 100644
--- a/r/sedonadb/R/000-wrappers.R
+++ b/r/sedonadb/R/000-wrappers.R
@@ -28,11 +28,11 @@ NULL
# Check class and extract the external pointer embedded in the environment
.savvy_extract_ptr <- function(e, class) {
- if(is.null(e)) {
+ if (is.null(e)) {
return(NULL)
}
- if(inherits(e, class)) {
+ if (inherits(e, class)) {
e$.ptr
} else {
msg <- paste0("Expected ", class, ", got ", class(e)[1])
@@ -55,8 +55,17 @@ NULL
}
-`configure_proj_shared` <- function(`shared_library_path` = NULL,
`database_path` = NULL, `search_path` = NULL) {
- invisible(.Call(savvy_configure_proj_shared__impl, `shared_library_path`,
`database_path`, `search_path`))
+`configure_proj_shared` <- function(
+ `shared_library_path` = NULL,
+ `database_path` = NULL,
+ `search_path` = NULL
+) {
+ invisible(.Call(
+ savvy_configure_proj_shared__impl,
+ `shared_library_path`,
+ `database_path`,
+ `search_path`
+ ))
}
@@ -73,13 +82,22 @@ NULL
`InternalContext_data_frame_from_array_stream` <- function(self) {
function(`stream_xptr`, `collect_now`) {
-
.savvy_wrap_InternalDataFrame(.Call(savvy_InternalContext_data_frame_from_array_stream__impl,
`self`, `stream_xptr`, `collect_now`))
+ .savvy_wrap_InternalDataFrame(.Call(
+ savvy_InternalContext_data_frame_from_array_stream__impl,
+ `self`,
+ `stream_xptr`,
+ `collect_now`
+ ))
}
}
`InternalContext_data_frame_from_table_provider` <- function(self) {
function(`provider_xptr`) {
-
.savvy_wrap_InternalDataFrame(.Call(savvy_InternalContext_data_frame_from_table_provider__impl,
`self`, `provider_xptr`))
+ .savvy_wrap_InternalDataFrame(.Call(
+ savvy_InternalContext_data_frame_from_table_provider__impl,
+ `self`,
+ `provider_xptr`
+ ))
}
}
@@ -91,13 +109,21 @@ NULL
`InternalContext_read_parquet` <- function(self) {
function(`paths`) {
-
.savvy_wrap_InternalDataFrame(.Call(savvy_InternalContext_read_parquet__impl,
`self`, `paths`))
+ .savvy_wrap_InternalDataFrame(.Call(
+ savvy_InternalContext_read_parquet__impl,
+ `self`,
+ `paths`
+ ))
}
}
`InternalContext_register_scalar_udf` <- function(self) {
function(`scalar_udf_xptr`) {
- invisible(.Call(savvy_InternalContext_register_scalar_udf__impl, `self`,
`scalar_udf_xptr`))
+ invisible(.Call(
+ savvy_InternalContext_register_scalar_udf__impl,
+ `self`,
+ `scalar_udf_xptr`
+ ))
}
}
@@ -115,7 +141,11 @@ NULL
`InternalContext_view` <- function(self) {
function(`table_ref`) {
- .savvy_wrap_InternalDataFrame(.Call(savvy_InternalContext_view__impl,
`self`, `table_ref`))
+ .savvy_wrap_InternalDataFrame(.Call(
+ savvy_InternalContext_view__impl,
+ `self`,
+ `table_ref`
+ ))
}
}
@@ -123,7 +153,9 @@ NULL
e <- new.env(parent = emptyenv())
e$.ptr <- ptr
e$`data_frame_from_array_stream` <-
`InternalContext_data_frame_from_array_stream`(ptr)
- e$`data_frame_from_table_provider` <-
`InternalContext_data_frame_from_table_provider`(ptr)
+ e$`data_frame_from_table_provider` <-
`InternalContext_data_frame_from_table_provider`(
+ ptr
+ )
e$`deregister_table` <- `InternalContext_deregister_table`(ptr)
e$`read_parquet` <- `InternalContext_read_parquet`(ptr)
e$`register_scalar_udf` <- `InternalContext_register_scalar_udf`(ptr)
@@ -136,7 +168,6 @@ NULL
}
-
`InternalContext` <- new.env(parent = emptyenv())
### associated functions for InternalContext
@@ -146,7 +177,10 @@ NULL
}
-class(`InternalContext`) <- c("sedonadb::InternalContext__bundle",
"savvy_sedonadb__sealed")
+class(`InternalContext`) <- c(
+ "sedonadb::InternalContext__bundle",
+ "savvy_sedonadb__sealed"
+)
#' @export
`print.sedonadb::InternalContext__bundle` <- function(x, ...) {
@@ -164,7 +198,11 @@ class(`InternalContext`) <-
c("sedonadb::InternalContext__bundle", "savvy_sedona
`InternalDataFrame_compute` <- function(self) {
function(`ctx`) {
`ctx` <- .savvy_extract_ptr(`ctx`, "sedonadb::InternalContext")
- .savvy_wrap_InternalDataFrame(.Call(savvy_InternalDataFrame_compute__impl,
`self`, `ctx`))
+ .savvy_wrap_InternalDataFrame(.Call(
+ savvy_InternalDataFrame_compute__impl,
+ `self`,
+ `ctx`
+ ))
}
}
@@ -188,14 +226,26 @@ class(`InternalContext`) <-
c("sedonadb::InternalContext__bundle", "savvy_sedona
`InternalDataFrame_select_indices` <- function(self) {
function(`names`, `indices`) {
-
.savvy_wrap_InternalDataFrame(.Call(savvy_InternalDataFrame_select_indices__impl,
`self`, `names`, `indices`))
+ .savvy_wrap_InternalDataFrame(.Call(
+ savvy_InternalDataFrame_select_indices__impl,
+ `self`,
+ `names`,
+ `indices`
+ ))
}
}
`InternalDataFrame_show` <- function(self) {
function(`ctx`, `width_chars`, `ascii`, `limit` = NULL) {
`ctx` <- .savvy_extract_ptr(`ctx`, "sedonadb::InternalContext")
- .Call(savvy_InternalDataFrame_show__impl, `self`, `ctx`, `width_chars`,
`ascii`, `limit`)
+ .Call(
+ savvy_InternalDataFrame_show__impl,
+ `self`,
+ `ctx`,
+ `width_chars`,
+ `ascii`,
+ `limit`
+ )
}
}
@@ -207,14 +257,37 @@ class(`InternalContext`) <-
c("sedonadb::InternalContext__bundle", "savvy_sedona
`InternalDataFrame_to_arrow_stream` <- function(self) {
function(`out`, `requested_schema_xptr`) {
- invisible(.Call(savvy_InternalDataFrame_to_arrow_stream__impl, `self`,
`out`, `requested_schema_xptr`))
+ invisible(.Call(
+ savvy_InternalDataFrame_to_arrow_stream__impl,
+ `self`,
+ `out`,
+ `requested_schema_xptr`
+ ))
}
}
`InternalDataFrame_to_parquet` <- function(self) {
- function(`ctx`, `path`, `partition_by`, `sort_by`, `single_file_output`,
`overwrite_bbox_columns`, `geoparquet_version` = NULL) {
+ function(
+ `ctx`,
+ `path`,
+ `partition_by`,
+ `sort_by`,
+ `single_file_output`,
+ `overwrite_bbox_columns`,
+ `geoparquet_version` = NULL
+ ) {
`ctx` <- .savvy_extract_ptr(`ctx`, "sedonadb::InternalContext")
- invisible(.Call(savvy_InternalDataFrame_to_parquet__impl, `self`, `ctx`,
`path`, `partition_by`, `sort_by`, `single_file_output`,
`overwrite_bbox_columns`, `geoparquet_version`))
+ invisible(.Call(
+ savvy_InternalDataFrame_to_parquet__impl,
+ `self`,
+ `ctx`,
+ `path`,
+ `partition_by`,
+ `sort_by`,
+ `single_file_output`,
+ `overwrite_bbox_columns`,
+ `geoparquet_version`
+ ))
}
}
@@ -227,7 +300,13 @@ class(`InternalContext`) <-
c("sedonadb::InternalContext__bundle", "savvy_sedona
`InternalDataFrame_to_view` <- function(self) {
function(`ctx`, `table_ref`, `overwrite`) {
`ctx` <- .savvy_extract_ptr(`ctx`, "sedonadb::InternalContext")
- invisible(.Call(savvy_InternalDataFrame_to_view__impl, `self`, `ctx`,
`table_ref`, `overwrite`))
+ invisible(.Call(
+ savvy_InternalDataFrame_to_view__impl,
+ `self`,
+ `ctx`,
+ `table_ref`,
+ `overwrite`
+ ))
}
}
@@ -238,7 +317,9 @@ class(`InternalContext`) <-
c("sedonadb::InternalContext__bundle", "savvy_sedona
e$`compute` <- `InternalDataFrame_compute`(ptr)
e$`count` <- `InternalDataFrame_count`(ptr)
e$`limit` <- `InternalDataFrame_limit`(ptr)
- e$`primary_geometry_column_index` <-
`InternalDataFrame_primary_geometry_column_index`(ptr)
+ e$`primary_geometry_column_index` <-
`InternalDataFrame_primary_geometry_column_index`(
+ ptr
+ )
e$`select_indices` <- `InternalDataFrame_select_indices`(ptr)
e$`show` <- `InternalDataFrame_show`(ptr)
e$`to_arrow_schema` <- `InternalDataFrame_to_arrow_schema`(ptr)
@@ -247,19 +328,23 @@ class(`InternalContext`) <-
c("sedonadb::InternalContext__bundle", "savvy_sedona
e$`to_provider` <- `InternalDataFrame_to_provider`(ptr)
e$`to_view` <- `InternalDataFrame_to_view`(ptr)
- class(e) <- c("sedonadb::InternalDataFrame", "InternalDataFrame",
"savvy_sedonadb__sealed")
+ class(e) <- c(
+ "sedonadb::InternalDataFrame",
+ "InternalDataFrame",
+ "savvy_sedonadb__sealed"
+ )
e
}
-
`InternalDataFrame` <- new.env(parent = emptyenv())
### associated functions for InternalDataFrame
-
-
-class(`InternalDataFrame`) <- c("sedonadb::InternalDataFrame__bundle",
"savvy_sedonadb__sealed")
+class(`InternalDataFrame`) <- c(
+ "sedonadb::InternalDataFrame__bundle",
+ "savvy_sedonadb__sealed"
+)
#' @export
`print.sedonadb::InternalDataFrame__bundle` <- function(x, ...) {
@@ -312,13 +397,10 @@ class(`InternalDataFrame`) <-
c("sedonadb::InternalDataFrame__bundle", "savvy_se
}
-
`SedonaDBExpr` <- new.env(parent = emptyenv())
### associated functions for SedonaDBExpr
-
-
class(`SedonaDBExpr`) <- c("sedonadb::SedonaDBExpr__bundle",
"savvy_sedonadb__sealed")
#' @export
@@ -330,7 +412,14 @@ class(`SedonaDBExpr`) <-
c("sedonadb::SedonaDBExpr__bundle", "savvy_sedonadb__se
`SedonaDBExprFactory_aggregate_function` <- function(self) {
function(`name`, `args`, `na_rm` = NULL, `distinct` = NULL) {
-
.savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_aggregate_function__impl,
`self`, `name`, `args`, `na_rm`, `distinct`))
+ .savvy_wrap_SedonaDBExpr(.Call(
+ savvy_SedonaDBExprFactory_aggregate_function__impl,
+ `self`,
+ `name`,
+ `args`,
+ `na_rm`,
+ `distinct`
+ ))
}
}
@@ -338,19 +427,35 @@ class(`SedonaDBExpr`) <-
c("sedonadb::SedonaDBExpr__bundle", "savvy_sedonadb__se
function(`op`, `lhs`, `rhs`) {
`lhs` <- .savvy_extract_ptr(`lhs`, "sedonadb::SedonaDBExpr")
`rhs` <- .savvy_extract_ptr(`rhs`, "sedonadb::SedonaDBExpr")
- .savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_binary__impl,
`self`, `op`, `lhs`, `rhs`))
+ .savvy_wrap_SedonaDBExpr(.Call(
+ savvy_SedonaDBExprFactory_binary__impl,
+ `self`,
+ `op`,
+ `lhs`,
+ `rhs`
+ ))
}
}
`SedonaDBExprFactory_column` <- function(self) {
function(`name`, `qualifier` = NULL) {
- .savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_column__impl,
`self`, `name`, `qualifier`))
+ .savvy_wrap_SedonaDBExpr(.Call(
+ savvy_SedonaDBExprFactory_column__impl,
+ `self`,
+ `name`,
+ `qualifier`
+ ))
}
}
`SedonaDBExprFactory_scalar_function` <- function(self) {
function(`name`, `args`) {
-
.savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_scalar_function__impl,
`self`, `name`, `args`))
+ .savvy_wrap_SedonaDBExpr(.Call(
+ savvy_SedonaDBExprFactory_scalar_function__impl,
+ `self`,
+ `name`,
+ `args`
+ ))
}
}
@@ -362,18 +467,25 @@ class(`SedonaDBExpr`) <-
c("sedonadb::SedonaDBExpr__bundle", "savvy_sedonadb__se
e$`column` <- `SedonaDBExprFactory_column`(ptr)
e$`scalar_function` <- `SedonaDBExprFactory_scalar_function`(ptr)
- class(e) <- c("sedonadb::SedonaDBExprFactory", "SedonaDBExprFactory",
"savvy_sedonadb__sealed")
+ class(e) <- c(
+ "sedonadb::SedonaDBExprFactory",
+ "SedonaDBExprFactory",
+ "savvy_sedonadb__sealed"
+ )
e
}
-
`SedonaDBExprFactory` <- new.env(parent = emptyenv())
### associated functions for SedonaDBExprFactory
`SedonaDBExprFactory`$`literal` <- function(`array_xptr`, `schema_xptr`) {
- .savvy_wrap_SedonaDBExpr(.Call(savvy_SedonaDBExprFactory_literal__impl,
`array_xptr`, `schema_xptr`))
+ .savvy_wrap_SedonaDBExpr(.Call(
+ savvy_SedonaDBExprFactory_literal__impl,
+ `array_xptr`,
+ `schema_xptr`
+ ))
}
`SedonaDBExprFactory`$`new` <- function(`ctx`) {
@@ -382,7 +494,10 @@ class(`SedonaDBExpr`) <-
c("sedonadb::SedonaDBExpr__bundle", "savvy_sedonadb__se
}
-class(`SedonaDBExprFactory`) <- c("sedonadb::SedonaDBExprFactory__bundle",
"savvy_sedonadb__sealed")
+class(`SedonaDBExprFactory`) <- c(
+ "sedonadb::SedonaDBExprFactory__bundle",
+ "savvy_sedonadb__sealed"
+)
#' @export
`print.sedonadb::SedonaDBExprFactory__bundle` <- function(x, ...) {
diff --git a/r/sedonadb/R/adbc.R b/r/sedonadb/R/adbc.R
index 6f2157b9..6c630fec 100644
--- a/r/sedonadb/R/adbc.R
+++ b/r/sedonadb/R/adbc.R
@@ -32,6 +32,6 @@
#' as.data.frame()
#'
sedonadb_adbc <- function() {
- init_func <- structure(sedonadb_adbc_init_func(), class =
"adbc_driver_init_func")
- adbcdrivermanager::adbc_driver(init_func, subclass =
"sedonadb_driver_sedonadb")
+ init_func <- structure(sedonadb_adbc_init_func(), class =
"adbc_driver_init_func")
+ adbcdrivermanager::adbc_driver(init_func, subclass =
"sedonadb_driver_sedonadb")
}
diff --git a/r/sedonadb/R/context.R b/r/sedonadb/R/context.R
index 2c921b98..0eac883e 100644
--- a/r/sedonadb/R/context.R
+++ b/r/sedonadb/R/context.R
@@ -80,6 +80,7 @@ sd_view <- function(table_ref) {
new_sedonadb_dataframe(ctx, df)
}
+# nolint start: line_length_linter
#' Register a user-defined function
#'
#' Several types of user-defined functions can be registered into a session
@@ -96,6 +97,7 @@ sd_register_udf <- function(udf) {
ctx <- ctx()
ctx$register_scalar_udf(udf)
}
+# nolint end
# We use just one context for now. In theory we could support multiple
# contexts with a shared runtime, which would scope the registration
@@ -112,7 +114,6 @@ global_ctx <- new.env(parent = emptyenv())
global_ctx$ctx <- NULL
-
#' Configure PROJ
#'
#' Performs a runtime configuration of PROJ, which can be used in place of
@@ -138,12 +139,15 @@ global_ctx$ctx <- NULL
#' @examples
#' sd_configure_proj("auto")
#'
-sd_configure_proj <- function(preset = NULL,
- shared_library = NULL,
- database_path = NULL,
- search_path = NULL) {
+sd_configure_proj <- function(
+ preset = NULL,
+ shared_library = NULL,
+ database_path = NULL,
+ search_path = NULL
+) {
if (!is.null(preset)) {
- switch (preset,
+ switch(
+ preset,
homebrew = {
configure_proj_prefix(Sys.getenv("HOMEBREW_PREFIX", "/opt/homebrew"))
return(invisible(NULL))
@@ -217,10 +221,14 @@ configure_proj_prefix <- function(prefix) {
}
proj_dll_name <- function() {
- switch(tolower(Sys.info()[["sysname"]]),
+ switch(
+ tolower(Sys.info()[["sysname"]]),
windows = "proj.dll",
darwin = "libproj.dylib",
linux = "libproj.so",
- stop(sprintf("Can't determine system PROJ shared library name for OS: %s",
Sys.info()[["sysname"]]))
+ stop(sprintf(
+ "Can't determine system PROJ shared library name for OS: %s",
+ Sys.info()[["sysname"]]
+ ))
)
}
diff --git a/r/sedonadb/R/dataframe.R b/r/sedonadb/R/dataframe.R
index deb2e976..fefc3a3d 100644
--- a/r/sedonadb/R/dataframe.R
+++ b/r/sedonadb/R/dataframe.R
@@ -57,8 +57,12 @@ as_sedonadb_dataframe.nanoarrow_array <- function(x, ...,
schema = NULL) {
}
#' @export
-as_sedonadb_dataframe.nanoarrow_array_stream <- function(x, ..., schema = NULL,
- lazy = TRUE) {
+as_sedonadb_dataframe.nanoarrow_array_stream <- function(
+ x,
+ ...,
+ schema = NULL,
+ lazy = TRUE
+) {
stream <- nanoarrow::as_nanoarrow_array_stream(x, schema = schema)
ctx <- ctx()
df <- ctx$data_frame_from_array_stream(stream, collect_now = !lazy)
@@ -233,14 +237,15 @@ sd_preview <- function(.data, n = NULL, ascii = NULL,
width = NULL) {
#' sd_read_parquet(tmp_parquet)
#' unlink(tmp_parquet)
#'
-sd_write_parquet <- function(.data,
- path,
- partition_by = character(0),
- sort_by = character(0),
- single_file_output = NULL,
- geoparquet_version = "1.0",
- overwrite_bbox_columns = FALSE) {
-
+sd_write_parquet <- function(
+ .data,
+ path,
+ partition_by = character(0),
+ sort_by = character(0),
+ single_file_output = NULL,
+ geoparquet_version = "1.0",
+ overwrite_bbox_columns = FALSE
+) {
# Determine single_file_output default based on path and partition_by
if (is.null(single_file_output)) {
single_file_output <- length(partition_by) == 0 && grepl("\\.parquet$",
path)
diff --git a/r/sedonadb/R/expression.R b/r/sedonadb/R/expression.R
index 50240d4a..cca754a2 100644
--- a/r/sedonadb/R/expression.R
+++ b/r/sedonadb/R/expression.R
@@ -72,10 +72,21 @@ sd_expr_scalar_function <- function(function_name, args,
factory = sd_expr_facto
#' @rdname sd_expr_column
#' @export
-sd_expr_aggregate_function <- function(function_name, args, ...,
- na.rm = FALSE, distinct = FALSE,
factory = sd_expr_factory()) {
+sd_expr_aggregate_function <- function(
+ function_name,
+ args,
+ ...,
+ na.rm = FALSE, # nolint: object_name_linter
+ distinct = FALSE,
+ factory = sd_expr_factory()
+) {
args_as_expr <- lapply(args, as_sd_expr, factory = factory)
- factory$aggregate_function(function_name, args_as_expr, na_rm = na.rm,
distinct = distinct)
+ factory$aggregate_function(
+ function_name,
+ args_as_expr,
+ na_rm = na.rm,
+ distinct = distinct
+ )
}
#' @rdname sd_expr_column
@@ -133,15 +144,18 @@ print.SedonaDBExpr <- function(x, ...) {
sd_eval_expr <- function(expr, expr_ctx = sd_expr_ctx(env = env), env =
parent.frame()) {
ensure_translations_registered()
- rlang::try_fetch({
- result <- sd_eval_expr_inner(expr, expr_ctx)
- as_sd_expr(result, factory = expr_ctx$factory)
- }, error = function(e) {
- rlang::abort(
- sprintf("Error evaluating translated expression %s",
rlang::expr_label(expr)),
- parent = e
- )
- })
+ rlang::try_fetch(
+ {
+ result <- sd_eval_expr_inner(expr, expr_ctx)
+ as_sd_expr(result, factory = expr_ctx$factory)
+ },
+ error = function(e) {
+ rlang::abort(
+ sprintf("Error evaluating translated expression %s",
rlang::expr_label(expr)),
+ parent = e
+ )
+ }
+ )
}
sd_eval_expr_inner <- function(expr, expr_ctx) {
@@ -254,14 +268,19 @@ ensure_translations_registered <- function() {
sd_expr_scalar_function("abs", list(x), factory = .ctx$factory)
})
+ # nolint start: object_name_linter
sd_register_translation("base::sum", function(.ctx, x, ..., na.rm = FALSE) {
sd_expr_aggregate_function("sum", list(x), na.rm = na.rm, factory =
.ctx$factory)
})
+ # nolint end
sd_register_translation("base::+", function(.ctx, lhs, rhs) {
if (missing(rhs)) {
# Use a double negative to ensure this fails for non-numeric types
- sd_expr_negative(sd_expr_negative(lhs, factory = .ctx$factory), factory
= .ctx$factory)
+ sd_expr_negative(
+ sd_expr_negative(lhs, factory = .ctx$factory),
+ factory = .ctx$factory
+ )
} else {
sd_expr_binary("+", lhs, rhs, factory = .ctx$factory)
}
@@ -276,8 +295,11 @@ ensure_translations_registered <- function() {
})
for (op in c("==", "!=", ">", ">=", "<", "<=", "*", "/", "&", "|")) {
- sd_register_translation(paste0("base::", op), rlang::inject(function(.ctx,
lhs, rhs) {
- sd_expr_binary(!!op, lhs, rhs, factory = .ctx$factory)
- }))
+ sd_register_translation(
+ paste0("base::", op),
+ rlang::inject(function(.ctx, lhs, rhs) {
+ sd_expr_binary(!!op, lhs, rhs, factory = .ctx$factory)
+ })
+ )
}
}
diff --git a/r/sedonadb/R/pkg-dplyr.R b/r/sedonadb/R/pkg-dplyr.R
index 817dca65..e916202d 100644
--- a/r/sedonadb/R/pkg-dplyr.R
+++ b/r/sedonadb/R/pkg-dplyr.R
@@ -15,6 +15,7 @@
# specific language governing permissions and limitations
# under the License.
+# nolint start: object_name_linter
collect.sedonadb_dataframe <- function(x, ...) {
rlang::check_dots_empty()
tibble::as_tibble(sd_collect(x))
@@ -28,3 +29,4 @@ select.sedonadb_dataframe <- function(.data, ...) {
df <- .data$df$select_indices(names(loc), loc - 1L)
new_sedonadb_dataframe(.data$ctx, df)
}
+# nolint end
diff --git a/r/sedonadb/R/pkg-sf.R b/r/sedonadb/R/pkg-sf.R
index d4024570..7140f6a0 100644
--- a/r/sedonadb/R/pkg-sf.R
+++ b/r/sedonadb/R/pkg-sf.R
@@ -30,8 +30,13 @@ as_sedonadb_dataframe.sf <- function(x, ..., schema = NULL) {
}
# dynamically registered in zzz.R
+# nolint start: object_name_linter
st_as_sf.sedonadb_dataframe <- function(x, ...) {
stream <- nanoarrow::nanoarrow_allocate_array_stream()
size <- x$df$collect(stream)
- sf::st_as_sf(stream)
+ df <- nanoarrow::convert_array_stream(stream, size = size)
+ is_geom <- vapply(df, inherits, logical(1), "geoarrow_vctr")
+ df[is_geom] <- lapply(df[is_geom], sf::st_as_sfc)
+ sf::st_as_sf(df, ...)
}
+# nolint end
diff --git a/r/sedonadb/R/zzz.R b/r/sedonadb/R/zzz.R
index 9f9720cc..0301620f 100644
--- a/r/sedonadb/R/zzz.R
+++ b/r/sedonadb/R/zzz.R
@@ -34,15 +34,19 @@
# interrupts automatically when evaluating regular R code and signals
# an interrupt condition,
check_interrupts <- function() {
- tryCatch({
- FALSE
- }, interrupt = function(...) TRUE, error = function(...) TRUE)
+ tryCatch(
+ {
+ FALSE
+ },
+ interrupt = function(...) TRUE,
+ error = function(...) TRUE
+ )
}
# From the `vctrs` package (this function is intended to be copied
# without attribution or license requirements to avoid a hard dependency on
# vctrs:
-#
https://github.com/r-lib/vctrs/blob/c2a7710fe55e3a2249c4fdfe75bbccbafcf38804/R/register-s3.R#L25-L31
+# nolint
https://github.com/r-lib/vctrs/blob/c2a7710fe55e3a2249c4fdfe75bbccbafcf38804/R/register-s3.R#L25-L31
s3_register <- function(generic, class, method = NULL) {
stopifnot(is.character(generic), length(generic) == 1)
stopifnot(is.character(class), length(class) == 1)
@@ -73,12 +77,10 @@ s3_register <- function(generic, class, method = NULL) {
register <- function(...) {
envir <- asNamespace(package)
- # Refresh the method each time, it might have been updated by
- # `devtools::load_all()`
+ # Refresh the method each time, it might have been updated by
`devtools::load_all()`
method_fn <- get_method(method)
stopifnot(is.function(method_fn))
-
# Only register if generic can be accessed
if (exists(generic, envir)) {
registerS3method(generic, class, method_fn, envir = envir)
diff --git a/r/sedonadb/tests/testthat/test-adbc.R
b/r/sedonadb/tests/testthat/test-adbc.R
index d4e6b839..3766aae5 100644
--- a/r/sedonadb/tests/testthat/test-adbc.R
+++ b/r/sedonadb/tests/testthat/test-adbc.R
@@ -20,7 +20,7 @@ test_that("adbc driver works", {
adbcdrivermanager::adbc_database_init() |>
adbcdrivermanager::adbc_connection_init()
- df <- con |>
+ df <- con |>
adbcdrivermanager::read_adbc("SELECT ST_Point(0, 1) as geometry") |>
as.data.frame()
diff --git a/r/sedonadb/tests/testthat/test-adbc.R
b/r/sedonadb/tests/testthat/test-lint.R
similarity index 69%
copy from r/sedonadb/tests/testthat/test-adbc.R
copy to r/sedonadb/tests/testthat/test-lint.R
index d4e6b839..e1ef777f 100644
--- a/r/sedonadb/tests/testthat/test-adbc.R
+++ b/r/sedonadb/tests/testthat/test-lint.R
@@ -15,17 +15,7 @@
# specific language governing permissions and limitations
# under the License.
-test_that("adbc driver works", {
- con <- sedonadb_adbc() |>
- adbcdrivermanager::adbc_database_init() |>
- adbcdrivermanager::adbc_connection_init()
-
- df <- con |>
- adbcdrivermanager::read_adbc("SELECT ST_Point(0, 1) as geometry") |>
- as.data.frame()
-
- expect_identical(
- wk::as_wkt(df$geometry),
- wk::wkt("POINT (0 1)")
- )
+test_that("package is lint-free", {
+ skip_if_not_installed("lintr")
+ lintr::expect_lint_free()
})
diff --git a/r/sedonadb/tests/testthat/test-literal.R
b/r/sedonadb/tests/testthat/test-literal.R
index a9f09406..fe66016d 100644
--- a/r/sedonadb/tests/testthat/test-literal.R
+++ b/r/sedonadb/tests/testthat/test-literal.R
@@ -18,7 +18,7 @@
test_that("basic literals can be converted to expressions", {
expect_identical(
as_sedonadb_literal(NULL)$debug_string(),
- 'Literal(NULL, None)'
+ "Literal(NULL, None)"
)
expect_identical(
@@ -28,12 +28,12 @@ test_that("basic literals can be converted to expressions",
{
expect_identical(
as_sedonadb_literal(1L)$debug_string(),
- 'Literal(Int32(1), None)'
+ "Literal(Int32(1), None)"
)
expect_identical(
as_sedonadb_literal(1.0)$debug_string(),
- 'Literal(Float64(1), None)'
+ "Literal(Float64(1), None)"
)
expect_identical(
diff --git a/r/sedonadb/tools/savvy-update.sh b/r/sedonadb/tools/savvy-update.sh
index ce887eda..9289a45d 100755
--- a/r/sedonadb/tools/savvy-update.sh
+++ b/r/sedonadb/tools/savvy-update.sh
@@ -50,6 +50,9 @@ main() {
clang-format -i "${api_h}"
clang-format -i "${init_c}"
+ # Run air-format for the generated R file
+ air format "${wrappers_r}"
+
# Remove .tmp files
rm "${api_h}.tmp" "${init_c}.tmp" "${wrappers_r}.tmp"
}