mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 18:18:03 +00:00
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:
parent
af6e9cd2c2
commit
9291f60722
18 changed files with 867 additions and 713 deletions
|
@ -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(),
|
||||
|
|
|
@ -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(),
|
||||
));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue