Skip to content

Commit aa87260

Browse files
committed
refactor character_length impl by unifying null handling logic
Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
1 parent 14ac31d commit aa87260

File tree

1 file changed

+6
-33
lines changed

1 file changed

+6
-33
lines changed

datafusion/functions/src/unicode/character_length.rs

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -136,56 +136,29 @@ where
136136
// string is ASCII only is relatively cheap.
137137
// If strings are ASCII only, count bytes instead.
138138
let is_array_ascii_only = array.is_ascii();
139-
let array = if array.null_count() == 0 {
139+
let nulls = array.nulls().cloned();
140+
let array = {
140141
if is_array_ascii_only {
141142
let values: Vec<_> = (0..array.len())
142143
.map(|i| {
143-
let value = array.value(i);
144+
let value = unsafe { array.value_unchecked(i) };
144145
T::Native::usize_as(value.len())
145146
})
146147
.collect();
147-
PrimitiveArray::<T>::new(values.into(), None)
148+
PrimitiveArray::<T>::new(values.into(), nulls)
148149
} else {
149150
let values: Vec<_> = (0..array.len())
150151
.map(|i| {
151-
let value = array.value(i);
152+
let value = unsafe { array.value_unchecked(i) };
152153
if value.is_ascii() {
153154
T::Native::usize_as(value.len())
154155
} else {
155156
T::Native::usize_as(value.chars().count())
156157
}
157158
})
158159
.collect();
159-
PrimitiveArray::<T>::new(values.into(), None)
160+
PrimitiveArray::<T>::new(values.into(), nulls)
160161
}
161-
} else if is_array_ascii_only {
162-
let values: Vec<_> = (0..array.len())
163-
.map(|i| {
164-
if array.is_null(i) {
165-
T::default_value()
166-
} else {
167-
let value = array.value(i);
168-
T::Native::usize_as(value.len())
169-
}
170-
})
171-
.collect();
172-
PrimitiveArray::<T>::new(values.into(), array.nulls().cloned())
173-
} else {
174-
let values: Vec<_> = (0..array.len())
175-
.map(|i| {
176-
if array.is_null(i) {
177-
T::default_value()
178-
} else {
179-
let value = array.value(i);
180-
if value.is_ascii() {
181-
T::Native::usize_as(value.len())
182-
} else {
183-
T::Native::usize_as(value.chars().count())
184-
}
185-
}
186-
})
187-
.collect();
188-
PrimitiveArray::<T>::new(values.into(), array.nulls().cloned())
189162
};
190163

191164
Ok(Arc::new(array))

0 commit comments

Comments
 (0)