Skip to content

Commit 6073b9e

Browse files
committed
simplify
1 parent d69fd4a commit 6073b9e

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/common.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::sync::Arc;
44

55
use datafusion::arrow::array::{
66
downcast_array, AnyDictionaryArray, Array, ArrayAccessor, ArrayRef, AsArray, DictionaryArray, LargeStringArray,
7-
PrimitiveArray, PrimitiveBuilder, RunArray, StringArray, StringViewArray,
7+
PrimitiveArray, RunArray, StringArray, StringViewArray, PrimitiveBuilder
88
};
99
use datafusion::arrow::compute::kernels::cast;
1010
use datafusion::arrow::compute::take;
@@ -255,9 +255,14 @@ fn invoke_array_array<R: InvokeResult>(
255255
/// Not following this invariant causes invalid dictionary arrays to be built later on inside of DataFusion
256256
/// when arrays are concacted and such.
257257
fn remap_dictionary_key_nulls(
258-
keys: &PrimitiveArray<Int64Type>,
259-
values: &ArrayRef,
258+
keys: PrimitiveArray<Int64Type>,
259+
values: ArrayRef,
260260
) -> DataFusionResult<DictionaryArray<Int64Type>> {
261+
// fast path: no nulls in values
262+
if values.null_count() == 0 {
263+
return Ok(DictionaryArray::new(keys, values));
264+
}
265+
261266
let mut new_keys_builder = PrimitiveBuilder::<Int64Type>::new();
262267
let mut value_indices_builder = PrimitiveBuilder::<Int64Type>::new();
263268
let mut value_map: HashMap<i64, i64> = HashMap::new(); // Map old indices to new indices
@@ -289,7 +294,7 @@ fn remap_dictionary_key_nulls(
289294

290295
let new_keys = new_keys_builder.finish();
291296
let value_indices = value_indices_builder.finish();
292-
let new_values = take(values, &value_indices, None)?;
297+
let new_values = take(&values, &value_indices, None)?;
293298

294299
Ok(DictionaryArray::new(new_keys, new_values))
295300
}
@@ -330,7 +335,7 @@ fn invoke_array_scalars<R: InvokeResult>(
330335
let type_ids = values.as_union().type_ids();
331336
keys = mask_dictionary_keys(&keys, type_ids);
332337
}
333-
Ok(Arc::new(remap_dictionary_key_nulls(&keys, &values)?))
338+
Ok(Arc::new(remap_dictionary_key_nulls(keys, values)?))
334339
} else {
335340
// this is what cast would do under the hood to unpack a dictionary into an array of its values
336341
Ok(take(&values, json_array.keys(), None)?)

0 commit comments

Comments
 (0)