| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| #' @include enums.R |
| #' @include arrow-package.R |
| #' @include io.R |
| |
| #' @title Compression Codec class |
| #' @usage NULL |
| #' @format NULL |
| #' @docType class |
| #' @description Codecs allow you to create [compressed input and output |
| #' streams][compression]. |
| #' @section Factory: |
| #' The `Codec$create()` factory method takes the following arguments: |
| #' * `type`: string name of the compression method. Possible values are |
| #' "uncompressed", "snappy", "gzip", "brotli", "zstd", "lz4", "lzo", or |
| #' "bz2". `type` may be upper- or lower-cased. Not all methods may be |
| #' available; support depends on build-time flags for the C++ library. |
| #' See [codec_is_available()]. Most builds support at least "snappy" and |
| #' "gzip". All support "uncompressed". |
| #' * `compression_level`: compression level, the default value (`NA`) uses the |
| #' default compression level for the selected compression `type`. |
| #' @rdname Codec |
| #' @name Codec |
| #' @export |
| Codec <- R6Class("Codec", inherit = ArrowObject, |
| active = list( |
| name = function() util___Codec__name(self), |
| level = function() abort("Codec$level() not yet implemented") |
| ) |
| ) |
| Codec$create <- function(type = "gzip", compression_level = NA) { |
| if (is.string(type)) { |
| type <- util___Codec__Create( |
| compression_from_name(type), compression_level |
| ) |
| } |
| assert_is(type, "Codec") |
| type |
| } |
| |
| #' Check whether a compression codec is available |
| #' |
| #' Support for compression libraries depends on the build-time settings of |
| #' the Arrow C++ library. This function lets you know which are available for |
| #' use. |
| #' @param type A string, one of "uncompressed", "snappy", "gzip", "brotli", |
| #' "zstd", "lz4", "lzo", or "bz2", case insensitive. |
| #' @return Logical: is `type` available? |
| #' @export |
| #' @examplesIf arrow_available() |
| #' codec_is_available("gzip") |
| codec_is_available <- function(type) { |
| util___Codec__IsAvailable(compression_from_name(type)) |
| } |
| |
| compression_from_name <- function(name) { |
| map_int(name, ~CompressionType[[match.arg(toupper(.x), names(CompressionType))]]) |
| } |
| |
| #' @title Compressed stream classes |
| #' @rdname compression |
| #' @name compression |
| #' @aliases CompressedInputStream CompressedOutputStream |
| #' @docType class |
| #' @usage NULL |
| #' @format NULL |
| #' @description `CompressedInputStream` and `CompressedOutputStream` |
| #' allow you to apply a compression [Codec] to an |
| #' input or output stream. |
| #' |
| #' @section Factory: |
| #' |
| #' The `CompressedInputStream$create()` and `CompressedOutputStream$create()` |
| #' factory methods instantiate the object and take the following arguments: |
| #' |
| #' - `stream` An [InputStream] or [OutputStream], respectively |
| #' - `codec` A `Codec`, either a [Codec][Codec] instance or a string |
| #' - `compression_level` compression level for when the `codec` argument is given as a string |
| #' |
| #' @section Methods: |
| #' |
| #' Methods are inherited from [InputStream] and [OutputStream], respectively |
| #' @export |
| #' @include arrow-package.R |
| CompressedOutputStream <- R6Class("CompressedOutputStream", inherit = OutputStream) |
| CompressedOutputStream$create <- function(stream, codec = "gzip", compression_level = NA) { |
| codec <- Codec$create(codec, compression_level = compression_level) |
| if (is.string(stream)) { |
| stream <- FileOutputStream$create(stream) |
| } |
| assert_is(stream, "OutputStream") |
| io___CompressedOutputStream__Make(codec, stream) |
| } |
| |
| #' @rdname compression |
| #' @usage NULL |
| #' @format NULL |
| #' @export |
| CompressedInputStream <- R6Class("CompressedInputStream", inherit = InputStream) |
| CompressedInputStream$create <- function(stream, codec = "gzip", compression_level = NA) { |
| codec <- Codec$create(codec, compression_level = compression_level) |
| if (is.string(stream)) { |
| stream <- ReadableFile$create(stream) |
| } |
| assert_is(stream, "InputStream") |
| io___CompressedInputStream__Make(codec, stream) |
| } |