reifydb_catalog/store/ringbuffer/
get_pk_id.rs1use reifydb_core::interface::{PrimaryKeyId, QueryTransaction, RingBufferId, RingBufferKey};
5
6use crate::{CatalogStore, store::ringbuffer::layout::ringbuffer};
7
8impl CatalogStore {
9 pub async fn get_ringbuffer_pk_id(
12 rx: &mut impl QueryTransaction,
13 ringbuffer_id: RingBufferId,
14 ) -> crate::Result<Option<PrimaryKeyId>> {
15 let multi = match rx.get(&RingBufferKey::encoded(ringbuffer_id)).await? {
16 Some(v) => v,
17 None => return Ok(None),
18 };
19
20 let pk_id = ringbuffer::LAYOUT.get_u64(&multi.values, ringbuffer::PRIMARY_KEY);
21
22 if pk_id == 0 {
23 Ok(None)
24 } else {
25 Ok(Some(PrimaryKeyId(pk_id)))
26 }
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use reifydb_core::interface::{PrimaryKeyId, RingBufferId};
33 use reifydb_engine::test_utils::create_test_command_transaction;
34
35 use crate::{CatalogStore, test_utils::ensure_test_ringbuffer};
36
37 #[tokio::test]
38 async fn test_get_ringbuffer_pk_id_without_primary_key() {
39 let mut txn = create_test_command_transaction().await;
40 let ringbuffer = ensure_test_ringbuffer(&mut txn).await;
41
42 let pk_id = CatalogStore::get_ringbuffer_pk_id(&mut txn, ringbuffer.id).await.unwrap();
43
44 assert_eq!(pk_id, None);
45 }
46
47 #[tokio::test]
48 async fn test_get_ringbuffer_pk_id_with_primary_key() {
49 let mut txn = create_test_command_transaction().await;
50 let ringbuffer = ensure_test_ringbuffer(&mut txn).await;
51
52 let pk_id = PrimaryKeyId(42);
54 CatalogStore::set_ringbuffer_primary_key(&mut txn, ringbuffer.id, pk_id).await.unwrap();
55
56 let retrieved_pk = CatalogStore::get_ringbuffer_pk_id(&mut txn, ringbuffer.id).await.unwrap();
58
59 assert_eq!(retrieved_pk, Some(pk_id));
60 }
61
62 #[tokio::test]
63 async fn test_get_ringbuffer_pk_id_nonexistent_ringbuffer() {
64 let mut txn = create_test_command_transaction().await;
65
66 let pk_id = CatalogStore::get_ringbuffer_pk_id(&mut txn, RingBufferId(999)).await.unwrap();
67
68 assert_eq!(pk_id, None);
69 }
70}