| 172 | } |
| 173 | |
| 174 | fn scatter_bits( |
| 175 | src: &BooleanBuffer, |
| 176 | mask: &BooleanBuffer, |
| 177 | output_len: usize, |
| 178 | selectivity: f64, |
| 179 | ) -> BooleanBuffer { |
| 180 | let mut builder = BooleanBufferBuilder::new(output_len); |
| 181 | builder.advance(output_len); |
| 182 | let mut src_offset = 0; |
| 183 | |
| 184 | if selectivity > SCATTER_SLICES_SELECTIVITY_THRESHOLD { |
| 185 | for (start, end) in mask.set_slices() { |
| 186 | for i in start..end { |
| 187 | if src.value(src_offset) { |
| 188 | builder.set_bit(i, true); |
| 189 | } |
| 190 | src_offset += 1; |
| 191 | } |
| 192 | } |
| 193 | } else { |
| 194 | for dst_idx in mask.set_indices() { |
| 195 | if src.value(src_offset) { |
| 196 | builder.set_bit(dst_idx, true); |
| 197 | } |
| 198 | src_offset += 1; |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | builder.finish() |
| 203 | } |
| 204 | |
| 205 | fn scatter_null_mask( |
| 206 | src_nulls: Option<&NullBuffer>, |