#[cfg(test)]
mod tests;
use crate::db::{
access::AccessPlan,
direction::Direction,
predicate::IndexPredicateCapability,
query::plan::{
AccessPlannedQuery, FieldSlot, OrderDirection, OrderSpec,
expr::{ProjectionSpec, projection_field_direct_field_name},
index_order_terms,
},
};
use crate::{
model::{
field::FieldModel,
index::{IndexKeyItem, IndexKeyItemsRef, IndexModel},
},
value::Value,
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(in crate::db) enum CoveringProjectionOrder {
IndexOrder(Direction),
PrimaryKeyOrder(Direction),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(in crate::db) struct CoveringProjectionContext {
pub(in crate::db) component_index: usize,
pub(in crate::db) prefix_len: usize,
pub(in crate::db) order_contract: CoveringProjectionOrder,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(in crate::db) enum CoveringReadFieldSource {
IndexComponent { component_index: usize },
PrimaryKey,
Constant(Value),
RowField,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(in crate::db) struct CoveringReadField {
pub(in crate::db) field_slot: FieldSlot,
pub(in crate::db) source: CoveringReadFieldSource,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(in crate::db) struct CoveringReadPlan {
pub(in crate::db) fields: Vec<CoveringReadField>,
pub(in crate::db) prefix_len: usize,
pub(in crate::db) order_contract: CoveringProjectionOrder,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(in crate::db) enum CoveringExistingRowMode {
ProvenByPlanner,
RequiresRowPresenceCheck,
}
impl CoveringExistingRowMode {
#[must_use]
pub(in crate::db) const fn requires_row_presence_check(self) -> bool {
matches!(self, Self::RequiresRowPresenceCheck)
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(in crate::db) struct CoveringReadExecutionPlan {
pub(in crate::db) fields: Vec<CoveringReadField>,
pub(in crate::db) prefix_len: usize,
pub(in crate::db) order_contract: CoveringProjectionOrder,
pub(in crate::db) existing_row_mode: CoveringExistingRowMode,
}
#[must_use]
pub(in crate::db) fn covering_strict_predicate_compatible(
plan: &AccessPlannedQuery,
predicate_index_capability: Option<IndexPredicateCapability>,
) -> bool {
!plan.has_residual_predicate()
|| predicate_index_capability == Some(IndexPredicateCapability::FullyIndexable)
}
#[must_use]
pub(in crate::db) fn covering_read_reason_code_for_load_plan(
plan: &AccessPlannedQuery,
strict_predicate_compatible: bool,
covering_read_selected: bool,
) -> &'static str {
if covering_read_selected {
return "cover_read_route";
}
if plan.scalar_plan().order.is_some() {
return "order_mat";
}
let index_shape_supported =
plan.access.as_index_prefix_path().is_some() || plan.access.as_index_range_path().is_some();
if !index_shape_supported {
return "access_not_cov";
}
if plan.has_residual_predicate() && !strict_predicate_compatible {
return "pred_not_strict";
}
if plan.scalar_plan().distinct {
return "distinct_mat";
}
"proj_not_cov"
}
#[must_use]
pub(in crate::db) fn index_covering_existing_rows_terminal_eligible(
plan: &AccessPlannedQuery,
strict_predicate_compatible: bool,
) -> bool {
if plan.scalar_plan().order.is_some() {
return false;
}
let index_shape_supported =
plan.access.as_index_prefix_path().is_some() || plan.access.as_index_range_path().is_some();
if !index_shape_supported {
return false;
}
if plan.scalar_plan().predicate.is_none() {
return true;
}
strict_predicate_compatible
}
#[must_use]
pub(in crate::db) fn covering_read_plan_from_fields(
fields: &[FieldModel],
plan: &AccessPlannedQuery,
primary_key_name: &'static str,
strict_predicate_compatible: bool,
) -> Option<CoveringReadPlan> {
let (metadata, order_contract) = prepare_covering_index_projection_plan(
plan,
primary_key_name,
strict_predicate_compatible,
)?;
let projection = plan.frozen_projection_spec();
let fields = covering_read_fields_from_projection(
fields,
projection,
metadata.coverable_component_fields.as_slice(),
primary_key_name,
&plan.access,
)?;
if fields.is_empty() {
return None;
}
Some(CoveringReadPlan {
fields,
prefix_len: metadata.prefix_len,
order_contract,
})
}
#[must_use]
pub(in crate::db) fn covering_hybrid_projection_plan_from_fields(
fields: &[FieldModel],
plan: &AccessPlannedQuery,
primary_key_name: &'static str,
) -> Option<CoveringReadPlan> {
let (metadata, order_contract) =
prepare_covering_index_projection_plan(plan, primary_key_name, false)?;
let fields = covering_hybrid_projection_fields_from_projection(
fields,
plan.frozen_projection_spec(),
metadata.coverable_component_fields.as_slice(),
primary_key_name,
&plan.access,
)?;
if fields.is_empty() {
return None;
}
if !fields
.iter()
.any(|field| matches!(field.source, CoveringReadFieldSource::RowField))
{
return None;
}
Some(CoveringReadPlan {
fields,
prefix_len: metadata.prefix_len,
order_contract,
})
}
#[must_use]
pub(in crate::db) fn covering_read_execution_plan_from_fields(
fields: &[FieldModel],
plan: &AccessPlannedQuery,
primary_key_name: &'static str,
strict_predicate_compatible: bool,
) -> Option<CoveringReadExecutionPlan> {
if let Some(covering) =
covering_read_plan_from_fields(fields, plan, primary_key_name, strict_predicate_compatible)
{
return Some(CoveringReadExecutionPlan {
fields: covering.fields,
prefix_len: covering.prefix_len,
order_contract: covering.order_contract,
existing_row_mode: CoveringExistingRowMode::ProvenByPlanner,
});
}
primary_store_covering_execution_plan(fields, plan, primary_key_name)
}
#[must_use]
pub(in crate::db) fn covering_index_projection_context<K>(
access: &AccessPlan<K>,
order: Option<&OrderSpec>,
target_field: &str,
primary_key_name: &'static str,
) -> Option<CoveringProjectionContext> {
let metadata = covering_access_metadata(access)?;
let order_terms = metadata.order_terms();
let component_index = metadata
.coverable_component_fields
.iter()
.position(|field| field.is_some_and(|field| field == target_field))?;
let order_contract = covering_projection_order_contract(
order,
order_terms.as_slice(),
metadata.prefix_len,
primary_key_name,
metadata.path_kind_is_range,
)?;
Some(CoveringProjectionContext {
component_index,
prefix_len: metadata.prefix_len,
order_contract,
})
}
#[must_use]
pub(in crate::db) fn constant_covering_projection_value_from_access<K>(
access: &AccessPlan<K>,
target_field: &str,
) -> Option<Value> {
let metadata = covering_access_metadata(access)?;
constant_covering_projection_value_from_prefix(
metadata.coverable_component_fields.as_slice(),
metadata.prefix_values,
target_field,
)
}
#[must_use]
pub(in crate::db) const fn covering_index_adjacent_distinct_eligible(
context: CoveringProjectionContext,
) -> bool {
matches!(
context.order_contract,
CoveringProjectionOrder::IndexOrder(_)
) && context.component_index == context.prefix_len
}
fn covering_projection_order_contract(
order: Option<&OrderSpec>,
index_order_terms: &[&str],
prefix_len: usize,
primary_key_name: &'static str,
path_kind_is_range: bool,
) -> Option<CoveringProjectionOrder> {
let Some(order) = order else {
return Some(CoveringProjectionOrder::PrimaryKeyOrder(Direction::Asc));
};
if let Some(direction) = order.primary_key_only_direction(primary_key_name) {
let direction = match direction {
OrderDirection::Asc => Direction::Asc,
OrderDirection::Desc => Direction::Desc,
};
return Some(CoveringProjectionOrder::PrimaryKeyOrder(direction));
}
let order_contract = order.deterministic_secondary_order_contract(primary_key_name)?;
let direction = match order_contract.direction() {
OrderDirection::Asc => Direction::Asc,
OrderDirection::Desc => Direction::Desc,
};
if order_contract.matches_index_suffix(index_order_terms, prefix_len) {
return Some(CoveringProjectionOrder::IndexOrder(direction));
}
if path_kind_is_range {
return None;
}
order_contract
.matches_index_full(index_order_terms)
.then_some(CoveringProjectionOrder::IndexOrder(direction))
}
fn primary_store_covering_execution_plan(
fields: &[FieldModel],
plan: &AccessPlannedQuery,
primary_key_name: &'static str,
) -> Option<CoveringReadExecutionPlan> {
if plan.grouped_plan().is_some()
|| !plan.scalar_plan().mode.is_load()
|| plan.scalar_plan().distinct
|| plan.has_residual_predicate()
{
return None;
}
let existing_row_mode = primary_store_covering_existing_row_mode(&plan.access)?;
let order_contract = covering_projection_order_contract(
plan.scalar_plan().order.as_ref(),
&[],
0,
primary_key_name,
false,
)?;
let fields = covering_read_fields_from_projection(
fields,
plan.frozen_projection_spec(),
&[],
primary_key_name,
&plan.access,
)?;
if fields.is_empty() {
return None;
}
if fields
.iter()
.any(|field| !matches!(field.source, CoveringReadFieldSource::PrimaryKey))
{
return None;
}
if !primary_store_covering_order_supported(&plan.access, order_contract) {
return None;
}
Some(CoveringReadExecutionPlan {
fields,
prefix_len: 0,
order_contract,
existing_row_mode,
})
}
fn constant_covering_projection_value_from_prefix(
coverable_component_fields: &[Option<&'static str>],
prefix_values: &[Value],
target_field: &str,
) -> Option<Value> {
coverable_component_fields
.iter()
.zip(prefix_values.iter())
.find_map(|(field, value)| {
field
.is_some_and(|field| field == target_field)
.then(|| value.clone())
})
}
struct CoveringAccessMetadata<'a> {
order_terms: Vec<String>,
coverable_component_fields: Vec<Option<&'static str>>,
prefix_values: &'a [Value],
prefix_len: usize,
path_kind_is_range: bool,
}
fn covering_access_metadata<K>(access: &AccessPlan<K>) -> Option<CoveringAccessMetadata<'_>> {
if let Some((index, values)) = access.as_index_prefix_path() {
return Some(CoveringAccessMetadata {
order_terms: index_order_terms(index),
coverable_component_fields: coverable_component_fields_for_index(index),
prefix_values: values,
prefix_len: values.len(),
path_kind_is_range: false,
});
}
if let Some((index, prefix_values, _, _)) = access.as_index_range_path() {
return Some(CoveringAccessMetadata {
order_terms: index_order_terms(index),
coverable_component_fields: coverable_component_fields_for_index(index),
prefix_values,
prefix_len: prefix_values.len(),
path_kind_is_range: true,
});
}
None
}
impl CoveringAccessMetadata<'_> {
fn order_terms(&self) -> Vec<&str> {
self.order_terms.iter().map(String::as_str).collect()
}
}
fn prepare_covering_index_projection_plan<'a>(
plan: &'a AccessPlannedQuery,
primary_key_name: &'static str,
residual_predicate_supported: bool,
) -> Option<(CoveringAccessMetadata<'a>, CoveringProjectionOrder)> {
if plan.grouped_plan().is_some() || !plan.scalar_plan().mode.is_load() {
return None;
}
if plan.has_residual_predicate() && !residual_predicate_supported {
return None;
}
let metadata = covering_access_metadata(&plan.access)?;
let order_terms = metadata.order_terms();
let order_contract = covering_projection_order_contract(
plan.scalar_plan().order.as_ref(),
order_terms.as_slice(),
metadata.prefix_len,
primary_key_name,
metadata.path_kind_is_range,
)?;
Some((metadata, order_contract))
}
fn primary_store_covering_existing_row_mode<K>(
access: &AccessPlan<K>,
) -> Option<CoveringExistingRowMode> {
let path = access.as_path()?;
if path.is_primary_store_authoritative_scan() {
return Some(CoveringExistingRowMode::ProvenByPlanner);
}
path.is_primary_key_lookup()
.then_some(CoveringExistingRowMode::RequiresRowPresenceCheck)
}
fn primary_store_covering_order_supported<K>(
access: &AccessPlan<K>,
order_contract: CoveringProjectionOrder,
) -> bool {
let Some(path) = access.as_path() else {
return false;
};
if path.is_primary_store_authoritative_scan() {
return true;
}
if path.is_by_key() {
return matches!(order_contract, CoveringProjectionOrder::PrimaryKeyOrder(_));
}
path.as_by_keys().is_some_and(|_| {
matches!(
order_contract,
CoveringProjectionOrder::PrimaryKeyOrder(Direction::Asc)
)
})
}
fn covering_read_fields_from_projection(
fields: &[FieldModel],
projection: &ProjectionSpec,
coverable_component_fields: &[Option<&'static str>],
primary_key_name: &'static str,
access: &AccessPlan<Value>,
) -> Option<Vec<CoveringReadField>> {
covering_projection_fields_from_projection(
fields,
projection,
coverable_component_fields,
primary_key_name,
access,
covering_read_field_source,
)
}
fn covering_hybrid_projection_fields_from_projection(
fields: &[FieldModel],
projection: &ProjectionSpec,
coverable_component_fields: &[Option<&'static str>],
primary_key_name: &'static str,
access: &AccessPlan<Value>,
) -> Option<Vec<CoveringReadField>> {
covering_projection_fields_from_projection(
fields,
projection,
coverable_component_fields,
primary_key_name,
access,
|field_name, coverable_component_fields, primary_key_name, access| {
Some(covering_hybrid_projection_field_source(
field_name,
coverable_component_fields,
primary_key_name,
access,
))
},
)
}
fn covering_projection_fields_from_projection<F>(
fields: &[FieldModel],
projection: &ProjectionSpec,
coverable_component_fields: &[Option<&'static str>],
primary_key_name: &'static str,
access: &AccessPlan<Value>,
resolve_source: F,
) -> Option<Vec<CoveringReadField>>
where
F: Fn(
&str,
&[Option<&'static str>],
&'static str,
&AccessPlan<Value>,
) -> Option<CoveringReadFieldSource>,
{
let mut projection_fields = Vec::with_capacity(projection.len());
for projection_field in projection.fields() {
let field_name = projection_field_direct_field_name(projection_field)?;
let field_slot = resolve_covering_field_slot(fields, field_name)?;
let source = resolve_source(
field_name,
coverable_component_fields,
primary_key_name,
access,
)?;
projection_fields.push(CoveringReadField { field_slot, source });
}
Some(projection_fields)
}
fn resolve_covering_field_slot(fields: &[FieldModel], field_name: &str) -> Option<FieldSlot> {
let (index, field) = fields
.iter()
.enumerate()
.find(|(_, field)| field.name() == field_name)?;
Some(FieldSlot {
index,
field: field.name().to_string(),
kind: Some(field.kind()),
})
}
fn covering_read_field_source(
field_name: &str,
coverable_component_fields: &[Option<&'static str>],
primary_key_name: &'static str,
access: &AccessPlan<Value>,
) -> Option<CoveringReadFieldSource> {
if field_name == primary_key_name {
return Some(CoveringReadFieldSource::PrimaryKey);
}
if let Some(value) = constant_covering_projection_value_from_access(access, field_name) {
return Some(CoveringReadFieldSource::Constant(value));
}
coverable_component_fields
.iter()
.position(|field| field.is_some_and(|field| field == field_name))
.map(|component_index| CoveringReadFieldSource::IndexComponent { component_index })
}
fn covering_hybrid_projection_field_source(
field_name: &str,
coverable_component_fields: &[Option<&'static str>],
primary_key_name: &'static str,
access: &AccessPlan<Value>,
) -> CoveringReadFieldSource {
if let Some(source) = covering_read_field_source(
field_name,
coverable_component_fields,
primary_key_name,
access,
) {
return source;
}
CoveringReadFieldSource::RowField
}
fn coverable_component_fields_for_index(index: &IndexModel) -> Vec<Option<&'static str>> {
match index.key_items() {
IndexKeyItemsRef::Fields(fields) => fields.iter().copied().map(Some).collect(),
IndexKeyItemsRef::Items(items) => items
.iter()
.map(|item| match item {
IndexKeyItem::Field(field) => Some(*field),
IndexKeyItem::Expression(_) => None,
})
.collect(),
}
}