use std::sync::Arc;
use arrow_array::{types::Float32Type, FixedSizeListArray, RecordBatch};
use async_trait::async_trait;
use lance_core::{
io::{object_writer::ObjectWriter, Reader},
Result,
};
use lance_index::{vector::Query, Index};
use lance_linalg::MatrixView;
use nohash_hasher::IntMap;
use crate::index::{pb::Transform, prefilter::PreFilter};
#[async_trait]
#[allow(clippy::redundant_pub_crate)]
pub trait VectorIndex: Send + Sync + std::fmt::Debug + Index {
async fn search(&self, query: &Query, pre_filter: Arc<PreFilter>) -> Result<RecordBatch>;
fn is_loadable(&self) -> bool;
fn check_can_remap(&self) -> Result<()>;
async fn load(
&self,
reader: &dyn Reader,
offset: usize,
length: usize,
) -> Result<Box<dyn VectorIndex>>;
fn remap(&mut self, mapping: &IntMap<u64, Option<u64>>) -> Result<()>;
}
#[async_trait]
pub trait Transformer: std::fmt::Debug + Sync + Send {
async fn train(&mut self, data: &MatrixView<Float32Type>) -> Result<()>;
async fn transform(&self, data: &FixedSizeListArray) -> Result<FixedSizeListArray>;
async fn save(&self, writer: &mut ObjectWriter) -> Result<Transform>;
}