reifydb_core/value/column/
frame.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 crate::{
5	Frame, FrameColumn, FrameColumnData,
6	value::column::{Column, ColumnData, Columns},
7};
8
9impl From<ColumnData> for FrameColumnData {
10	fn from(value: ColumnData) -> Self {
11		match value {
12			ColumnData::Bool(container) => FrameColumnData::Bool(container),
13			ColumnData::Float4(container) => FrameColumnData::Float4(container),
14			ColumnData::Float8(container) => FrameColumnData::Float8(container),
15			ColumnData::Int1(container) => FrameColumnData::Int1(container),
16			ColumnData::Int2(container) => FrameColumnData::Int2(container),
17			ColumnData::Int4(container) => FrameColumnData::Int4(container),
18			ColumnData::Int8(container) => FrameColumnData::Int8(container),
19			ColumnData::Int16(container) => FrameColumnData::Int16(container),
20			ColumnData::Uint1(container) => FrameColumnData::Uint1(container),
21			ColumnData::Uint2(container) => FrameColumnData::Uint2(container),
22			ColumnData::Uint4(container) => FrameColumnData::Uint4(container),
23			ColumnData::Uint8(container) => FrameColumnData::Uint8(container),
24			ColumnData::Uint16(container) => FrameColumnData::Uint16(container),
25			ColumnData::Utf8 {
26				container,
27				..
28			} => FrameColumnData::Utf8(container),
29			ColumnData::Date(container) => FrameColumnData::Date(container),
30			ColumnData::DateTime(container) => FrameColumnData::DateTime(container),
31			ColumnData::Time(container) => FrameColumnData::Time(container),
32			ColumnData::Duration(container) => FrameColumnData::Duration(container),
33			ColumnData::IdentityId(container) => FrameColumnData::IdentityId(container),
34			ColumnData::Uuid4(container) => FrameColumnData::Uuid4(container),
35			ColumnData::Uuid7(container) => FrameColumnData::Uuid7(container),
36			ColumnData::Blob {
37				container,
38				..
39			} => FrameColumnData::Blob(container),
40			ColumnData::Int {
41				container,
42				..
43			} => FrameColumnData::Int(container),
44			ColumnData::Uint {
45				container,
46				..
47			} => FrameColumnData::Uint(container),
48			ColumnData::Decimal {
49				container,
50				..
51			} => FrameColumnData::Decimal(container),
52			ColumnData::Any(container) => FrameColumnData::Any(container),
53			ColumnData::Undefined(container) => FrameColumnData::Undefined(container),
54		}
55	}
56}
57
58impl From<Column> for FrameColumn {
59	fn from(value: Column) -> Self {
60		// Since Column is now just name + data, we extract any qualification from the name
61		let name_str = value.name.text();
62		let parts: Vec<&str> = name_str.split('.').collect();
63		let (namespace, store, name) = match parts.as_slice() {
64			[ns, src, n] => (Some(ns.to_string()), Some(src.to_string()), n.to_string()),
65			[src, n] => (None, Some(src.to_string()), n.to_string()),
66			[n] => (None, None, n.to_string()),
67			_ => (None, None, name_str.to_string()),
68		};
69		FrameColumn {
70			namespace,
71			source: store,
72			name,
73			data: value.data.into(),
74		}
75	}
76}
77
78impl From<Columns> for Frame {
79	fn from(columns: Columns) -> Self {
80		let frame_columns: Vec<FrameColumn> = columns.columns.into_iter().map(|col| col.into()).collect();
81		if !columns.row_numbers.is_empty() {
82			Frame::with_row_numbers(frame_columns, columns.row_numbers.to_vec())
83		} else {
84			Frame::new(frame_columns)
85		}
86	}
87}