reifydb_catalog/store/column_policy/
list.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::{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		// Get all columns from tables and views
42		let columns = CatalogStore::list_columns_all(rx).await?;
43
44		// For each column, get its policies
45		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}