Skip to main content

reifydb_core/interface/
identifier.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_type::fragment::Fragment;
5use serde::{Deserialize, Serialize};
6
7/// Column identifier with primitive qualification
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct ColumnIdentifier {
10	pub primitive: ColumnPrimitive,
11	pub name: Fragment,
12}
13
14impl ColumnIdentifier {
15	pub fn with_primitive(namespace: Fragment, primitive: Fragment, name: Fragment) -> Self {
16		Self {
17			primitive: ColumnPrimitive::Primitive {
18				namespace,
19				primitive,
20			},
21			name,
22		}
23	}
24
25	pub fn with_alias(alias: Fragment, name: Fragment) -> Self {
26		Self {
27			primitive: ColumnPrimitive::Alias(alias),
28			name,
29		}
30	}
31
32	pub fn into_owned(self) -> ColumnIdentifier {
33		ColumnIdentifier {
34			primitive: self.primitive,
35			name: self.name,
36		}
37	}
38
39	pub fn to_static(&self) -> ColumnIdentifier {
40		ColumnIdentifier {
41			primitive: self.primitive.clone(),
42			name: Fragment::internal(self.name.text()),
43		}
44	}
45}
46
47/// How a column is qualified in plans (always fully qualified)
48#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
49pub enum ColumnPrimitive {
50	/// Fully qualified by namespace.primitive
51	Primitive {
52		namespace: Fragment,
53		primitive: Fragment,
54	},
55	/// Qualified by alias (which maps to a fully qualified primitive)
56	Alias(Fragment),
57}
58
59impl ColumnPrimitive {
60	pub fn into_owned(self) -> ColumnPrimitive {
61		match self {
62			ColumnPrimitive::Primitive {
63				namespace,
64				primitive,
65			} => ColumnPrimitive::Primitive {
66				namespace,
67				primitive,
68			},
69			ColumnPrimitive::Alias(alias) => ColumnPrimitive::Alias(alias),
70		}
71	}
72
73	pub fn to_static(&self) -> ColumnPrimitive {
74		match self {
75			ColumnPrimitive::Primitive {
76				namespace,
77				primitive,
78			} => ColumnPrimitive::Primitive {
79				namespace: Fragment::internal(namespace.text()),
80				primitive: Fragment::internal(primitive.text()),
81			},
82			ColumnPrimitive::Alias(alias) => ColumnPrimitive::Alias(Fragment::internal(alias.text())),
83		}
84	}
85
86	pub fn as_fragment(&self) -> &Fragment {
87		match self {
88			ColumnPrimitive::Primitive {
89				primitive,
90				..
91			} => primitive,
92			ColumnPrimitive::Alias(alias) => alias,
93		}
94	}
95}