MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / decode_block

Function decode_block

nodedb-columnar/src/reader/block_decode.rs:149–297  ·  view source on GitHub ↗

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]>,
)

Source from the content-addressed store, hash-verified

147
148/// Decode a single block and append results to the DecodedColumn.
149pub(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);

Callers 1

read_column_implMethod · 0.70

Calls 12

append_null_fillFunction · 0.85
decode_i64_pipelineFunction · 0.85
decode_f64_pipelineFunction · 0.85
decode_bytes_pipelineFunction · 0.85
collectMethod · 0.80
into_column_codecMethod · 0.80
lenMethod · 0.45
pushMethod · 0.45
is_emptyMethod · 0.45
lastMethod · 0.45
extendMethod · 0.45
iterMethod · 0.45

Tested by

no test coverage detected