Introduce Register struct

OwnedValue has become a powerhouse of madness, mainly because I decided
to do it like that when I first introduced AggContext. I decided it was
enough and I introduced a `Register` struct that contains `OwnedValue`,
`Record` and `Aggregation`, this way we don't use `OwnedValue` for
everything make everyone's life harder.

This is the next step towards making ImmutableRecords the default
because I want to remove unnecessary allocations. Right now we clone
OwnedValues when we generate a record more than needed.
This commit is contained in:
Pere Diaz Bou 2025-03-26 14:52:35 +01:00
parent af6e9cd2c2
commit 9291f60722
18 changed files with 867 additions and 713 deletions

View file

@ -1,11 +1,12 @@
use crate::types::OwnedValue;
use crate::vdbe::Register;
use crate::LimboError;
use crate::Result;
pub mod vector_types;
use vector_types::*;
pub fn vector32(args: &[OwnedValue]) -> Result<OwnedValue> {
pub fn vector32(args: &[Register]) -> Result<OwnedValue> {
if args.len() != 1 {
return Err(LimboError::ConversionError(
"vector32 requires exactly one argument".to_string(),
@ -22,7 +23,7 @@ pub fn vector32(args: &[OwnedValue]) -> Result<OwnedValue> {
}
}
pub fn vector64(args: &[OwnedValue]) -> Result<OwnedValue> {
pub fn vector64(args: &[Register]) -> Result<OwnedValue> {
if args.len() != 1 {
return Err(LimboError::ConversionError(
"vector64 requires exactly one argument".to_string(),
@ -39,14 +40,14 @@ pub fn vector64(args: &[OwnedValue]) -> Result<OwnedValue> {
}
}
pub fn vector_extract(args: &[OwnedValue]) -> Result<OwnedValue> {
pub fn vector_extract(args: &[Register]) -> Result<OwnedValue> {
if args.len() != 1 {
return Err(LimboError::ConversionError(
"vector_extract requires exactly one argument".to_string(),
));
}
let blob = match &args[0] {
let blob = match &args[0].get_owned_value() {
OwnedValue::Blob(b) => b,
_ => {
return Err(LimboError::ConversionError(
@ -64,7 +65,7 @@ pub fn vector_extract(args: &[OwnedValue]) -> Result<OwnedValue> {
Ok(OwnedValue::build_text(&vector_to_text(&vector)))
}
pub fn vector_distance_cos(args: &[OwnedValue]) -> Result<OwnedValue> {
pub fn vector_distance_cos(args: &[Register]) -> Result<OwnedValue> {
if args.len() != 2 {
return Err(LimboError::ConversionError(
"vector_distance_cos requires exactly two arguments".to_string(),

View file

@ -1,4 +1,5 @@
use crate::types::{OwnedValue, OwnedValueType};
use crate::vdbe::Register;
use crate::{LimboError, Result};
#[derive(Debug, Clone, PartialEq)]
@ -103,11 +104,14 @@ pub fn parse_string_vector(vector_type: VectorType, value: &OwnedValue) -> Resul
})
}
pub fn parse_vector(value: &OwnedValue, vec_ty: Option<VectorType>) -> Result<Vector> {
match value.value_type() {
OwnedValueType::Text => parse_string_vector(vec_ty.unwrap_or(VectorType::Float32), value),
pub fn parse_vector(value: &Register, vec_ty: Option<VectorType>) -> Result<Vector> {
match value.get_owned_value().value_type() {
OwnedValueType::Text => parse_string_vector(
vec_ty.unwrap_or(VectorType::Float32),
value.get_owned_value(),
),
OwnedValueType::Blob => {
let Some(blob) = value.to_blob() else {
let Some(blob) = value.get_owned_value().to_blob() else {
return Err(LimboError::ConversionError(
"Invalid vector value".to_string(),
));