mod compare;
mod index_select;
mod predicate;
mod prefix;
mod range;
#[cfg(test)]
mod tests;
use crate::{
db::{
access::{AccessPlan, normalize_access_plan_value},
predicate::Predicate,
query::plan::PlanError,
schema::SchemaInfo,
},
error::InternalError,
model::entity::EntityModel,
value::Value,
};
use thiserror::Error as ThisError;
pub(in crate::db::query::plan) use index_select::{
index_literal_matches_schema, sorted_indexes, sorted_model_indexes,
};
#[derive(Debug, ThisError)]
pub enum PlannerError {
#[error("{0}")]
Plan(Box<PlanError>),
#[error("{0}")]
Internal(Box<InternalError>),
}
impl From<PlanError> for PlannerError {
fn from(err: PlanError) -> Self {
Self::Plan(Box::new(err))
}
}
impl From<InternalError> for PlannerError {
fn from(err: InternalError) -> Self {
Self::Internal(Box::new(err))
}
}
pub(crate) fn plan_access(
model: &EntityModel,
schema: &SchemaInfo,
predicate: Option<&Predicate>,
) -> Result<AccessPlan<Value>, PlannerError> {
let Some(predicate) = predicate else {
return Ok(AccessPlan::full_scan());
};
let plan = normalize_access_plan_value(predicate::plan_predicate(
model, schema, predicate, predicate,
)?);
Ok(plan)
}