gel_protocol/model/
vector.rs

1use std::ops::{Deref, DerefMut};
2
3use bytes::Buf;
4
5use snafu::ensure;
6
7use crate::descriptors::TypePos;
8use crate::errors::{self, DecodeError};
9use crate::queryable::{Decoder, Queryable};
10use crate::serialization::decode::queryable::scalars::check_scalar;
11use crate::{codec, queryable};
12
13/// A structure that represents `ext::pgvector::vector`
14#[derive(Debug, PartialEq, Clone)]
15#[cfg_attr(feature = "with-serde", derive(serde::Serialize, serde::Deserialize))]
16pub struct Vector(pub Vec<f32>);
17
18impl Deref for Vector {
19    type Target = Vec<f32>;
20    fn deref(&self) -> &Vec<f32> {
21        &self.0
22    }
23}
24
25impl DerefMut for Vector {
26    fn deref_mut(&mut self) -> &mut Vec<f32> {
27        &mut self.0
28    }
29}
30
31impl Queryable for Vector {
32    type Args = ();
33
34    fn decode(_decoder: &Decoder, _args: &(), mut buf: &[u8]) -> Result<Self, DecodeError> {
35        ensure!(buf.remaining() >= 4, errors::Underflow);
36        let length = buf.get_u16() as usize;
37        let _reserved = buf.get_u16();
38        ensure!(buf.remaining() >= length * 4, errors::Underflow);
39        let vec = (0..length).map(|_| f32::from_bits(buf.get_u32())).collect();
40        Ok(Vector(vec))
41    }
42
43    fn check_descriptor(
44        ctx: &queryable::DescriptorContext,
45        type_pos: TypePos,
46    ) -> Result<(), queryable::DescriptorMismatch> {
47        check_scalar(
48            ctx,
49            type_pos,
50            codec::PGVECTOR_VECTOR,
51            "ext::pgvector::vector",
52        )
53    }
54}
55
56#[derive(Debug, PartialEq, Clone)]
57pub(crate) struct VectorRef<'a>(pub &'a [f32]);