use reifydb_core::value::column::buffer::ColumnBuffer;
use reifydb_type::{
error::TypeError,
fragment::{Fragment, LazyFragment},
value::{blob::Blob, r#type::Type},
};
use crate::Result;
pub fn to_blob(data: &ColumnBuffer, lazy_fragment: impl LazyFragment) -> Result<ColumnBuffer> {
match data {
ColumnBuffer::Utf8 {
container,
..
} => {
let mut out = ColumnBuffer::with_capacity(Type::Blob, container.len());
for idx in 0..container.len() {
if container.is_defined(idx) {
let temp_fragment = Fragment::internal(container.get(idx).unwrap());
out.push(Blob::from_utf8(temp_fragment));
} else {
out.push_none()
}
}
Ok(out)
}
_ => {
let from = data.get_type();
Err(TypeError::UnsupportedCast {
from,
to: Type::Blob,
fragment: lazy_fragment.fragment(),
}
.into())
}
}
}
#[cfg(test)]
pub mod tests {
use reifydb_type::{fragment::Fragment, util::bitvec::BitVec};
use super::*;
#[test]
fn test_from_utf8() {
let strings = vec!["Hello".to_string(), "World".to_string()];
let bitvec = BitVec::repeat(2, true);
let container = ColumnBuffer::utf8_with_bitvec(strings, bitvec);
let result = to_blob(&container, || Fragment::testing_empty()).unwrap();
match result {
ColumnBuffer::Blob {
container,
..
} => {
assert_eq!(container.get(0), Some(b"Hello".as_slice()));
assert_eq!(container.get(1), Some(b"World".as_slice()));
}
_ => panic!("Expected BLOB column data"),
}
}
#[test]
fn test_unsupported() {
let ints = vec![42i32];
let bitvec = BitVec::repeat(1, true);
let container = ColumnBuffer::int4_with_bitvec(ints, bitvec);
let result = to_blob(&container, || Fragment::testing_empty());
assert!(result.is_err());
}
}