reifydb_core/value/column/
frame.rs1use 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}