Skip to main content

reifydb_core/value/column/
frame.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_type::{
5	fragment::Fragment,
6	util::cowvec::CowVec,
7	value::{
8		constraint::{bytes::MaxBytes, precision::Precision, scale::Scale},
9		frame::{column::FrameColumn, data::FrameColumnData, frame::Frame},
10	},
11};
12
13use crate::value::column::{ColumnBuffer, ColumnWithName, columns::Columns};
14
15impl From<ColumnBuffer> for FrameColumnData {
16	fn from(value: ColumnBuffer) -> Self {
17		match value {
18			ColumnBuffer::Bool(container) => FrameColumnData::Bool(container),
19			ColumnBuffer::Float4(container) => FrameColumnData::Float4(container),
20			ColumnBuffer::Float8(container) => FrameColumnData::Float8(container),
21			ColumnBuffer::Int1(container) => FrameColumnData::Int1(container),
22			ColumnBuffer::Int2(container) => FrameColumnData::Int2(container),
23			ColumnBuffer::Int4(container) => FrameColumnData::Int4(container),
24			ColumnBuffer::Int8(container) => FrameColumnData::Int8(container),
25			ColumnBuffer::Int16(container) => FrameColumnData::Int16(container),
26			ColumnBuffer::Uint1(container) => FrameColumnData::Uint1(container),
27			ColumnBuffer::Uint2(container) => FrameColumnData::Uint2(container),
28			ColumnBuffer::Uint4(container) => FrameColumnData::Uint4(container),
29			ColumnBuffer::Uint8(container) => FrameColumnData::Uint8(container),
30			ColumnBuffer::Uint16(container) => FrameColumnData::Uint16(container),
31			ColumnBuffer::Utf8 {
32				container,
33				..
34			} => FrameColumnData::Utf8(container),
35			ColumnBuffer::Date(container) => FrameColumnData::Date(container),
36			ColumnBuffer::DateTime(container) => FrameColumnData::DateTime(container),
37			ColumnBuffer::Time(container) => FrameColumnData::Time(container),
38			ColumnBuffer::Duration(container) => FrameColumnData::Duration(container),
39			ColumnBuffer::IdentityId(container) => FrameColumnData::IdentityId(container),
40			ColumnBuffer::Uuid4(container) => FrameColumnData::Uuid4(container),
41			ColumnBuffer::Uuid7(container) => FrameColumnData::Uuid7(container),
42			ColumnBuffer::Blob {
43				container,
44				..
45			} => FrameColumnData::Blob(container),
46			ColumnBuffer::Int {
47				container,
48				..
49			} => FrameColumnData::Int(container),
50			ColumnBuffer::Uint {
51				container,
52				..
53			} => FrameColumnData::Uint(container),
54			ColumnBuffer::Decimal {
55				container,
56				..
57			} => FrameColumnData::Decimal(container),
58			ColumnBuffer::Any(container) => FrameColumnData::Any(container),
59			ColumnBuffer::DictionaryId(container) => FrameColumnData::DictionaryId(container),
60			ColumnBuffer::Option {
61				inner,
62				bitvec,
63			} => FrameColumnData::Option {
64				inner: Box::new(FrameColumnData::from(*inner)),
65				bitvec,
66			},
67		}
68	}
69}
70
71impl From<ColumnWithName> for FrameColumn {
72	fn from(value: ColumnWithName) -> Self {
73		FrameColumn {
74			name: value.name.to_string(),
75			data: value.data.into(),
76		}
77	}
78}
79
80impl From<Columns> for Frame {
81	fn from(columns: Columns) -> Self {
82		let frame_columns: Vec<FrameColumn> = columns
83			.names
84			.iter()
85			.zip(columns.columns.iter())
86			.map(|(name, data)| FrameColumn {
87				name: name.to_string(),
88				data: data.clone().into(),
89			})
90			.collect();
91		Frame {
92			row_numbers: columns.row_numbers.to_vec(),
93			created_at: columns.created_at.to_vec(),
94			updated_at: columns.updated_at.to_vec(),
95			columns: frame_columns,
96		}
97	}
98}
99
100impl From<FrameColumnData> for ColumnBuffer {
101	fn from(value: FrameColumnData) -> Self {
102		match value {
103			FrameColumnData::Bool(container) => ColumnBuffer::Bool(container),
104			FrameColumnData::Float4(container) => ColumnBuffer::Float4(container),
105			FrameColumnData::Float8(container) => ColumnBuffer::Float8(container),
106			FrameColumnData::Int1(container) => ColumnBuffer::Int1(container),
107			FrameColumnData::Int2(container) => ColumnBuffer::Int2(container),
108			FrameColumnData::Int4(container) => ColumnBuffer::Int4(container),
109			FrameColumnData::Int8(container) => ColumnBuffer::Int8(container),
110			FrameColumnData::Int16(container) => ColumnBuffer::Int16(container),
111			FrameColumnData::Uint1(container) => ColumnBuffer::Uint1(container),
112			FrameColumnData::Uint2(container) => ColumnBuffer::Uint2(container),
113			FrameColumnData::Uint4(container) => ColumnBuffer::Uint4(container),
114			FrameColumnData::Uint8(container) => ColumnBuffer::Uint8(container),
115			FrameColumnData::Uint16(container) => ColumnBuffer::Uint16(container),
116			FrameColumnData::Utf8(container) => ColumnBuffer::Utf8 {
117				container,
118				max_bytes: MaxBytes::MAX,
119			},
120			FrameColumnData::Date(container) => ColumnBuffer::Date(container),
121			FrameColumnData::DateTime(container) => ColumnBuffer::DateTime(container),
122			FrameColumnData::Time(container) => ColumnBuffer::Time(container),
123			FrameColumnData::Duration(container) => ColumnBuffer::Duration(container),
124			FrameColumnData::IdentityId(container) => ColumnBuffer::IdentityId(container),
125			FrameColumnData::Uuid4(container) => ColumnBuffer::Uuid4(container),
126			FrameColumnData::Uuid7(container) => ColumnBuffer::Uuid7(container),
127			FrameColumnData::Blob(container) => ColumnBuffer::Blob {
128				container,
129				max_bytes: MaxBytes::MAX,
130			},
131			FrameColumnData::Int(container) => ColumnBuffer::Int {
132				container,
133				max_bytes: MaxBytes::MAX,
134			},
135			FrameColumnData::Uint(container) => ColumnBuffer::Uint {
136				container,
137				max_bytes: MaxBytes::MAX,
138			},
139			FrameColumnData::Decimal(container) => ColumnBuffer::Decimal {
140				container,
141				precision: Precision::MAX,
142				scale: Scale::new(0),
143			},
144			FrameColumnData::Any(container) => ColumnBuffer::Any(container),
145			FrameColumnData::DictionaryId(container) => ColumnBuffer::DictionaryId(container),
146			FrameColumnData::Option {
147				inner,
148				bitvec,
149			} => ColumnBuffer::Option {
150				inner: Box::new(ColumnBuffer::from(*inner)),
151				bitvec,
152			},
153		}
154	}
155}
156
157impl From<FrameColumn> for ColumnWithName {
158	fn from(value: FrameColumn) -> Self {
159		ColumnWithName::new(Fragment::internal(value.name), value.data.into())
160	}
161}
162
163impl From<Frame> for Columns {
164	fn from(frame: Frame) -> Self {
165		let columns: Vec<ColumnWithName> = frame.columns.into_iter().map(|col| col.into()).collect();
166		let mut names = Vec::with_capacity(columns.len());
167		let mut buffers = Vec::with_capacity(columns.len());
168		for c in columns {
169			names.push(c.name);
170			buffers.push(c.data);
171		}
172		Columns {
173			row_numbers: CowVec::new(frame.row_numbers),
174			created_at: CowVec::new(frame.created_at),
175			updated_at: CowVec::new(frame.updated_at),
176			columns: CowVec::new(buffers),
177			names: CowVec::new(names),
178		}
179	}
180}