reifydb_catalog/store/sequence/
find.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::{
5	interface::{NamespaceId, QueryTransaction, SequenceId, SystemSequenceKey},
6	return_internal_error,
7};
8
9use crate::{
10	CatalogStore,
11	store::sequence::{
12		Sequence,
13		layout::sequence::{LAYOUT, VALUE},
14	},
15};
16
17impl CatalogStore {
18	pub async fn find_sequence(
19		rx: &mut impl QueryTransaction,
20		sequence_id: SequenceId,
21	) -> crate::Result<Option<Sequence>> {
22		let (namespace, name) = match sequence_id {
23			crate::system::ids::sequences::NAMESPACE => (NamespaceId(1), "namespace"),
24			crate::system::ids::sequences::SOURCE => (NamespaceId(1), "source"),
25			crate::system::ids::sequences::COLUMN => (NamespaceId(1), "column"),
26			crate::system::ids::sequences::COLUMN_POLICY => (NamespaceId(1), "column_policy"),
27			crate::system::ids::sequences::FLOW => (NamespaceId(1), "flow"),
28			crate::system::ids::sequences::FLOW_NODE => (NamespaceId(1), "flow_node"),
29			crate::system::ids::sequences::FLOW_EDGE => (NamespaceId(1), "flow_edge"),
30			crate::system::ids::sequences::PRIMARY_KEY => (NamespaceId(1), "primary_key"),
31			_ => return_internal_error!(
32				"Sequence with ID {:?} not found in catalog. This indicates a critical catalog inconsistency.",
33				sequence_id
34			),
35		};
36
37		// Read current value from single storage
38		let sequence_key = SystemSequenceKey::encoded(sequence_id);
39
40		let value = match rx.get(&sequence_key).await? {
41			Some(row) => LAYOUT.get_u64(&row.values, VALUE),
42			None => 0,
43		};
44
45		Ok(Some(Sequence {
46			id: sequence_id,
47			namespace,
48			name: name.to_string(),
49			value,
50		}))
51	}
52}