mod tensor;
mod spatial;
mod text;
mod timestamp;
mod table;
pub use tensor::Tensor;
pub use spatial::{Geometry, Point, BoundingBox};
pub use text::{Text, TextDoc};
pub use timestamp::Timestamp;
pub use table::{TableSchema, ColumnDef, ColumnType, IndexDef, IndexType, Column};
use serde::{Deserialize, Serialize, Deserializer, Serializer};
use std::sync::Arc;
#[derive(Debug, Clone, PartialEq)]
pub struct ArcVec(pub Arc<Vec<f32>>);
impl ArcVec {
pub fn new(vec: Vec<f32>) -> Self {
ArcVec(Arc::new(vec))
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn iter(&self) -> std::slice::Iter<'_, f32> {
self.0.iter()
}
pub fn as_slice(&self) -> &[f32] {
self.0.as_ref()
}
pub fn to_vec(&self) -> Vec<f32> {
(*self.0).clone()
}
}
impl Serialize for ArcVec {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.0.as_ref().serialize(serializer)
}
}
impl<'de> Deserialize<'de> for ArcVec {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let vec = Vec::<f32>::deserialize(deserializer)?;
Ok(ArcVec(Arc::new(vec)))
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum Value {
Integer(i64),
Float(f64),
Bool(bool),
Text(String),
Vector(ArcVec),
Tensor(Tensor),
Spatial(Geometry),
TextDoc(Text),
Timestamp(Timestamp),
Null,
}
impl PartialOrd for Value {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
match (self, other) {
(Value::Integer(a), Value::Integer(b)) => a.partial_cmp(b),
(Value::Float(a), Value::Float(b)) => a.partial_cmp(b),
(Value::Text(a), Value::Text(b)) => a.partial_cmp(b),
(Value::Bool(a), Value::Bool(b)) => a.partial_cmp(b),
(Value::Timestamp(a), Value::Timestamp(b)) => a.partial_cmp(b),
(Value::Integer(a), Value::Float(b)) => (*a as f64).partial_cmp(b),
(Value::Float(a), Value::Integer(b)) => a.partial_cmp(&(*b as f64)),
_ => None,
}
}
}
pub type Row = Vec<Value>;
pub type SqlRow = std::collections::HashMap<String, Value>;
pub type RowId = u64;
pub type PartitionId = u8;