Get all session events for a provenance graph. Returns events in sequence order (one per provenance node, for any agent). Empty only if the provenance has no nodes / no session data.
(
&self,
provenance_id: u64,
)
| 702 | /// Returns events in sequence order (one per provenance node, for any |
| 703 | /// agent). Empty only if the provenance has no nodes / no session data. |
| 704 | pub fn get_session_events( |
| 705 | &self, |
| 706 | provenance_id: u64, |
| 707 | ) -> PristineResult<Vec<crate::change::session::SessionEvent>> { |
| 708 | use crate::change::session::{encode_session_prefix, SessionEvent}; |
| 709 | |
| 710 | let table = self.txn.open_table(SESSION_EVENTS)?; |
| 711 | let mut events = Vec::new(); |
| 712 | |
| 713 | // Use a bounded prefix range instead of a full-table scan. |
| 714 | // All keys for `provenance_id` lie in [prefix(id), prefix(id+1)). |
| 715 | let start = encode_session_prefix(provenance_id); |
| 716 | let end = encode_session_prefix(provenance_id.saturating_add(1)); |
| 717 | for result in table.range::<&[u8; 16]>(&start..&end)? { |
| 718 | let (_key, value) = result?; |
| 719 | match SessionEvent::from_bytes(value.value()) { |
| 720 | Ok(event) => events.push(event), |
| 721 | Err(e) => { |
| 722 | log::warn!("Failed to deserialize session event: {}", e); |
| 723 | } |
| 724 | } |
| 725 | } |
| 726 | |
| 727 | // Events are already in seq order because keys encode (provenance_id, |
| 728 | // seq) with the same byte layout, but sort explicitly to be safe. |
| 729 | events.sort_by_key(|e| e.seq); |
| 730 | Ok(events) |
| 731 | } |
| 732 | |
| 733 | /// Get all todos for a provenance graph. |
| 734 | /// |