Skip to content

Commit 7adb6ed

Browse files
committed
Optimize appending max level comparison in DefinitionLevelDecoder
1 parent 9c6065c commit 7adb6ed

File tree

2 files changed

+7
-5
lines changed

2 files changed

+7
-5
lines changed

parquet/src/arrow/array_reader/struct_array.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,9 @@ impl ArrayReader for StructArrayReader {
158158
}
159159
}
160160
None => {
161-
for def_level in def_levels {
162-
bitmap_builder.append(*def_level >= self.struct_def_level)
161+
// Safety: slice iterator has a trusted length
162+
unsafe {
163+
bitmap_builder.extend_trusted_len(def_levels.iter().map(|level| *level >= self.struct_def_level))
163164
}
164165
}
165166
}

parquet/src/arrow/record_reader/definition_levels.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,10 @@ impl DefinitionLevelDecoder for DefinitionLevelBufferDecoder {
160160
let start = levels.len();
161161
let (values_read, levels_read) = decoder.read_def_levels(levels, num_levels)?;
162162

163-
nulls.reserve(levels_read);
164-
for i in &levels[start..] {
165-
nulls.append(i == max_level);
163+
// Safety: slice iterator has a trusted length
164+
unsafe {
165+
nulls
166+
.extend_trusted_len(levels[start..].iter().map(|level| level == max_level));
166167
}
167168

168169
Ok((values_read, levels_read))

0 commit comments

Comments
 (0)