reifydb_catalog/store/column/
find.rs1use 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}