You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by gi...@apache.org on 2026/07/13 10:40:28 UTC
(datafusion) 01/01: chore: use new `OffsetBuffer::subtract` helper (#23424)
This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-23424-f87e8174c107f61740606fa8c38b8f446911a1e8
in repository https://gitbox.apache.org/repos/asf/datafusion.git
commit 13a6e3003f6ff1540a018fdfca2c9283fd7e51b9
Author: Raz Luvaton <16...@users.noreply.github.com>
AuthorDate: Mon Jul 13 13:40:04 2026 +0300
chore: use new `OffsetBuffer::subtract` helper (#23424)
## Which issue does this PR close?
N/A
## Rationale for this change
Replace manually written code with the newly added helper I added to
arrow-rs in:
- https://github.com/apache/arrow-rs/pull/10120
## What changes are included in this PR?
use `OffsetBuffer::subtract`
## Are these changes tested?
Existing tests
## Are there any user-facing changes?
No
---
datafusion/common/src/utils/mod.rs | 11 +----------
datafusion/functions-nested/src/sort.rs | 7 +------
datafusion/functions/src/string/common.rs | 15 +++++----------
datafusion/functions/src/unicode/initcap.rs | 17 +++++------------
4 files changed, 12 insertions(+), 38 deletions(-)
diff --git a/datafusion/common/src/utils/mod.rs b/datafusion/common/src/utils/mod.rs
index f71cf23d53..94bbb91a7f 100644
--- a/datafusion/common/src/utils/mod.rs
+++ b/datafusion/common/src/utils/mod.rs
@@ -1236,16 +1236,7 @@ pub fn adjust_offsets_for_slice<O: OffsetSizeTrait>(
) -> OffsetBuffer<O> {
let offsets = list.offsets();
- if let (Some(first), Some(last)) = (offsets.first(), offsets.last())
- && (!first.is_zero() || last.as_usize() != list.values().len())
- {
- let offsets = offsets.iter().map(|offset| *offset - *first).collect();
-
- //todo: use unsafe Offset::new_unchecked?
- return OffsetBuffer::new(offsets);
- }
-
- offsets.clone()
+ offsets.clone().subtract(offsets[0])
}
/// For lists and large lists, truncates the sublist of null values
diff --git a/datafusion/functions-nested/src/sort.rs b/datafusion/functions-nested/src/sort.rs
index 0a34cce6b9..ca9267bb88 100644
--- a/datafusion/functions-nested/src/sort.rs
+++ b/datafusion/functions-nested/src/sort.rs
@@ -471,12 +471,7 @@ fn take_by_indices<OffsetSize: OffsetSizeTrait>(
fn rebase_offsets<OffsetSize: OffsetSizeTrait>(
offsets: &OffsetBuffer<OffsetSize>,
) -> OffsetBuffer<OffsetSize> {
- if offsets[0].as_usize() == 0 {
- offsets.clone()
- } else {
- let rebased: Vec<OffsetSize> = offsets.iter().map(|o| *o - offsets[0]).collect();
- OffsetBuffer::new(rebased.into())
- }
+ offsets.clone().subtract(offsets[0])
}
fn order_desc(modifier: &str) -> Result<bool> {
diff --git a/datafusion/functions/src/string/common.rs b/datafusion/functions/src/string/common.rs
index b51b92e9df..7a5d2573ec 100644
--- a/datafusion/functions/src/string/common.rs
+++ b/datafusion/functions/src/string/common.rs
@@ -27,7 +27,7 @@ use arrow::array::{
Array, ArrayRef, AsArray, GenericStringArray, NullBufferBuilder, OffsetSizeTrait,
StringViewArray, new_null_array,
};
-use arrow::buffer::{Buffer, OffsetBuffer, ScalarBuffer};
+use arrow::buffer::{Buffer, ScalarBuffer};
use arrow::datatypes::DataType;
use datafusion_common::Result;
use datafusion_common::cast::{as_generic_string_array, as_string_view_array};
@@ -636,15 +636,10 @@ fn case_conversion_ascii_array<O: OffsetSizeTrait>(
let values = Buffer::from_vec(converted);
// Shift offsets from `start`-based to 0-based so they index into `values`.
- let offsets = if start == 0 {
- string_array.offsets().clone()
- } else {
- let s = O::usize_as(start);
- let rebased: Vec<O> = value_offsets.iter().map(|&o| o - s).collect();
- // SAFETY: subtracting a constant from monotonic offsets preserves
- // monotonicity, and `start` is the minimum offset, so no underflow.
- unsafe { OffsetBuffer::new_unchecked(ScalarBuffer::from(rebased)) }
- };
+ let offsets = string_array
+ .offsets()
+ .clone()
+ .subtract(string_array.offsets()[0]);
let nulls = string_array.nulls().cloned();
// SAFETY: offsets are monotonic and in-bounds for `values`; nulls
diff --git a/datafusion/functions/src/unicode/initcap.rs b/datafusion/functions/src/unicode/initcap.rs
index 9192f23844..8981d59aec 100644
--- a/datafusion/functions/src/unicode/initcap.rs
+++ b/datafusion/functions/src/unicode/initcap.rs
@@ -18,7 +18,7 @@
use std::sync::Arc;
use arrow::array::{Array, ArrayRef, GenericStringArray, OffsetSizeTrait};
-use arrow::buffer::{Buffer, OffsetBuffer};
+use arrow::buffer::Buffer;
use arrow::datatypes::DataType;
use crate::strings::{GenericStringArrayBuilder, StringViewArrayBuilder};
@@ -217,17 +217,10 @@ fn initcap_ascii_array<T: OffsetSizeTrait>(
}
let values = Buffer::from_vec(out);
- let out_offsets = if first_offset == 0 {
- offsets.clone()
- } else {
- // For sliced arrays, we need to rebase the offsets to reflect that the
- // output only contains the bytes in the visible slice.
- let rebased_offsets = offsets
- .iter()
- .map(|offset| T::usize_as(offset.as_usize() - first_offset))
- .collect::<Vec<_>>();
- OffsetBuffer::<T>::new(rebased_offsets.into())
- };
+
+ // Rebase offsets for sliced arrays to reflect that the
+ // output only contains the bytes in the visible slice.
+ let out_offsets = offsets.clone().subtract(offsets[0]);
// SAFETY: ASCII case conversion preserves byte length, so the original
// string boundaries are preserved. `out_offsets` is either identical to
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org