reifydb_catalog/store/column_policy/
list.rs1use reifydb_core::interface::{ColumnPolicy, ColumnPolicyId, ColumnPolicyKey, ColumnPolicyKind, QueryTransaction};
5
6use crate::{
7 CatalogStore,
8 store::{column::ColumnId, column_policy::layout::column_policy},
9};
10
11impl CatalogStore {
12 pub async fn list_column_policies(
13 rx: &mut impl QueryTransaction,
14 column: ColumnId,
15 ) -> crate::Result<Vec<ColumnPolicy>> {
16 let batch = rx.range(ColumnPolicyKey::full_scan(column)).await?;
17 Ok(batch.items
18 .into_iter()
19 .map(|multi| {
20 let row = multi.values;
21 let id = ColumnPolicyId(column_policy::LAYOUT.get_u64(&row, column_policy::ID));
22 let column = ColumnId(column_policy::LAYOUT.get_u64(&row, column_policy::COLUMN));
23
24 let policy = ColumnPolicyKind::from_u8(
25 column_policy::LAYOUT.get_u8(&row, column_policy::POLICY),
26 column_policy::LAYOUT.get_u8(&row, column_policy::VALUE),
27 );
28
29 ColumnPolicy {
30 id,
31 column,
32 policy,
33 }
34 })
35 .collect::<Vec<_>>())
36 }
37
38 pub async fn list_column_policies_all(rx: &mut impl QueryTransaction) -> crate::Result<Vec<ColumnPolicy>> {
39 let mut result = Vec::new();
40
41 let columns = CatalogStore::list_columns_all(rx).await?;
43
44 for info in columns {
46 let policies = CatalogStore::list_column_policies(rx, info.column.id).await?;
47 result.extend(policies);
48 }
49
50 Ok(result)
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use ColumnPolicyKind::Saturation;
57 use ColumnSaturationPolicy::Undefined;
58 use reifydb_core::interface::{ColumnPolicyKind, ColumnSaturationPolicy, TableId};
59 use reifydb_engine::test_utils::create_test_command_transaction;
60 use reifydb_type::{Type, TypeConstraint};
61
62 use crate::{
63 CatalogStore,
64 store::column::{ColumnId, ColumnIndex, ColumnToCreate},
65 test_utils::ensure_test_table,
66 };
67
68 #[tokio::test]
69 async fn test_ok() {
70 let mut txn = create_test_command_transaction().await;
71 ensure_test_table(&mut txn).await;
72
73 CatalogStore::create_column(
74 &mut txn,
75 TableId(1),
76 ColumnToCreate {
77 fragment: None,
78 namespace_name: "test_namespace".to_string(),
79 table: TableId(1),
80 table_name: "test_table".to_string(),
81 column: "with_policy".to_string(),
82 constraint: TypeConstraint::unconstrained(Type::Int2),
83 if_not_exists: false,
84 policies: vec![Saturation(Undefined)],
85 index: ColumnIndex(0),
86 auto_increment: false,
87 dictionary_id: None,
88 },
89 )
90 .await
91 .unwrap();
92
93 let column = CatalogStore::get_column(&mut txn, ColumnId(8193)).await.unwrap();
94
95 let policies = CatalogStore::list_column_policies(&mut txn, column.id).await.unwrap();
96
97 assert_eq!(policies.len(), 1);
98 assert_eq!(policies[0].column, column.id);
99 assert!(matches!(policies[0].policy, Saturation(Undefined)));
100 }
101}