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::RowNumber(container) => FrameColumnData::RowNumber(container),
34			ColumnData::IdentityId(container) => FrameColumnData::IdentityId(container),
35			ColumnData::Uuid4(container) => FrameColumnData::Uuid4(container),
36			ColumnData::Uuid7(container) => FrameColumnData::Uuid7(container),
37			ColumnData::Blob {
38				container,
39				..
40			} => FrameColumnData::Blob(container),
41			ColumnData::Int {
42				container,
43				..
44			} => FrameColumnData::Int(container),
45			ColumnData::Uint {
46				container,
47				..
48			} => FrameColumnData::Uint(container),
49			ColumnData::Decimal {
50				container,
51				..
52			} => FrameColumnData::Decimal(container),
53			ColumnData::Any(container) => FrameColumnData::Any(container),
54			ColumnData::Undefined(container) => FrameColumnData::Undefined(container),
55		}
56	}
57}
58
59impl From<Column<'_>> for FrameColumn {
60	fn from(value: Column) -> Self {
61		// Since Column is now just name + data, we extract any qualification from the name
62		let name_str = value.name.text();
63		let parts: Vec<&str> = name_str.split('.').collect();
64		let (namespace, store, name) = match parts.as_slice() {
65			[ns, src, n] => (Some(ns.to_string()), Some(src.to_string()), n.to_string()),
66			[src, n] => (None, Some(src.to_string()), n.to_string()),
67			[n] => (None, None, n.to_string()),
68			_ => (None, None, name_str.to_string()),
69		};
70		FrameColumn {
71			namespace,
72			source: store,
73			name,
74			data: value.data.into(),
75		}
76	}
77}
78
79impl From<Columns<'_>> for Frame {
80	fn from(columns: Columns) -> Self {
81		let frame_columns: Vec<FrameColumn> = columns.columns.into_iter().map(|col| col.into()).collect();
82		if !columns.row_numbers.is_empty() {
83			Frame::with_row_numbers(frame_columns, columns.row_numbers.to_vec())
84		} else {
85			Frame::new(frame_columns)
86		}
87	}
88}