use std::fmt;
use crate::plan::DenseVectorBinding;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum VectorRowIdBinding {
RowIndex,
Column(String),
}
impl VectorRowIdBinding {
pub fn column(name: impl Into<String>) -> Self {
Self::Column(name.into())
}
pub(crate) fn diagnostic_label(&self) -> &str {
match self {
Self::RowIndex => "row_index",
Self::Column(name) => name,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VectorRelationBinding {
pub input: usize,
pub row_id: VectorRowIdBinding,
pub vector: DenseVectorBinding,
}
impl VectorRelationBinding {
pub fn new(
input: usize,
row_id: VectorRowIdBinding,
feature_columns: impl IntoIterator<Item = impl Into<String>>,
) -> Self {
Self { input, row_id, vector: DenseVectorBinding::columns(feature_columns) }
}
pub fn new_vector_column(input: usize, row_id: VectorRowIdBinding, column: impl Into<String>) -> Self {
Self { input, row_id, vector: DenseVectorBinding::vector_column(column) }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum VectorDistanceMetric {
L2Expanded,
L2SqrtExpanded,
CosineExpanded,
InnerProduct,
}
impl VectorDistanceMetric {
pub(crate) const fn as_str(self) -> &'static str {
match self {
Self::L2Expanded => "l2_expanded",
Self::L2SqrtExpanded => "l2_sqrt_expanded",
Self::CosineExpanded => "cosine_expanded",
Self::InnerProduct => "inner_product",
}
}
}
impl fmt::Display for VectorDistanceMetric {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}