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

Function encode_column

nodedb/src/engine/timeseries/columnar_segment/codec.rs:25–91  ·  view source on GitHub ↗

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

Source from the content-addressed store, hash-verified

23/// encoding. The returned codec is always a `ResolvedColumnCodec` — callers
24/// can store it directly in partition metadata without a further resolve step.
25pub(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();

Callers 1

write_partitionMethod · 0.85

Calls 15

detect_i64_codecFunction · 0.85
encode_i64_pipelineFunction · 0.85
detect_f64_codecFunction · 0.85
encode_f64_pipelineFunction · 0.85
detect_codecFunction · 0.85
encode_bytes_pipelineFunction · 0.85
as_timestampsMethod · 0.80
try_resolveMethod · 0.80
into_column_codecMethod · 0.80
as_symbolsMethod · 0.80
collectMethod · 0.80
lenMethod · 0.45

Tested by

no test coverage detected