Build a `(TileId, raw_bytes)` list for a specific `coord` across all versions (memtable + segments), ordered newest-first by `system_from_ms`.
(
&self,
hilbert_prefix: u64,
coord: &[CoordValue],
system_as_of: i64,
)
| 402 | /// Build a `(TileId, raw_bytes)` list for a specific `coord` across all |
| 403 | /// versions (memtable + segments), ordered newest-first by `system_from_ms`. |
| 404 | fn cell_versions_for_coord( |
| 405 | &self, |
| 406 | hilbert_prefix: u64, |
| 407 | coord: &[CoordValue], |
| 408 | system_as_of: i64, |
| 409 | ) -> Result<Vec<(TileId, Vec<u8>)>, nodedb_array::ArrayError> { |
| 410 | let mut versions: Vec<(TileId, Vec<u8>)> = Vec::new(); |
| 411 | |
| 412 | // Memtable (most recent writes, already newest-first from iter_tile_versions). |
| 413 | for (tile_id, buf) in self |
| 414 | .memtable |
| 415 | .iter_tile_versions(hilbert_prefix, system_as_of) |
| 416 | { |
| 417 | if let Some(bytes) = buf.get_cell_bytes(coord) { |
| 418 | versions.push((tile_id, bytes.to_vec())); |
| 419 | } |
| 420 | } |
| 421 | |
| 422 | // Segment versions — gather all qualifying versions across all segments, |
| 423 | // then sort newest-first so memtable + segment ordering is correct. |
| 424 | let mut seg_versions: Vec<(TileId, Vec<u8>)> = Vec::new(); |
| 425 | for h in self.segments.values() { |
| 426 | let reader = h.reader(); |
| 427 | for item in reader.iter_tile_versions(hilbert_prefix, system_as_of)? { |
| 428 | let (tile_id, tile_payload) = item?; |
| 429 | if let TilePayload::Sparse(sparse) = &tile_payload |
| 430 | && let Some(bytes) = extract_cell_bytes(sparse, coord)? |
| 431 | { |
| 432 | seg_versions.push((tile_id, bytes)); |
| 433 | } |
| 434 | } |
| 435 | } |
| 436 | // Sort segment versions newest-first by system_from_ms. |
| 437 | seg_versions.sort_by_key(|(a, _)| std::cmp::Reverse(a.system_from_ms)); |
| 438 | versions.extend(seg_versions); |
| 439 | |
| 440 | Ok(versions) |
| 441 | } |
| 442 | } |
| 443 | |
| 444 | fn parse_segment_seq(id: &str) -> Option<u64> { |
no test coverage detected