use arrow_schema::Schema as ArrowSchema;
use datafusion::common::ToDFSchema;
use datafusion::prelude::{Expr, SessionContext};
use lance_core::{Error, Result};
mod block_list;
mod builder;
mod collector;
mod data_source;
pub mod exec;
pub(crate) mod flushed_cache;
mod fts_search;
mod planner;
mod point_lookup;
mod projection;
mod vector_search;
pub use block_list::write_pk_sidecar;
pub use builder::LsmScanner;
pub use collector::{
ActiveMemTableRef, InMemoryMemTableRef, InMemoryMemTables, LsmDataSourceCollector,
};
pub use data_source::{
FlushedGeneration, FreshTierWatermark, LsmDataSource, LsmGeneration, ShardSnapshot,
};
pub use flushed_cache::{DatasetCache, FlushedMemTableCache, GenerationWarmer};
pub use fts_search::{LsmFtsSearchPlanner, SCORE_COLUMN};
pub use point_lookup::LsmPointLookupPlanner;
pub use projection::DISTANCE_COLUMN;
pub use vector_search::LsmVectorSearchPlanner;
pub fn parse_filter_expr(schema: &ArrowSchema, filter_expr: &str) -> Result<Expr> {
let ctx = SessionContext::new();
let df_schema = schema
.clone()
.to_dfschema()
.map_err(|e| Error::invalid_input(format!("Failed to create DFSchema: {}", e)))?;
ctx.parse_sql_expr(filter_expr, &df_schema)
.map_err(|e| Error::invalid_input(format!("Failed to parse filter expression: {}", e)))
}
pub(crate) fn validate_overfetch_factor(factor: f64) -> Result<f64> {
if !factor.is_finite() || factor < 1.0 {
return Err(Error::invalid_input(format!(
"overfetch_factor must be finite and at least 1.0, got {}",
factor
)));
}
Ok(factor)
}