reifydb_catalog/store/column/
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::interface::{ColumnKey, QueryTransaction, SourceId};
5
6use crate::{
7	CatalogStore,
8	store::column::{ColumnDef, ColumnId, layout::source_column},
9};
10
11impl CatalogStore {
12	pub async fn find_column_by_name(
13		rx: &mut impl QueryTransaction,
14		source: impl Into<SourceId>,
15		column_name: &str,
16	) -> crate::Result<Option<ColumnDef>> {
17		let batch = rx.range(ColumnKey::full_scan(source)).await?;
18		let maybe_id = batch.items.into_iter().find_map(|multi| {
19			let row = multi.values;
20			let column = ColumnId(source_column::LAYOUT.get_u64(&row, source_column::ID));
21			let name = source_column::LAYOUT.get_utf8(&row, source_column::NAME);
22
23			if name == column_name {
24				Some(column)
25			} else {
26				None
27			}
28		});
29
30		if let Some(id) = maybe_id {
31			Ok(Some(Self::get_column(rx, id).await?))
32		} else {
33			Ok(None)
34		}
35	}
36}
37
38#[cfg(test)]
39mod tests {
40	use reifydb_core::interface::{ColumnId, TableId};
41	use reifydb_engine::test_utils::create_test_command_transaction;
42	use reifydb_type::{Type, TypeConstraint};
43
44	use crate::{CatalogStore, test_utils::create_test_column};
45
46	#[tokio::test]
47	async fn test_ok() {
48		let mut txn = create_test_command_transaction().await;
49		create_test_column(&mut txn, "col_1", TypeConstraint::unconstrained(Type::Int1), vec![]).await;
50		create_test_column(&mut txn, "col_2", TypeConstraint::unconstrained(Type::Int2), vec![]).await;
51		create_test_column(&mut txn, "col_3", TypeConstraint::unconstrained(Type::Int4), vec![]).await;
52
53		let result = CatalogStore::find_column_by_name(&mut txn, TableId(1), "col_3").await.unwrap().unwrap();
54
55		assert_eq!(result.id, ColumnId(8195));
56		assert_eq!(result.name, "col_3");
57		assert_eq!(result.constraint.get_type(), Type::Int4);
58		assert_eq!(result.auto_increment, false);
59	}
60
61	#[tokio::test]
62	async fn test_not_found() {
63		let mut txn = create_test_command_transaction().await;
64		create_test_column(&mut txn, "col_1", TypeConstraint::unconstrained(Type::Int1), vec![]).await;
65
66		let result = CatalogStore::find_column_by_name(&mut txn, TableId(1), "not_found").await.unwrap();
67
68		assert!(result.is_none());
69	}
70}