Skip to main content

reifydb_core/value/column/buffer/
from.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use reifydb_value::value::Value;
5
6use crate::value::column::ColumnBuffer;
7
8impl ColumnBuffer {
9	pub fn from_many(value: Value, row_count: usize) -> Self {
10		match value {
11			Value::Boolean(v) => ColumnBuffer::bool(vec![v; row_count]),
12			Value::Float4(v) => ColumnBuffer::float4(vec![v.value(); row_count]),
13			Value::Float8(v) => ColumnBuffer::float8(vec![v.value(); row_count]),
14			Value::Int1(v) => ColumnBuffer::int1(vec![v; row_count]),
15			Value::Int2(v) => ColumnBuffer::int2(vec![v; row_count]),
16			Value::Int4(v) => ColumnBuffer::int4(vec![v; row_count]),
17			Value::Int8(v) => ColumnBuffer::int8(vec![v; row_count]),
18			Value::Int16(v) => ColumnBuffer::int16(vec![v; row_count]),
19			Value::Utf8(v) => ColumnBuffer::utf8(vec![v; row_count]),
20			Value::Uint1(v) => ColumnBuffer::uint1(vec![v; row_count]),
21			Value::Uint2(v) => ColumnBuffer::uint2(vec![v; row_count]),
22			Value::Uint4(v) => ColumnBuffer::uint4(vec![v; row_count]),
23			Value::Uint8(v) => ColumnBuffer::uint8(vec![v; row_count]),
24			Value::Uint16(v) => ColumnBuffer::uint16(vec![v; row_count]),
25			Value::Date(v) => ColumnBuffer::date(vec![v; row_count]),
26			Value::DateTime(v) => ColumnBuffer::datetime(vec![v; row_count]),
27			Value::Time(v) => ColumnBuffer::time(vec![v; row_count]),
28			Value::Duration(v) => ColumnBuffer::duration(vec![v; row_count]),
29			Value::IdentityId(v) => ColumnBuffer::identity_id(vec![v; row_count]),
30			Value::Uuid4(v) => ColumnBuffer::uuid4(vec![v; row_count]),
31			Value::Uuid7(v) => ColumnBuffer::uuid7(vec![v; row_count]),
32			Value::Blob(v) => ColumnBuffer::blob(vec![v; row_count]),
33			Value::Int(v) => ColumnBuffer::int(vec![v; row_count]),
34			Value::Uint(v) => ColumnBuffer::uint(vec![v; row_count]),
35			Value::Decimal(v) => ColumnBuffer::decimal(vec![v; row_count]),
36			Value::DictionaryId(v) => ColumnBuffer::dictionary_id(vec![v; row_count]),
37			Value::None {
38				inner,
39			} => ColumnBuffer::none_typed(inner, row_count),
40			Value::Type(t) => ColumnBuffer::any(vec![Value::Type(t); row_count]),
41			Value::Any(v) => ColumnBuffer::any(vec![*v; row_count]),
42			Value::List(v) => ColumnBuffer::any(vec![Value::List(v); row_count]),
43			Value::Record(v) => ColumnBuffer::any(vec![Value::Record(v); row_count]),
44			Value::Tuple(v) => ColumnBuffer::any(vec![Value::Tuple(v); row_count]),
45		}
46	}
47}
48
49impl From<Value> for ColumnBuffer {
50	fn from(value: Value) -> Self {
51		Self::from_many(value, 1)
52	}
53}
54
55#[cfg(test)]
56pub mod tests {
57	use reifydb_value::value::{Value, ordered_f32::OrderedF32, ordered_f64::OrderedF64};
58
59	use crate::value::column::ColumnBuffer;
60
61	#[test]
62	fn test_from_many_float4_repeats_for_every_row() {
63		let col = ColumnBuffer::from_many(Value::Float4(OrderedF32::try_from(1.5).unwrap()), 3);
64		assert_eq!(col.len(), 3);
65		assert_eq!(col.get_value(2), Value::Float4(OrderedF32::try_from(1.5).unwrap()));
66	}
67
68	#[test]
69	fn test_from_many_float8_repeats_for_every_row() {
70		let col = ColumnBuffer::from_many(Value::Float8(OrderedF64::try_from(2.5).unwrap()), 3);
71		assert_eq!(col.len(), 3);
72		assert_eq!(col.get_value(2), Value::Float8(OrderedF64::try_from(2.5).unwrap()));
73	}
74}