gel_protocol/model/
vector.rs1use 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#[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]);