Write a new version of an edge at `system_from`. Maintains the reverse index with the same suffix so inbound traversal can version-scan symmetrically. Does NOT close prior versions' `system_until` — Ceiling infers the closed-open interval at read time from the next-newer version's `system_from`.
(
&self,
edge: EdgeRef<'_>,
properties: &[u8],
system_from: i64,
valid_from_ms: i64,
valid_until_ms: i64,
)
| 20 | /// closed-open interval at read time from the next-newer version's |
| 21 | /// `system_from`. |
| 22 | pub fn put_edge_versioned( |
| 23 | &self, |
| 24 | edge: EdgeRef<'_>, |
| 25 | properties: &[u8], |
| 26 | system_from: i64, |
| 27 | valid_from_ms: i64, |
| 28 | valid_until_ms: i64, |
| 29 | ) -> crate::Result<()> { |
| 30 | let fwd = versioned_edge_key(edge.collection, edge.src, edge.label, edge.dst, system_from)?; |
| 31 | let rev = versioned_edge_key(edge.collection, edge.dst, edge.label, edge.src, system_from)?; |
| 32 | let payload = |
| 33 | EdgeValuePayload::new(valid_from_ms, valid_until_ms, properties.to_vec()).encode()?; |
| 34 | let t = edge.tid.as_u64(); |
| 35 | |
| 36 | let write_txn = self |
| 37 | .db |
| 38 | .begin_write() |
| 39 | .map_err(|e| redb_err("begin_write", e))?; |
| 40 | { |
| 41 | let mut edges = write_txn |
| 42 | .open_table(EDGES) |
| 43 | .map_err(|e| redb_err("open edges", e))?; |
| 44 | edges |
| 45 | .insert((t, fwd.as_str()), payload.as_slice()) |
| 46 | .map_err(|e| redb_err("insert versioned edge", e))?; |
| 47 | drop(edges); |
| 48 | |
| 49 | let mut rev_t = write_txn |
| 50 | .open_table(REVERSE_EDGES) |
| 51 | .map_err(|e| redb_err("open reverse", e))?; |
| 52 | rev_t |
| 53 | .insert((t, rev.as_str()), &[] as &[u8]) |
| 54 | .map_err(|e| redb_err("insert reverse", e))?; |
| 55 | drop(rev_t); |
| 56 | |
| 57 | increment_for_insert( |
| 58 | &write_txn, |
| 59 | t, |
| 60 | edge.collection, |
| 61 | edge.label, |
| 62 | edge.src, |
| 63 | edge.dst, |
| 64 | system_from, |
| 65 | )?; |
| 66 | } |
| 67 | write_txn.commit().map_err(|e| redb_err("commit", e))?; |
| 68 | Ok(()) |
| 69 | } |
| 70 | |
| 71 | /// BiTemporalFK enforcement: close a referrer edge by appending a new |
| 72 | /// version that copies the latest live version's properties and |