1use crate::error::{Error, Result};
23use crate::metadata::{KvFormat, RowType};
24use crate::row::compacted::{CompactedRow, CompactedRowDeserializer};
25use std::sync::Arc;
26
27pub trait RowDecoder: Send + Sync {
34 fn decode<'a>(&self, data: &'a [u8]) -> CompactedRow<'a>;
39}
40
41pub struct CompactedRowDecoder {
48 field_count: usize,
49 deserializer: Arc<CompactedRowDeserializer<'static>>,
50}
51
52impl CompactedRowDecoder {
53 pub fn new(row_type: RowType) -> Self {
55 let field_count = row_type.fields().len();
56 let deserializer = Arc::new(CompactedRowDeserializer::new_from_owned(row_type));
57
58 Self {
59 field_count,
60 deserializer,
61 }
62 }
63}
64
65impl RowDecoder for CompactedRowDecoder {
66 fn decode<'a>(&self, data: &'a [u8]) -> CompactedRow<'a> {
67 CompactedRow::deserialize(Arc::clone(&self.deserializer), self.field_count, data)
69 }
70}
71
72pub struct RowDecoderFactory;
76
77impl RowDecoderFactory {
78 pub fn create(kv_format: KvFormat, row_type: RowType) -> Result<Arc<dyn RowDecoder>> {
80 match kv_format {
81 KvFormat::COMPACTED => Ok(Arc::new(CompactedRowDecoder::new(row_type))),
82 KvFormat::INDEXED => Err(Error::UnsupportedOperation {
83 message: "INDEXED format is not yet supported".to_string(),
84 }),
85 }
86 }
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92 use crate::metadata::DataTypes;
93 use crate::row::InternalRow;
94 use crate::row::binary::BinaryWriter;
95 use crate::row::compacted::CompactedRowWriter;
96
97 #[test]
98 fn test_compacted_row_decoder() {
99 let mut writer = CompactedRowWriter::new(2);
101 writer.write_int(42);
102 writer.write_string("hello");
103
104 let data = writer.to_bytes();
105
106 let row_type = RowType::with_data_types(vec![DataTypes::int(), DataTypes::string()]);
108 let decoder = CompactedRowDecoder::new(row_type);
109
110 let row = decoder.decode(&data);
112
113 assert_eq!(row.get_field_count(), 2);
115 assert_eq!(row.get_int(0).unwrap(), 42);
116 assert_eq!(row.get_string(1).unwrap(), "hello");
117 }
118
119 #[test]
120 fn test_row_decoder_factory() {
121 let row_type = RowType::with_data_types(vec![DataTypes::int(), DataTypes::string()]);
122 let decoder = RowDecoderFactory::create(KvFormat::COMPACTED, row_type).unwrap();
123
124 let mut writer = CompactedRowWriter::new(2);
126 writer.write_int(100);
127 writer.write_string("world");
128 let data = writer.to_bytes();
129
130 let row = decoder.decode(&data);
132
133 assert_eq!(row.get_int(0).unwrap(), 100);
135 assert_eq!(row.get_string(1).unwrap(), "world");
136 }
137}