reifydb_catalog/store/ringbuffer/
get_pk_id.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use reifydb_core::interface::{PrimaryKeyId, QueryTransaction, RingBufferId, RingBufferKey};
5
6use crate::{CatalogStore, store::ringbuffer::layout::ringbuffer};
7
8impl CatalogStore {
9	/// Get the primary key ID for a ring buffer
10	/// Returns None if the ring buffer doesn't exist or has no primary key
11	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		// Set primary key
53		let pk_id = PrimaryKeyId(42);
54		CatalogStore::set_ringbuffer_primary_key(&mut txn, ringbuffer.id, pk_id).await.unwrap();
55
56		// Get and verify
57		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}