| 263 | } |
| 264 | |
| 265 | pub fn read(&self) -> Result<Option<VectorOp>, BufIoError> { |
| 266 | let guard = self.read_lock.lock(); |
| 267 | |
| 268 | let cursor_pos = self.bufman.cursor_position(self.cursor)?; |
| 269 | let file_size = self.bufman.file_size(); |
| 270 | |
| 271 | if cursor_pos >= file_size { |
| 272 | return Ok(None); |
| 273 | } |
| 274 | |
| 275 | let len_with_tag = self.bufman.read_u32_with_cursor(self.cursor)?; |
| 276 | let (len, is_delete) = if len_with_tag & (1u32 << 31) != 0 { |
| 277 | (0x7FFFFFFF & len_with_tag, true) |
| 278 | } else { |
| 279 | (len_with_tag, false) |
| 280 | }; |
| 281 | self.bufman |
| 282 | .seek_with_cursor(self.cursor, len as u64 + 4 + cursor_pos)?; |
| 283 | |
| 284 | drop(guard); |
| 285 | |
| 286 | let cursor = self.bufman.open_cursor()?; |
| 287 | self.bufman.seek_with_cursor(cursor, cursor_pos + 4)?; |
| 288 | let op = if is_delete { |
| 289 | let id = read_string(&self.bufman, cursor)?; |
| 290 | VectorOp::Delete(VectorId::from(id)) |
| 291 | } else { |
| 292 | let len = read_len(&self.bufman, cursor)? as usize; |
| 293 | let mut vectors = Vec::with_capacity(len); |
| 294 | |
| 295 | for _ in 0..len { |
| 296 | let id = VectorId::from(read_string(&self.bufman, cursor)?); |
| 297 | let document_id = read_opt_string(&self.bufman, cursor)?.map(DocumentId::from); |
| 298 | let dense_values_len = read_len(&self.bufman, cursor)? as usize; |
| 299 | let dense_values = if dense_values_len == 0 { |
| 300 | None |
| 301 | } else { |
| 302 | let mut values = Vec::with_capacity(dense_values_len); |
| 303 | for _ in 0..dense_values_len { |
| 304 | values.push(self.bufman.read_f32_with_cursor(cursor)?); |
| 305 | } |
| 306 | Some(values) |
| 307 | }; |
| 308 | let metadata_len = read_len(&self.bufman, cursor)? as usize; |
| 309 | let metadata = if metadata_len == 0 { |
| 310 | None |
| 311 | } else { |
| 312 | let mut metadata = HashMap::with_capacity(metadata_len); |
| 313 | |
| 314 | for _ in 0..metadata_len { |
| 315 | let field = read_string(&self.bufman, cursor)?; |
| 316 | let val = { |
| 317 | let variant = self.bufman.read_u8_with_cursor(cursor)?; |
| 318 | match variant { |
| 319 | 0 => FieldValue::Int(self.bufman.read_i32_with_cursor(cursor)?), |
| 320 | 1 => FieldValue::String(read_string(&self.bufman, cursor)?), |
| 321 | other => { |
| 322 | return Err(BufIoError::Io(io::Error::new( |