MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / rewrite_session_turns

Method rewrite_session_turns

atomic-core/src/pristine/txn/write/mod.rs:448–521  ·  view source on GitHub ↗

Rewrite one session's derived index from its complete immutable turn set. This keeps local keys, manifest order, lifecycle pointers, and KG turn numbers consistent even when provenance arrives out of order.

(
        &mut self,
        mut record: crate::change::session::SessionRecord,
        turns: Vec<crate::change::session::SessionTurn>,
    )

Source from the content-addressed store, hash-verified

446 /// set. This keeps local keys, manifest order, lifecycle pointers, and KG
447 /// turn numbers consistent even when provenance arrives out of order.
448 fn rewrite_session_turns(
449 &mut self,
450 mut record: crate::change::session::SessionRecord,
451 turns: Vec<crate::change::session::SessionTurn>,
452 ) -> PristineResult<()> {
453 use crate::change::session::{
454 canonicalize_session_turns, encode_session_turn_key, session_turn_namespace,
455 };
456
457 let old_turns = self.load_session_turns_for_write(&record.session_id)?;
458 let turns = canonicalize_session_turns(turns);
459 let preserved_edges = self.clear_session_turn_kg(&old_turns, &turns)?;
460
461 let namespace = session_turn_namespace(&record.session_id);
462 let scan_start = encode_session_turn_key(namespace, 0);
463 let scan_end = encode_session_turn_key(namespace, u32::MAX);
464 let existing_keys = {
465 let table = self.txn.open_table(SESSION_TURNS)?;
466 let mut keys = Vec::new();
467 for row in table.range::<&[u8; 40]>(&scan_start..=&scan_end)? {
468 let (key, _value) = row?;
469 keys.push(*key.value());
470 }
471 keys
472 };
473 {
474 let mut table = self.txn.open_table(SESSION_TURNS)?;
475 for key in existing_keys {
476 table.remove(&key)?;
477 }
478 }
479 {
480 let mut table = self.txn.open_table(SESSION_TURNS)?;
481 let mut reverse = self.txn.open_table(SESSION_PROVENANCE)?;
482 for turn in &turns {
483 let key = encode_session_turn_key(namespace, turn.turn_number);
484 let bytes = turn.to_bytes();
485 table.insert(&key, bytes.as_slice())?;
486 reverse.insert(turn.provenance_hash.as_bytes(), &key)?;
487 }
488 }
489
490 record.first_provenance = turns.first().map(|turn| turn.provenance_hash);
491 record.latest_provenance = turns.last().map(|turn| turn.provenance_hash);
492 record.turn_count = turns.len() as u32;
493 if let Some(first) = turns.first() {
494 record.started_at = record.started_at.min(first.timestamp);
495 }
496 {
497 let mut sessions = self.txn.open_table(SESSIONS)?;
498 let bytes = record.to_bytes();
499 sessions.insert(record.session_id.as_str(), bytes.as_slice())?;
500 }
501
502 let turn_numbers: std::collections::HashMap<Hash, u32> = turns
503 .iter()
504 .map(|turn| (turn.provenance_hash, turn.turn_number))
505 .collect();

Calls 15

session_turn_namespaceFunction · 0.85
encode_session_turn_keyFunction · 0.85
clear_session_turn_kgMethod · 0.80
lastMethod · 0.80
emit_session_nodeMethod · 0.80
emit_turn_kgMethod · 0.80
upsert_kg_edgeMethod · 0.80
removeMethod · 0.65
getMethod · 0.65

Tested by

no test coverage detected