Encode a single column using the appropriate codec pipeline. Resolves `Auto` to a concrete codec via data-aware detection before encoding. The returned codec is always a `ResolvedColumnCodec` — callers can store it directly in partition metadata without a further resolve step.
(
col_data: &ColumnData,
col_type: ColumnType,
requested_codec: ColumnCodec,
)
| 23 | /// encoding. The returned codec is always a `ResolvedColumnCodec` — callers |
| 24 | /// can store it directly in partition metadata without a further resolve step. |
| 25 | pub(super) fn encode_column( |
| 26 | col_data: &ColumnData, |
| 27 | col_type: ColumnType, |
| 28 | requested_codec: ColumnCodec, |
| 29 | ) -> Result<(Vec<u8>, ResolvedColumnCodec, ColumnStatistics), SegmentError> { |
| 30 | match col_type { |
| 31 | ColumnType::Timestamp => { |
| 32 | let values = col_data.as_timestamps(); |
| 33 | let codec = if requested_codec == ColumnCodec::Auto { |
| 34 | nodedb_codec::detect::detect_i64_codec(values) |
| 35 | } else { |
| 36 | requested_codec |
| 37 | } |
| 38 | .try_resolve() |
| 39 | .map_err(|e| SegmentError::Io(format!("codec resolve ts: {e}")))?; |
| 40 | let encoded = nodedb_codec::encode_i64_pipeline(values, codec.into_column_codec()) |
| 41 | .map_err(|e| SegmentError::Io(format!("encode ts: {e}")))?; |
| 42 | let stats = ColumnStatistics::from_i64(values, codec, encoded.len() as u64); |
| 43 | Ok((encoded, codec, stats)) |
| 44 | } |
| 45 | ColumnType::Float64 => { |
| 46 | let values = col_data.as_f64(); |
| 47 | let codec = if requested_codec == ColumnCodec::Auto { |
| 48 | nodedb_codec::detect::detect_f64_codec(values) |
| 49 | } else { |
| 50 | requested_codec |
| 51 | } |
| 52 | .try_resolve() |
| 53 | .map_err(|e| SegmentError::Io(format!("codec resolve f64: {e}")))?; |
| 54 | let encoded = nodedb_codec::encode_f64_pipeline(values, codec.into_column_codec()) |
| 55 | .map_err(|e| SegmentError::Io(format!("encode f64: {e}")))?; |
| 56 | let stats = ColumnStatistics::from_f64(values, codec, encoded.len() as u64); |
| 57 | Ok((encoded, codec, stats)) |
| 58 | } |
| 59 | ColumnType::Int64 => { |
| 60 | let values = col_data.as_i64(); |
| 61 | let codec = if requested_codec == ColumnCodec::Auto { |
| 62 | nodedb_codec::detect::detect_i64_codec(values) |
| 63 | } else { |
| 64 | requested_codec |
| 65 | } |
| 66 | .try_resolve() |
| 67 | .map_err(|e| SegmentError::Io(format!("codec resolve i64: {e}")))?; |
| 68 | let encoded = nodedb_codec::encode_i64_pipeline(values, codec.into_column_codec()) |
| 69 | .map_err(|e| SegmentError::Io(format!("encode i64: {e}")))?; |
| 70 | let stats = ColumnStatistics::from_i64(values, codec, encoded.len() as u64); |
| 71 | Ok((encoded, codec, stats)) |
| 72 | } |
| 73 | ColumnType::Symbol => { |
| 74 | let values = col_data.as_symbols(); |
| 75 | let codec = if requested_codec == ColumnCodec::Auto { |
| 76 | nodedb_codec::detect_codec(requested_codec, ColumnTypeHint::Symbol) |
| 77 | } else { |
| 78 | requested_codec |
| 79 | } |
| 80 | .try_resolve() |
| 81 | .map_err(|e| SegmentError::Io(format!("codec resolve sym: {e}")))?; |
| 82 | let raw: Vec<u8> = values.iter().flat_map(|id| id.to_le_bytes()).collect(); |
no test coverage detected