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

Method from_bytes

nodedb-fts/src/block.rs:152–247  ·  view source on GitHub ↗

Deserialize a block from bytes. Returns `None` if malformed.

(buf: &[u8])

Source from the content-addressed store, hash-verified

150
151 /// Deserialize a block from bytes. Returns `None` if malformed.
152 pub fn from_bytes(buf: &[u8]) -> Option<Self> {
153 let mut pos = 0;
154
155 // Doc count.
156 if buf.len() < 2 {
157 return None;
158 }
159 let doc_count = u16::from_le_bytes([buf[pos], buf[pos + 1]]) as usize;
160 pos += 2;
161
162 if doc_count == 0 {
163 return Some(Self {
164 doc_ids: Vec::new(),
165 term_freqs: Vec::new(),
166 fieldnorms: Vec::new(),
167 positions: Vec::new(),
168 });
169 }
170
171 // Packed doc ID deltas.
172 if pos + 4 > buf.len() {
173 return None;
174 }
175 let ids_len =
176 u32::from_le_bytes([buf[pos], buf[pos + 1], buf[pos + 2], buf[pos + 3]]) as usize;
177 pos += 4;
178 if pos + ids_len > buf.len() {
179 return None;
180 }
181 let packed_deltas = &buf[pos..pos + ids_len];
182 let deltas = bitpack::unpack(packed_deltas);
183 let raw_ids = delta::decode(&deltas);
184 let doc_ids: Vec<Surrogate> = raw_ids.into_iter().map(Surrogate).collect();
185 pos += ids_len;
186
187 // Packed term frequencies.
188 if pos + 4 > buf.len() {
189 return None;
190 }
191 let freqs_len =
192 u32::from_le_bytes([buf[pos], buf[pos + 1], buf[pos + 2], buf[pos + 3]]) as usize;
193 pos += 4;
194 if pos + freqs_len > buf.len() {
195 return None;
196 }
197 let term_freqs = bitpack::unpack(&buf[pos..pos + freqs_len]);
198 pos += freqs_len;
199
200 // Fieldnorms.
201 if pos + doc_count > buf.len() {
202 return None;
203 }
204 let fieldnorms = buf[pos..pos + doc_count].to_vec();
205 pos += doc_count;
206
207 // Position data.
208 let mut positions = Vec::with_capacity(doc_count);
209 for _ in 0..doc_count {

Callers

nothing calls this directly

Calls 6

collectMethod · 0.80
unpackFunction · 0.50
decodeFunction · 0.50
lenMethod · 0.45
to_vecMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected