Decode a single block and append results to the DecodedColumn.
(
result: &mut DecodedColumn,
block_data: &[u8],
kind: &ColumnKind,
codec: ResolvedColumnCodec,
row_count: usize,
dictionary: Option<&[String]>,
)
| 147 | |
| 148 | /// Decode a single block and append results to the DecodedColumn. |
| 149 | pub(super) fn decode_block( |
| 150 | result: &mut DecodedColumn, |
| 151 | block_data: &[u8], |
| 152 | kind: &ColumnKind, |
| 153 | codec: ResolvedColumnCodec, |
| 154 | row_count: usize, |
| 155 | dictionary: Option<&[String]>, |
| 156 | ) -> Result<(), ColumnarError> { |
| 157 | let bitmap_size = row_count.div_ceil(8); |
| 158 | |
| 159 | if block_data.len() < bitmap_size { |
| 160 | return Err(ColumnarError::TruncatedSegment { |
| 161 | expected: bitmap_size, |
| 162 | got: block_data.len(), |
| 163 | }); |
| 164 | } |
| 165 | |
| 166 | let bitmap = &block_data[..bitmap_size]; |
| 167 | let payload = &block_data[bitmap_size..]; |
| 168 | |
| 169 | // Extract validity from bitmap. |
| 170 | let valid: Vec<bool> = (0..row_count) |
| 171 | .map(|i| bitmap[i / 8] & (1 << (i % 8)) != 0) |
| 172 | .collect(); |
| 173 | |
| 174 | match kind { |
| 175 | ColumnKind::Int64 => { |
| 176 | let DecodedColumn::Int64 { values, valid: v } = result else { |
| 177 | append_null_fill(result, row_count); |
| 178 | return Ok(()); |
| 179 | }; |
| 180 | let decoded = nodedb_codec::decode_i64_pipeline(payload, codec.into_column_codec())?; |
| 181 | values.extend_from_slice(&decoded[..row_count.min(decoded.len())]); |
| 182 | while values.len() < v.len() + row_count { |
| 183 | values.push(0); |
| 184 | } |
| 185 | v.extend_from_slice(&valid); |
| 186 | } |
| 187 | ColumnKind::Float64 => { |
| 188 | let DecodedColumn::Float64 { values, valid: v } = result else { |
| 189 | append_null_fill(result, row_count); |
| 190 | return Ok(()); |
| 191 | }; |
| 192 | let decoded = nodedb_codec::decode_f64_pipeline(payload, codec.into_column_codec())?; |
| 193 | values.extend_from_slice(&decoded[..row_count.min(decoded.len())]); |
| 194 | while values.len() < v.len() + row_count { |
| 195 | values.push(0.0); |
| 196 | } |
| 197 | v.extend_from_slice(&valid); |
| 198 | } |
| 199 | ColumnKind::VarLen => { |
| 200 | let DecodedColumn::Binary { |
| 201 | data, |
| 202 | offsets, |
| 203 | valid: v, |
| 204 | } = result |
| 205 | else { |
| 206 | append_null_fill(result, row_count); |
no test coverage detected