From 1e8f3dbf607f87875ea6f0a9427bc54d3edfbd8a Mon Sep 17 00:00:00 2001 From: Ziyang Hu Date: Wed, 14 Jun 2023 07:08:58 +0800 Subject: [PATCH] coercion from base64 to vec --- cozo-core/src/data/relation.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/cozo-core/src/data/relation.rs b/cozo-core/src/data/relation.rs index ac542af3..a7b5a72c 100644 --- a/cozo-core/src/data/relation.rs +++ b/cozo-core/src/data/relation.rs @@ -8,6 +8,7 @@ use std::cmp::Reverse; use std::fmt::{Display, Formatter}; +use std::mem; use std::time::{SystemTime, UNIX_EPOCH}; use base64::engine::general_purpose::STANDARD; @@ -283,6 +284,37 @@ impl NullableColType { data } } + DataValue::Str(s) => { + let bytes = STANDARD.decode(s).map_err(|_| make_err())?; + match eltype { + VecElementType::F32 => { + let f32_count = bytes.len() / mem::size_of::(); + if f32_count != *len { + bail!(make_err()) + } + let arr = unsafe { + ndarray::ArrayView1::from_shape_ptr( + ndarray::Dim([f32_count]), + bytes.as_ptr() as *const f32, + ) + }; + DataValue::Vec(Vector::F32(arr.to_owned())) + } + VecElementType::F64 => { + let f64_count = bytes.len() / mem::size_of::(); + if f64_count != *len { + bail!(make_err()) + } + let arr = unsafe { + ndarray::ArrayView1::from_shape_ptr( + ndarray::Dim([f64_count]), + bytes.as_ptr() as *const f64, + ) + }; + DataValue::Vec(Vector::F64(arr.to_owned())) + } + } + } _ => bail!(make_err()), }, ColType::Tuple(typ) => {