use std::collections::HashMap;
use crate::core::{DataType, IndexEntry, IndexType, Operator, Result, Value};
use crate::storage::expression::Expression;
pub trait Index: Send + Sync {
fn name(&self) -> &str;
fn table_name(&self) -> &str;
fn build(&mut self) -> Result<()>;
fn add(&self, values: &[Value], row_id: i64, ref_id: i64) -> Result<()>;
fn add_batch(&self, entries: &HashMap<i64, Vec<Value>>) -> Result<()>;
fn remove(&self, values: &[Value], row_id: i64, ref_id: i64) -> Result<()>;
fn remove_batch(&self, entries: &HashMap<i64, Vec<Value>>) -> Result<()>;
fn column_ids(&self) -> &[i32];
fn column_names(&self) -> &[String];
fn data_types(&self) -> &[DataType];
fn index_type(&self) -> IndexType;
fn is_unique(&self) -> bool;
fn find(&self, values: &[Value]) -> Result<Vec<IndexEntry>>;
fn find_range(
&self,
min: &[Value],
max: &[Value],
min_inclusive: bool,
max_inclusive: bool,
) -> Result<Vec<IndexEntry>>;
fn find_with_operator(&self, op: Operator, values: &[Value]) -> Result<Vec<IndexEntry>>;
fn get_row_ids_equal(&self, values: &[Value]) -> Vec<i64>;
fn get_row_ids_in_range(
&self,
min_value: &[Value],
max_value: &[Value],
include_min: bool,
include_max: bool,
) -> Vec<i64>;
fn get_row_ids_in(&self, value_list: &[Value]) -> Vec<i64> {
let mut results = Vec::new();
for value in value_list {
results.extend(self.get_row_ids_equal(std::slice::from_ref(value)));
}
results
}
fn get_filtered_row_ids(&self, expr: &dyn Expression) -> Vec<i64>;
fn get_min_value(&self) -> Option<Value> {
None }
fn get_max_value(&self) -> Option<Value> {
None }
fn get_all_values(&self) -> Vec<Value> {
Vec::new() }
fn get_row_ids_ordered(
&self,
_ascending: bool,
_limit: usize,
_offset: usize,
) -> Option<Vec<i64>> {
None }
fn close(&mut self) -> Result<()>;
}
#[cfg(test)]
mod tests {
use super::*;
fn _assert_object_safe(_: &dyn Index) {}
}