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::{Column, ColumnData, columns::Columns};
14
15impl From<ColumnData> for FrameColumnData {
16	fn from(value: ColumnData) -> Self {
17		match value {
18			ColumnData::Bool(container) => FrameColumnData::Bool(container),
19			ColumnData::Float4(container) => FrameColumnData::Float4(container),
20			ColumnData::Float8(container) => FrameColumnData::Float8(container),
21			ColumnData::Int1(container) => FrameColumnData::Int1(container),
22			ColumnData::Int2(container) => FrameColumnData::Int2(container),
23			ColumnData::Int4(container) => FrameColumnData::Int4(container),
24			ColumnData::Int8(container) => FrameColumnData::Int8(container),
25			ColumnData::Int16(container) => FrameColumnData::Int16(container),
26			ColumnData::Uint1(container) => FrameColumnData::Uint1(container),
27			ColumnData::Uint2(container) => FrameColumnData::Uint2(container),
28			ColumnData::Uint4(container) => FrameColumnData::Uint4(container),
29			ColumnData::Uint8(container) => FrameColumnData::Uint8(container),
30			ColumnData::Uint16(container) => FrameColumnData::Uint16(container),
31			ColumnData::Utf8 {
32				container,
33				..
34			} => FrameColumnData::Utf8(container),
35			ColumnData::Date(container) => FrameColumnData::Date(container),
36			ColumnData::DateTime(container) => FrameColumnData::DateTime(container),
37			ColumnData::Time(container) => FrameColumnData::Time(container),
38			ColumnData::Duration(container) => FrameColumnData::Duration(container),
39			ColumnData::IdentityId(container) => FrameColumnData::IdentityId(container),
40			ColumnData::Uuid4(container) => FrameColumnData::Uuid4(container),
41			ColumnData::Uuid7(container) => FrameColumnData::Uuid7(container),
42			ColumnData::Blob {
43				container,
44				..
45			} => FrameColumnData::Blob(container),
46			ColumnData::Int {
47				container,
48				..
49			} => FrameColumnData::Int(container),
50			ColumnData::Uint {
51				container,
52				..
53			} => FrameColumnData::Uint(container),
54			ColumnData::Decimal {
55				container,
56				..
57			} => FrameColumnData::Decimal(container),
58			ColumnData::Any(container) => FrameColumnData::Any(container),
59			ColumnData::DictionaryId(container) => FrameColumnData::DictionaryId(container),
60			ColumnData::Option {
61				inner,
62				bitvec,
63			} => FrameColumnData::Option {
64				inner: Box::new(FrameColumnData::from(*inner)),
65				bitvec,
66			},
67		}
68	}
69}
70
71impl From<Column> for FrameColumn {
72	fn from(value: Column) -> 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.columns.into_iter().map(|col| col.into()).collect();
83		Frame {
84			row_numbers: columns.row_numbers.to_vec(),
85			created_at: columns.created_at.to_vec(),
86			updated_at: columns.updated_at.to_vec(),
87			columns: frame_columns,
88		}
89	}
90}
91
92impl From<FrameColumnData> for ColumnData {
93	fn from(value: FrameColumnData) -> Self {
94		match value {
95			FrameColumnData::Bool(container) => ColumnData::Bool(container),
96			FrameColumnData::Float4(container) => ColumnData::Float4(container),
97			FrameColumnData::Float8(container) => ColumnData::Float8(container),
98			FrameColumnData::Int1(container) => ColumnData::Int1(container),
99			FrameColumnData::Int2(container) => ColumnData::Int2(container),
100			FrameColumnData::Int4(container) => ColumnData::Int4(container),
101			FrameColumnData::Int8(container) => ColumnData::Int8(container),
102			FrameColumnData::Int16(container) => ColumnData::Int16(container),
103			FrameColumnData::Uint1(container) => ColumnData::Uint1(container),
104			FrameColumnData::Uint2(container) => ColumnData::Uint2(container),
105			FrameColumnData::Uint4(container) => ColumnData::Uint4(container),
106			FrameColumnData::Uint8(container) => ColumnData::Uint8(container),
107			FrameColumnData::Uint16(container) => ColumnData::Uint16(container),
108			FrameColumnData::Utf8(container) => ColumnData::Utf8 {
109				container,
110				max_bytes: MaxBytes::MAX,
111			},
112			FrameColumnData::Date(container) => ColumnData::Date(container),
113			FrameColumnData::DateTime(container) => ColumnData::DateTime(container),
114			FrameColumnData::Time(container) => ColumnData::Time(container),
115			FrameColumnData::Duration(container) => ColumnData::Duration(container),
116			FrameColumnData::IdentityId(container) => ColumnData::IdentityId(container),
117			FrameColumnData::Uuid4(container) => ColumnData::Uuid4(container),
118			FrameColumnData::Uuid7(container) => ColumnData::Uuid7(container),
119			FrameColumnData::Blob(container) => ColumnData::Blob {
120				container,
121				max_bytes: MaxBytes::MAX,
122			},
123			FrameColumnData::Int(container) => ColumnData::Int {
124				container,
125				max_bytes: MaxBytes::MAX,
126			},
127			FrameColumnData::Uint(container) => ColumnData::Uint {
128				container,
129				max_bytes: MaxBytes::MAX,
130			},
131			FrameColumnData::Decimal(container) => ColumnData::Decimal {
132				container,
133				precision: Precision::MAX,
134				scale: Scale::new(0),
135			},
136			FrameColumnData::Any(container) => ColumnData::Any(container),
137			FrameColumnData::DictionaryId(container) => ColumnData::DictionaryId(container),
138			FrameColumnData::Option {
139				inner,
140				bitvec,
141			} => ColumnData::Option {
142				inner: Box::new(ColumnData::from(*inner)),
143				bitvec,
144			},
145		}
146	}
147}
148
149impl From<FrameColumn> for Column {
150	fn from(value: FrameColumn) -> Self {
151		Column {
152			name: Fragment::internal(value.name),
153			data: value.data.into(),
154		}
155	}
156}
157
158impl From<Frame> for Columns {
159	fn from(frame: Frame) -> Self {
160		let columns: Vec<Column> = frame.columns.into_iter().map(|col| col.into()).collect();
161		Columns {
162			row_numbers: CowVec::new(frame.row_numbers),
163			created_at: CowVec::new(frame.created_at),
164			updated_at: CowVec::new(frame.updated_at),
165			columns: CowVec::new(columns),
166		}
167	}
168}