| 739 | } |
| 740 | |
| 741 | fn logical_nulls(&self) -> Option<NullBuffer> { |
| 742 | match self.values.logical_nulls() { |
| 743 | None => self.nulls().cloned(), |
| 744 | Some(value_nulls) => { |
| 745 | let mut builder = BooleanBufferBuilder::new(self.len()); |
| 746 | match self.keys.nulls() { |
| 747 | Some(n) => builder.append_buffer(n.inner()), |
| 748 | None => builder.append_n(self.len(), true), |
| 749 | } |
| 750 | for (idx, k) in self.keys.values().iter().enumerate() { |
| 751 | let k = k.as_usize(); |
| 752 | // Check range to allow for nulls |
| 753 | if k < value_nulls.len() && value_nulls.is_null(k) { |
| 754 | builder.set_bit(idx, false); |
| 755 | } |
| 756 | } |
| 757 | Some(builder.finish().into()) |
| 758 | } |
| 759 | } |
| 760 | } |
| 761 | |
| 762 | fn logical_null_count(&self) -> usize { |
| 763 | match (self.keys.nulls(), self.values.logical_nulls()) { |